Merge branch 'master' of /home/opensim/var/repo/opensim
Conflicts: OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveWriteRequest.cs OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.csiar_mods
commit
e2e8a33a1c
|
@ -2,13 +2,37 @@
|
||||||
<!-- please leave the top comment for us emacs folks -->
|
<!-- please leave the top comment for us emacs folks -->
|
||||||
<property name="nunitcmd" value="nunit-console" />
|
<property name="nunitcmd" value="nunit-console" />
|
||||||
|
|
||||||
<!-- For safety/laziness sake, we're going to take the approach of deleting known extraneous files here rather than
|
<!-- This target produces a source distribution of OpenSimulator -->
|
||||||
trying to copy across only the essential ones -->
|
<!-- TODO: A few parameters still need to be tweaked after running this - need to do this automatically with sed or similar -->
|
||||||
<property name="distbindir" value="distbin" />
|
<target name="distsrc">
|
||||||
<target name="distbin">
|
|
||||||
<copy file="bin/OpenSim.ini.example" tofile="bin/OpenSim.ini"/>
|
<copy file="bin/OpenSim.ini.example" tofile="bin/OpenSim.ini"/>
|
||||||
<copy file="bin/config-include/StandaloneCommon.ini.example" tofile="bin/config-include/StandaloneCommon.ini"/>
|
<copy file="bin/config-include/StandaloneCommon.ini.example" tofile="bin/config-include/StandaloneCommon.ini"/>
|
||||||
<copy file="bin/config-include/FlotsamCache.ini.example" tofile="bin/config-include/FlotsamCache.ini"/>
|
<copy file="bin/config-include/FlotsamCache.ini.example" tofile="bin/config-include/FlotsamCache.ini"/>
|
||||||
|
<!-- delete files generated by runprebuild.sh which had to be run in order to generate the build file for this target-->
|
||||||
|
<delete>
|
||||||
|
<fileset basedir="OpenSim">
|
||||||
|
<include name="**/*.build"/>
|
||||||
|
<include name="**/*.csproj*"/>
|
||||||
|
<include name="**/*.dll.build"/>
|
||||||
|
<include name="**/*.pidb"/>
|
||||||
|
<exclude name="Tools/OpenSim.32BitLaunch/**"/>
|
||||||
|
<exclude name="Tools/Robust.32BitLaunch/**"/>
|
||||||
|
<exclude name="Tools/LaunchSLClient/**"/>
|
||||||
|
</fileset>
|
||||||
|
</delete>
|
||||||
|
<delete>
|
||||||
|
<fileset>
|
||||||
|
<include name="OpenSim.build"/>
|
||||||
|
<include name="OpenSim.sln"/>
|
||||||
|
</fileset>
|
||||||
|
</delete>
|
||||||
|
</target>
|
||||||
|
|
||||||
|
<property name="distbindir" value="distbin" />
|
||||||
|
<!-- This target produces a binary directory called distbin/ in OpenSim/bin which contains everything needed for binary distribution -->
|
||||||
|
<!-- For safety/laziness sake, we're going to take the approach of deleting known extraneous files here rather than
|
||||||
|
trying to copy across only the essential ones -->
|
||||||
|
<target name="distbin">
|
||||||
<delete dir="${distbindir}"/>
|
<delete dir="${distbindir}"/>
|
||||||
<copy todir="${distbindir}">
|
<copy todir="${distbindir}">
|
||||||
<fileset>
|
<fileset>
|
||||||
|
|
|
@ -86,6 +86,7 @@ what it is today.
|
||||||
* Grumly57
|
* Grumly57
|
||||||
* GuduleLapointe
|
* GuduleLapointe
|
||||||
* Ewe Loon
|
* Ewe Loon
|
||||||
|
* Fernando Oliveira
|
||||||
* Fly-Man
|
* Fly-Man
|
||||||
* Flyte Xevious
|
* Flyte Xevious
|
||||||
* Imaze Rhiano
|
* Imaze Rhiano
|
||||||
|
@ -135,6 +136,7 @@ what it is today.
|
||||||
* Ruud Lathorp
|
* Ruud Lathorp
|
||||||
* SachaMagne
|
* SachaMagne
|
||||||
* Salahzar Stenvaag
|
* Salahzar Stenvaag
|
||||||
|
* satguru p srivastava
|
||||||
* sempuki
|
* sempuki
|
||||||
* SignpostMarv
|
* SignpostMarv
|
||||||
* SpotOn3D
|
* SpotOn3D
|
||||||
|
|
|
@ -89,5 +89,11 @@ namespace OpenSim.Data.MSSQL
|
||||||
return DoQuery(cmd);
|
return DoQuery(cmd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public FriendsData[] GetFriends(Guid principalID)
|
||||||
|
{
|
||||||
|
return GetFriends(principalID.ToString());
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -813,7 +813,7 @@ namespace OpenSim.Data.MSSQL
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
using (SqlCommand command = new SqlCommand("DELETE FROM inventoryfolders WHERE folderID=@folderID", connection))
|
using (SqlCommand command = new SqlCommand("DELETE FROM inventoryfolders WHERE folderID=@folderID and type=-1", connection))
|
||||||
{
|
{
|
||||||
command.Parameters.Add(database.CreateParameter("folderID", folderID));
|
command.Parameters.Add(database.CreateParameter("folderID", folderID));
|
||||||
|
|
||||||
|
|
|
@ -675,7 +675,7 @@ VALUES
|
||||||
cmd.ExecuteNonQuery();
|
cmd.ExecuteNonQuery();
|
||||||
}
|
}
|
||||||
|
|
||||||
sql = "INSERT INTO [landaccesslist] ([LandUUID],[AccessUUID],[Flags]) VALUES (@LandUUID,@AccessUUID,@Flags)";
|
sql = "INSERT INTO [landaccesslist] ([LandUUID],[AccessUUID],[Flags],[Expires]) VALUES (@LandUUID,@AccessUUID,@Flags,@Expires)";
|
||||||
|
|
||||||
using (SqlConnection conn = new SqlConnection(m_connectionString))
|
using (SqlConnection conn = new SqlConnection(m_connectionString))
|
||||||
using (SqlCommand cmd = new SqlCommand(sql, conn))
|
using (SqlCommand cmd = new SqlCommand(sql, conn))
|
||||||
|
@ -1215,6 +1215,8 @@ VALUES
|
||||||
//Store new values
|
//Store new values
|
||||||
StoreNewRegionSettings(regionSettings);
|
StoreNewRegionSettings(regionSettings);
|
||||||
|
|
||||||
|
LoadSpawnPoints(regionSettings);
|
||||||
|
|
||||||
return regionSettings;
|
return regionSettings;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1252,7 +1254,7 @@ VALUES
|
||||||
,[elevation_1_ne] = @elevation_1_ne ,[elevation_2_ne] = @elevation_2_ne ,[elevation_1_se] = @elevation_1_se ,[elevation_2_se] = @elevation_2_se
|
,[elevation_1_ne] = @elevation_1_ne ,[elevation_2_ne] = @elevation_2_ne ,[elevation_1_se] = @elevation_1_se ,[elevation_2_se] = @elevation_2_se
|
||||||
,[elevation_1_sw] = @elevation_1_sw ,[elevation_2_sw] = @elevation_2_sw ,[water_height] = @water_height ,[terrain_raise_limit] = @terrain_raise_limit
|
,[elevation_1_sw] = @elevation_1_sw ,[elevation_2_sw] = @elevation_2_sw ,[water_height] = @water_height ,[terrain_raise_limit] = @terrain_raise_limit
|
||||||
,[terrain_lower_limit] = @terrain_lower_limit ,[use_estate_sun] = @use_estate_sun ,[fixed_sun] = @fixed_sun ,[sun_position] = @sun_position
|
,[terrain_lower_limit] = @terrain_lower_limit ,[use_estate_sun] = @use_estate_sun ,[fixed_sun] = @fixed_sun ,[sun_position] = @sun_position
|
||||||
,[covenant] = @covenant ,[covenant_datetime] = @covenant_datetime, [sunvectorx] = @sunvectorx, [sunvectory] = @sunvectory, [sunvectorz] = @sunvectorz, [Sandbox] = @Sandbox, [loaded_creation_datetime] = @loaded_creation_datetime, [loaded_creation_id] = @loaded_creation_id
|
,[covenant] = @covenant ,[covenant_datetime] = @covenant_datetime, [sunvectorx] = @sunvectorx, [sunvectory] = @sunvectory, [sunvectorz] = @sunvectorz, [Sandbox] = @Sandbox, [loaded_creation_datetime] = @loaded_creation_datetime, [loaded_creation_id] = @loaded_creation_id, [map_tile_id] = @TerrainImageID, [telehubobject] = @telehubobject, [parcel_tile_id] = @ParcelImageID
|
||||||
WHERE [regionUUID] = @regionUUID";
|
WHERE [regionUUID] = @regionUUID";
|
||||||
|
|
||||||
using (SqlConnection conn = new SqlConnection(m_connectionString))
|
using (SqlConnection conn = new SqlConnection(m_connectionString))
|
||||||
|
@ -1263,6 +1265,7 @@ VALUES
|
||||||
cmd.ExecuteNonQuery();
|
cmd.ExecuteNonQuery();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
SaveSpawnPoints(regionSettings);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Shutdown()
|
public void Shutdown()
|
||||||
|
@ -1367,7 +1370,7 @@ VALUES
|
||||||
newSettings.TerrainRaiseLimit = Convert.ToDouble(row["terrain_raise_limit"]);
|
newSettings.TerrainRaiseLimit = Convert.ToDouble(row["terrain_raise_limit"]);
|
||||||
newSettings.TerrainLowerLimit = Convert.ToDouble(row["terrain_lower_limit"]);
|
newSettings.TerrainLowerLimit = Convert.ToDouble(row["terrain_lower_limit"]);
|
||||||
newSettings.UseEstateSun = Convert.ToBoolean(row["use_estate_sun"]);
|
newSettings.UseEstateSun = Convert.ToBoolean(row["use_estate_sun"]);
|
||||||
newSettings.Sandbox = Convert.ToBoolean(row["sandbox"]);
|
newSettings.Sandbox = Convert.ToBoolean(row["Sandbox"]);
|
||||||
newSettings.FixedSun = Convert.ToBoolean(row["fixed_sun"]);
|
newSettings.FixedSun = Convert.ToBoolean(row["fixed_sun"]);
|
||||||
newSettings.SunPosition = Convert.ToDouble(row["sun_position"]);
|
newSettings.SunPosition = Convert.ToDouble(row["sun_position"]);
|
||||||
newSettings.SunVector = new Vector3(
|
newSettings.SunVector = new Vector3(
|
||||||
|
@ -1383,6 +1386,11 @@ VALUES
|
||||||
newSettings.LoadedCreationID = "";
|
newSettings.LoadedCreationID = "";
|
||||||
else
|
else
|
||||||
newSettings.LoadedCreationID = (String)row["loaded_creation_id"];
|
newSettings.LoadedCreationID = (String)row["loaded_creation_id"];
|
||||||
|
|
||||||
|
newSettings.TerrainImageID = new UUID((string)row["map_tile_ID"]);
|
||||||
|
newSettings.ParcelImageID = new UUID((Guid)row["parcel_tile_ID"]);
|
||||||
|
newSettings.TelehubObject = new UUID((Guid)row["TelehubObject"]);
|
||||||
|
|
||||||
return newSettings;
|
return newSettings;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1454,6 +1462,13 @@ VALUES
|
||||||
}
|
}
|
||||||
|
|
||||||
newData.ParcelAccessList = new List<LandAccessEntry>();
|
newData.ParcelAccessList = new List<LandAccessEntry>();
|
||||||
|
newData.MediaDescription = (string)row["MediaDescription"];
|
||||||
|
newData.MediaType = (string)row["MediaType"];
|
||||||
|
newData.MediaWidth = Convert.ToInt32((((string)row["MediaSize"]).Split(','))[0]);
|
||||||
|
newData.MediaHeight = Convert.ToInt32((((string)row["MediaSize"]).Split(','))[1]);
|
||||||
|
newData.MediaLoop = Convert.ToBoolean(row["MediaLoop"]);
|
||||||
|
newData.ObscureMusic = Convert.ToBoolean(row["ObscureMusic"]);
|
||||||
|
newData.ObscureMedia = Convert.ToBoolean(row["ObscureMedia"]);
|
||||||
|
|
||||||
return newData;
|
return newData;
|
||||||
}
|
}
|
||||||
|
@ -1468,7 +1483,7 @@ VALUES
|
||||||
LandAccessEntry entry = new LandAccessEntry();
|
LandAccessEntry entry = new LandAccessEntry();
|
||||||
entry.AgentID = new UUID((Guid)row["AccessUUID"]);
|
entry.AgentID = new UUID((Guid)row["AccessUUID"]);
|
||||||
entry.Flags = (AccessList)Convert.ToInt32(row["Flags"]);
|
entry.Flags = (AccessList)Convert.ToInt32(row["Flags"]);
|
||||||
entry.Expires = 0;
|
entry.Expires = Convert.ToInt32(row["Expires"]);
|
||||||
return entry;
|
return entry;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1497,7 +1512,8 @@ VALUES
|
||||||
prim.TouchName = (string)primRow["TouchName"];
|
prim.TouchName = (string)primRow["TouchName"];
|
||||||
// permissions
|
// permissions
|
||||||
prim.Flags = (PrimFlags)Convert.ToUInt32(primRow["ObjectFlags"]);
|
prim.Flags = (PrimFlags)Convert.ToUInt32(primRow["ObjectFlags"]);
|
||||||
prim.CreatorID = new UUID((Guid)primRow["CreatorID"]);
|
//prim.CreatorID = new UUID((Guid)primRow["CreatorID"]);
|
||||||
|
prim.CreatorIdentification = (string)primRow["CreatorID"];
|
||||||
prim.OwnerID = new UUID((Guid)primRow["OwnerID"]);
|
prim.OwnerID = new UUID((Guid)primRow["OwnerID"]);
|
||||||
prim.GroupID = new UUID((Guid)primRow["GroupID"]);
|
prim.GroupID = new UUID((Guid)primRow["GroupID"]);
|
||||||
prim.LastOwnerID = new UUID((Guid)primRow["LastOwnerID"]);
|
prim.LastOwnerID = new UUID((Guid)primRow["LastOwnerID"]);
|
||||||
|
@ -1691,7 +1707,8 @@ VALUES
|
||||||
taskItem.Name = (string)inventoryRow["name"];
|
taskItem.Name = (string)inventoryRow["name"];
|
||||||
taskItem.Description = (string)inventoryRow["description"];
|
taskItem.Description = (string)inventoryRow["description"];
|
||||||
taskItem.CreationDate = Convert.ToUInt32(inventoryRow["creationDate"]);
|
taskItem.CreationDate = Convert.ToUInt32(inventoryRow["creationDate"]);
|
||||||
taskItem.CreatorID = new UUID((Guid)inventoryRow["creatorID"]);
|
//taskItem.CreatorID = new UUID((Guid)inventoryRow["creatorID"]);
|
||||||
|
taskItem.CreatorIdentification = (string)inventoryRow["creatorID"];
|
||||||
taskItem.OwnerID = new UUID((Guid)inventoryRow["ownerID"]);
|
taskItem.OwnerID = new UUID((Guid)inventoryRow["ownerID"]);
|
||||||
taskItem.LastOwnerID = new UUID((Guid)inventoryRow["lastOwnerID"]);
|
taskItem.LastOwnerID = new UUID((Guid)inventoryRow["lastOwnerID"]);
|
||||||
taskItem.GroupID = new UUID((Guid)inventoryRow["groupID"]);
|
taskItem.GroupID = new UUID((Guid)inventoryRow["groupID"]);
|
||||||
|
@ -1782,7 +1799,7 @@ VALUES
|
||||||
parameters.Add(_Database.CreateParameter("terrain_raise_limit", settings.TerrainRaiseLimit));
|
parameters.Add(_Database.CreateParameter("terrain_raise_limit", settings.TerrainRaiseLimit));
|
||||||
parameters.Add(_Database.CreateParameter("terrain_lower_limit", settings.TerrainLowerLimit));
|
parameters.Add(_Database.CreateParameter("terrain_lower_limit", settings.TerrainLowerLimit));
|
||||||
parameters.Add(_Database.CreateParameter("use_estate_sun", settings.UseEstateSun));
|
parameters.Add(_Database.CreateParameter("use_estate_sun", settings.UseEstateSun));
|
||||||
parameters.Add(_Database.CreateParameter("sandbox", settings.Sandbox));
|
parameters.Add(_Database.CreateParameter("Sandbox", settings.Sandbox));
|
||||||
parameters.Add(_Database.CreateParameter("fixed_sun", settings.FixedSun));
|
parameters.Add(_Database.CreateParameter("fixed_sun", settings.FixedSun));
|
||||||
parameters.Add(_Database.CreateParameter("sun_position", settings.SunPosition));
|
parameters.Add(_Database.CreateParameter("sun_position", settings.SunPosition));
|
||||||
parameters.Add(_Database.CreateParameter("sunvectorx", settings.SunVector.X));
|
parameters.Add(_Database.CreateParameter("sunvectorx", settings.SunVector.X));
|
||||||
|
@ -1792,6 +1809,9 @@ VALUES
|
||||||
parameters.Add(_Database.CreateParameter("covenant_datetime", settings.CovenantChangedDateTime));
|
parameters.Add(_Database.CreateParameter("covenant_datetime", settings.CovenantChangedDateTime));
|
||||||
parameters.Add(_Database.CreateParameter("Loaded_Creation_DateTime", settings.LoadedCreationDateTime));
|
parameters.Add(_Database.CreateParameter("Loaded_Creation_DateTime", settings.LoadedCreationDateTime));
|
||||||
parameters.Add(_Database.CreateParameter("Loaded_Creation_ID", settings.LoadedCreationID));
|
parameters.Add(_Database.CreateParameter("Loaded_Creation_ID", settings.LoadedCreationID));
|
||||||
|
parameters.Add(_Database.CreateParameter("TerrainImageID", settings.TerrainImageID));
|
||||||
|
parameters.Add(_Database.CreateParameter("ParcelImageID", settings.ParcelImageID));
|
||||||
|
parameters.Add(_Database.CreateParameter("TelehubObject", settings.TelehubObject));
|
||||||
|
|
||||||
return parameters.ToArray();
|
return parameters.ToArray();
|
||||||
}
|
}
|
||||||
|
@ -1859,6 +1879,7 @@ VALUES
|
||||||
parameters.Add(_Database.CreateParameter("LandUUID", parcelID));
|
parameters.Add(_Database.CreateParameter("LandUUID", parcelID));
|
||||||
parameters.Add(_Database.CreateParameter("AccessUUID", parcelAccessEntry.AgentID));
|
parameters.Add(_Database.CreateParameter("AccessUUID", parcelAccessEntry.AgentID));
|
||||||
parameters.Add(_Database.CreateParameter("Flags", parcelAccessEntry.Flags));
|
parameters.Add(_Database.CreateParameter("Flags", parcelAccessEntry.Flags));
|
||||||
|
parameters.Add(_Database.CreateParameter("Expires", parcelAccessEntry.Expires));
|
||||||
|
|
||||||
return parameters.ToArray();
|
return parameters.ToArray();
|
||||||
}
|
}
|
||||||
|
@ -2063,5 +2084,57 @@ VALUES
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
private void LoadSpawnPoints(RegionSettings rs)
|
||||||
|
{
|
||||||
|
rs.ClearSpawnPoints();
|
||||||
|
|
||||||
|
string sql = "SELECT Yaw, Pitch, Distance FROM spawn_points WHERE RegionUUID = @RegionUUID";
|
||||||
|
using (SqlConnection conn = new SqlConnection(m_connectionString))
|
||||||
|
using (SqlCommand cmd = new SqlCommand(sql, conn))
|
||||||
|
{
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("@RegionUUID", rs.RegionUUID.ToString()));
|
||||||
|
conn.Open();
|
||||||
|
using (SqlDataReader reader = cmd.ExecuteReader())
|
||||||
|
{
|
||||||
|
if (reader.Read())
|
||||||
|
{
|
||||||
|
SpawnPoint sp = new SpawnPoint();
|
||||||
|
|
||||||
|
sp.Yaw = (float)reader["Yaw"];
|
||||||
|
sp.Pitch = (float)reader["Pitch"];
|
||||||
|
sp.Distance = (float)reader["Distance"];
|
||||||
|
|
||||||
|
rs.AddSpawnPoint(sp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SaveSpawnPoints(RegionSettings rs)
|
||||||
|
{
|
||||||
|
string sql = "DELETE FROM spawn_points WHERE RegionUUID = @RegionUUID";
|
||||||
|
using (SqlConnection conn = new SqlConnection(m_connectionString))
|
||||||
|
using (SqlCommand cmd = new SqlCommand(sql, conn))
|
||||||
|
{
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("@RegionUUID", rs.RegionUUID));
|
||||||
|
conn.Open();
|
||||||
|
cmd.ExecuteNonQuery();
|
||||||
|
}
|
||||||
|
foreach (SpawnPoint p in rs.SpawnPoints())
|
||||||
|
{
|
||||||
|
sql = "INSERT INTO spawn_points (RegionUUID, Yaw, Pitch, Distance) VALUES (@RegionUUID, @Yaw, @Pitch, @Distance)";
|
||||||
|
using (SqlConnection conn = new SqlConnection(m_connectionString))
|
||||||
|
using (SqlCommand cmd = new SqlCommand(sql, conn))
|
||||||
|
{
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("@RegionUUID", rs.RegionUUID));
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("@Yaw", p.Yaw));
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("@Pitch", p.Pitch));
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("@Distance", p.Distance));
|
||||||
|
conn.Open();
|
||||||
|
cmd.ExecuteNonQuery();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1044,10 +1044,93 @@ ALTER TABLE primitems ALTER COLUMN CreatorID uniqueidentifier NOT NULL
|
||||||
|
|
||||||
COMMIT
|
COMMIT
|
||||||
|
|
||||||
:VERSION 29 #---------------------
|
:VERSION 29 #----------------- Region Covenant changed time
|
||||||
|
|
||||||
BEGIN TRANSACTION
|
BEGIN TRANSACTION
|
||||||
|
|
||||||
ALTER TABLE regionsettings ADD covenant_datetime int NOT NULL default 0
|
ALTER TABLE regionsettings ADD covenant_datetime int NOT NULL default 0
|
||||||
|
|
||||||
COMMIT
|
COMMIT
|
||||||
|
|
||||||
|
:VERSION 30 #------------------Migrate creatorID storage to varchars instead of UUIDs for HG support
|
||||||
|
|
||||||
|
BEGIN TRANSACTION
|
||||||
|
|
||||||
|
EXECUTE sp_rename N'dbo.prims.creatorid', N'creatoridold', 'COLUMN'
|
||||||
|
EXECUTE sp_rename N'dbo.primitems.creatorid', N'creatoridold', 'COLUMN'
|
||||||
|
|
||||||
|
COMMIT
|
||||||
|
|
||||||
|
:VERSION 31 #---------------------
|
||||||
|
|
||||||
|
BEGIN TRANSACTION
|
||||||
|
|
||||||
|
ALTER TABLE prims ADD CreatorID varchar(255)
|
||||||
|
ALTER TABLE primitems ADD CreatorID varchar(255)
|
||||||
|
|
||||||
|
COMMIT
|
||||||
|
|
||||||
|
:VERSION 32 #---------------------
|
||||||
|
|
||||||
|
BEGIN TRANSACTION
|
||||||
|
|
||||||
|
UPDATE prims SET prims.CreatorID = CONVERT(varchar(255), creatoridold)
|
||||||
|
UPDATE primitems SET primitems.CreatorID = CONVERT(varchar(255), creatoridold)
|
||||||
|
|
||||||
|
COMMIT
|
||||||
|
|
||||||
|
:VERSION 33 #---------------------
|
||||||
|
|
||||||
|
BEGIN TRANSACTION
|
||||||
|
|
||||||
|
ALTER TABLE prims
|
||||||
|
ADD CONSTRAINT DF_prims_CreatorIDNew
|
||||||
|
DEFAULT '00000000-0000-0000-0000-000000000000'
|
||||||
|
FOR CreatorID
|
||||||
|
|
||||||
|
ALTER TABLE prims ALTER COLUMN CreatorID varchar(255) NOT NULL
|
||||||
|
|
||||||
|
ALTER TABLE primitems
|
||||||
|
ADD CONSTRAINT DF_primitems_CreatorIDNew
|
||||||
|
DEFAULT '00000000-0000-0000-0000-000000000000'
|
||||||
|
FOR CreatorID
|
||||||
|
|
||||||
|
ALTER TABLE primitems ALTER COLUMN CreatorID varchar(255) NOT NULL
|
||||||
|
|
||||||
|
COMMIT
|
||||||
|
|
||||||
|
:VERSION 34 #--------------- Telehub support
|
||||||
|
|
||||||
|
BEGIN TRANSACTION
|
||||||
|
|
||||||
|
CREATE TABLE [dbo].[Spawn_Points](
|
||||||
|
[RegionUUID] [uniqueidentifier] NOT NULL,
|
||||||
|
[Yaw] [float] NOT NULL,
|
||||||
|
[Pitch] [float] NOT NULL,
|
||||||
|
[Distance] [float] NOT NULL,
|
||||||
|
PRIMARY KEY CLUSTERED
|
||||||
|
(
|
||||||
|
[RegionUUID] ASC
|
||||||
|
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
|
||||||
|
) ON [PRIMARY]
|
||||||
|
|
||||||
|
ALTER TABLE regionsettings ADD TelehubObject uniqueidentifier NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000';
|
||||||
|
|
||||||
|
COMMIT
|
||||||
|
|
||||||
|
:VERSION 35 #---------------- Parcels for sale
|
||||||
|
|
||||||
|
BEGIN TRANSACTION
|
||||||
|
|
||||||
|
ALTER TABLE regionsettings ADD parcel_tile_ID uniqueidentifier NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000';
|
||||||
|
|
||||||
|
COMMIT
|
||||||
|
|
||||||
|
:VERSION 36 #---------------- Timed bans/access
|
||||||
|
|
||||||
|
BEGIN TRANSACTION
|
||||||
|
|
||||||
|
ALTER TABLE landaccesslist ADD Expires integer NOT NULL DEFAULT 0;
|
||||||
|
|
||||||
|
COMMIT
|
||||||
|
|
||||||
|
|
|
@ -1283,7 +1283,7 @@ namespace OpenSim.Data.MySQL
|
||||||
newSettings.TerrainRaiseLimit = Convert.ToDouble(row["terrain_raise_limit"]);
|
newSettings.TerrainRaiseLimit = Convert.ToDouble(row["terrain_raise_limit"]);
|
||||||
newSettings.TerrainLowerLimit = Convert.ToDouble(row["terrain_lower_limit"]);
|
newSettings.TerrainLowerLimit = Convert.ToDouble(row["terrain_lower_limit"]);
|
||||||
newSettings.UseEstateSun = Convert.ToBoolean(row["use_estate_sun"]);
|
newSettings.UseEstateSun = Convert.ToBoolean(row["use_estate_sun"]);
|
||||||
newSettings.Sandbox = Convert.ToBoolean(row["sandbox"]);
|
newSettings.Sandbox = Convert.ToBoolean(row["Sandbox"]);
|
||||||
newSettings.SunVector = new Vector3 (
|
newSettings.SunVector = new Vector3 (
|
||||||
Convert.ToSingle(row["sunvectorx"]),
|
Convert.ToSingle(row["sunvectorx"]),
|
||||||
Convert.ToSingle(row["sunvectory"]),
|
Convert.ToSingle(row["sunvectory"]),
|
||||||
|
|
|
@ -0,0 +1,500 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) Contributors, http://opensimulator.org/
|
||||||
|
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of the OpenSimulator Project nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Data;
|
||||||
|
using System.IO;
|
||||||
|
using System.IO.Compression;
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Security.Cryptography;
|
||||||
|
using System.Text;
|
||||||
|
using log4net;
|
||||||
|
using MySql.Data.MySqlClient;
|
||||||
|
using OpenMetaverse;
|
||||||
|
using OpenSim.Framework;
|
||||||
|
using OpenSim.Data;
|
||||||
|
|
||||||
|
namespace OpenSim.Data.MySQL
|
||||||
|
{
|
||||||
|
public class MySQLXAssetData : AssetDataBase
|
||||||
|
{
|
||||||
|
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||||
|
|
||||||
|
protected virtual Assembly Assembly
|
||||||
|
{
|
||||||
|
get { return GetType().Assembly; }
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool m_enableCompression = false;
|
||||||
|
private string m_connectionString;
|
||||||
|
private object m_dbLock = new object();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// We can reuse this for all hashing since all methods are single-threaded through m_dbBLock
|
||||||
|
/// </summary>
|
||||||
|
private HashAlgorithm hasher = new SHA256CryptoServiceProvider();
|
||||||
|
|
||||||
|
#region IPlugin Members
|
||||||
|
|
||||||
|
public override string Version { get { return "1.0.0.0"; } }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// <para>Initialises Asset interface</para>
|
||||||
|
/// <para>
|
||||||
|
/// <list type="bullet">
|
||||||
|
/// <item>Loads and initialises the MySQL storage plugin.</item>
|
||||||
|
/// <item>Warns and uses the obsolete mysql_connection.ini if connect string is empty.</item>
|
||||||
|
/// <item>Check for migration</item>
|
||||||
|
/// </list>
|
||||||
|
/// </para>
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="connect">connect string</param>
|
||||||
|
public override void Initialise(string connect)
|
||||||
|
{
|
||||||
|
m_log.ErrorFormat("[MYSQL XASSETDATA]: ***********************************************************");
|
||||||
|
m_log.ErrorFormat("[MYSQL XASSETDATA]: ***********************************************************");
|
||||||
|
m_log.ErrorFormat("[MYSQL XASSETDATA]: ***********************************************************");
|
||||||
|
m_log.ErrorFormat("[MYSQL XASSETDATA]: THIS PLUGIN IS STRICTLY EXPERIMENTAL.");
|
||||||
|
m_log.ErrorFormat("[MYSQL XASSETDATA]: DO NOT USE FOR ANY DATA THAT YOU DO NOT MIND LOSING.");
|
||||||
|
m_log.ErrorFormat("[MYSQL XASSETDATA]: DATABASE TABLES CAN CHANGE AT ANY TIME, CAUSING EXISTING DATA TO BE LOST.");
|
||||||
|
m_log.ErrorFormat("[MYSQL XASSETDATA]: ***********************************************************");
|
||||||
|
m_log.ErrorFormat("[MYSQL XASSETDATA]: ***********************************************************");
|
||||||
|
m_log.ErrorFormat("[MYSQL XASSETDATA]: ***********************************************************");
|
||||||
|
|
||||||
|
m_connectionString = connect;
|
||||||
|
|
||||||
|
using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
|
||||||
|
{
|
||||||
|
dbcon.Open();
|
||||||
|
Migration m = new Migration(dbcon, Assembly, "XAssetStore");
|
||||||
|
m.Update();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Initialise()
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Dispose() { }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The name of this DB provider
|
||||||
|
/// </summary>
|
||||||
|
override public string Name
|
||||||
|
{
|
||||||
|
get { return "MySQL XAsset storage engine"; }
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region IAssetDataPlugin Members
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Fetch Asset <paramref name="assetID"/> from database
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="assetID">Asset UUID to fetch</param>
|
||||||
|
/// <returns>Return the asset</returns>
|
||||||
|
/// <remarks>On failure : throw an exception and attempt to reconnect to database</remarks>
|
||||||
|
override public AssetBase GetAsset(UUID assetID)
|
||||||
|
{
|
||||||
|
// m_log.DebugFormat("[MYSQL XASSET DATA]: Looking for asset {0}", assetID);
|
||||||
|
|
||||||
|
AssetBase asset = null;
|
||||||
|
lock (m_dbLock)
|
||||||
|
{
|
||||||
|
using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
|
||||||
|
{
|
||||||
|
dbcon.Open();
|
||||||
|
|
||||||
|
using (MySqlCommand cmd = new MySqlCommand(
|
||||||
|
"SELECT name, description, asset_type, local, temporary, asset_flags, creator_id, data FROM xassetsmeta JOIN xassetsdata ON xassetsmeta.hash = xassetsdata.hash WHERE id=?id",
|
||||||
|
dbcon))
|
||||||
|
{
|
||||||
|
cmd.Parameters.AddWithValue("?id", assetID.ToString());
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
using (MySqlDataReader dbReader = cmd.ExecuteReader(CommandBehavior.SingleRow))
|
||||||
|
{
|
||||||
|
if (dbReader.Read())
|
||||||
|
{
|
||||||
|
asset = new AssetBase(assetID, (string)dbReader["name"], (sbyte)dbReader["asset_type"], dbReader["creator_id"].ToString());
|
||||||
|
asset.Data = (byte[])dbReader["data"];
|
||||||
|
asset.Description = (string)dbReader["description"];
|
||||||
|
|
||||||
|
string local = dbReader["local"].ToString();
|
||||||
|
if (local.Equals("1") || local.Equals("true", StringComparison.InvariantCultureIgnoreCase))
|
||||||
|
asset.Local = true;
|
||||||
|
else
|
||||||
|
asset.Local = false;
|
||||||
|
|
||||||
|
asset.Temporary = Convert.ToBoolean(dbReader["temporary"]);
|
||||||
|
asset.Flags = (AssetFlags)Convert.ToInt32(dbReader["asset_flags"]);
|
||||||
|
|
||||||
|
if (m_enableCompression)
|
||||||
|
{
|
||||||
|
using (GZipStream decompressionStream = new GZipStream(new MemoryStream(asset.Data), CompressionMode.Decompress))
|
||||||
|
{
|
||||||
|
MemoryStream outputStream = new MemoryStream();
|
||||||
|
WebUtil.CopyStream(decompressionStream, outputStream, int.MaxValue);
|
||||||
|
// int compressedLength = asset.Data.Length;
|
||||||
|
asset.Data = outputStream.ToArray();
|
||||||
|
|
||||||
|
// m_log.DebugFormat(
|
||||||
|
// "[XASSET DB]: Decompressed {0} {1} to {2} bytes from {3}",
|
||||||
|
// asset.ID, asset.Name, asset.Data.Length, compressedLength);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
m_log.Error("[MYSQL XASSET DATA]: MySql failure fetching asset " + assetID + ": " + e.Message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return asset;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Create an asset in database, or update it if existing.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="asset">Asset UUID to create</param>
|
||||||
|
/// <remarks>On failure : Throw an exception and attempt to reconnect to database</remarks>
|
||||||
|
override public void StoreAsset(AssetBase asset)
|
||||||
|
{
|
||||||
|
lock (m_dbLock)
|
||||||
|
{
|
||||||
|
using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
|
||||||
|
{
|
||||||
|
dbcon.Open();
|
||||||
|
|
||||||
|
using (MySqlTransaction transaction = dbcon.BeginTransaction())
|
||||||
|
{
|
||||||
|
string assetName = asset.Name;
|
||||||
|
if (asset.Name.Length > 64)
|
||||||
|
{
|
||||||
|
assetName = asset.Name.Substring(0, 64);
|
||||||
|
m_log.Warn("[XASSET DB]: Name field truncated from " + asset.Name.Length + " to " + assetName.Length + " characters on add");
|
||||||
|
}
|
||||||
|
|
||||||
|
string assetDescription = asset.Description;
|
||||||
|
if (asset.Description.Length > 64)
|
||||||
|
{
|
||||||
|
assetDescription = asset.Description.Substring(0, 64);
|
||||||
|
m_log.Warn("[XASSET DB]: Description field truncated from " + asset.Description.Length + " to " + assetDescription.Length + " characters on add");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_enableCompression)
|
||||||
|
{
|
||||||
|
MemoryStream outputStream = new MemoryStream();
|
||||||
|
|
||||||
|
using (GZipStream compressionStream = new GZipStream(outputStream, CompressionMode.Compress, false))
|
||||||
|
{
|
||||||
|
// Console.WriteLine(WebUtil.CopyTo(new MemoryStream(asset.Data), compressionStream, int.MaxValue));
|
||||||
|
// We have to close the compression stream in order to make sure it writes everything out to the underlying memory output stream.
|
||||||
|
compressionStream.Close();
|
||||||
|
byte[] compressedData = outputStream.ToArray();
|
||||||
|
asset.Data = compressedData;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
byte[] hash = hasher.ComputeHash(asset.Data);
|
||||||
|
|
||||||
|
// m_log.DebugFormat(
|
||||||
|
// "[XASSET DB]: Compressed data size for {0} {1}, hash {2} is {3}",
|
||||||
|
// asset.ID, asset.Name, hash, compressedData.Length);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
using (MySqlCommand cmd =
|
||||||
|
new MySqlCommand(
|
||||||
|
"replace INTO xassetsmeta(id, hash, name, description, asset_type, local, temporary, create_time, access_time, asset_flags, creator_id)" +
|
||||||
|
"VALUES(?id, ?hash, ?name, ?description, ?asset_type, ?local, ?temporary, ?create_time, ?access_time, ?asset_flags, ?creator_id)",
|
||||||
|
dbcon))
|
||||||
|
{
|
||||||
|
// create unix epoch time
|
||||||
|
int now = (int)Utils.DateTimeToUnixTime(DateTime.UtcNow);
|
||||||
|
cmd.Parameters.AddWithValue("?id", asset.ID);
|
||||||
|
cmd.Parameters.AddWithValue("?hash", hash);
|
||||||
|
cmd.Parameters.AddWithValue("?name", assetName);
|
||||||
|
cmd.Parameters.AddWithValue("?description", assetDescription);
|
||||||
|
cmd.Parameters.AddWithValue("?asset_type", asset.Type);
|
||||||
|
cmd.Parameters.AddWithValue("?local", asset.Local);
|
||||||
|
cmd.Parameters.AddWithValue("?temporary", asset.Temporary);
|
||||||
|
cmd.Parameters.AddWithValue("?create_time", now);
|
||||||
|
cmd.Parameters.AddWithValue("?access_time", now);
|
||||||
|
cmd.Parameters.AddWithValue("?creator_id", asset.Metadata.CreatorID);
|
||||||
|
cmd.Parameters.AddWithValue("?asset_flags", (int)asset.Flags);
|
||||||
|
cmd.ExecuteNonQuery();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
m_log.ErrorFormat("[ASSET DB]: MySQL failure creating asset metadata {0} with name \"{1}\". Error: {2}",
|
||||||
|
asset.FullID, asset.Name, e.Message);
|
||||||
|
|
||||||
|
transaction.Rollback();
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ExistsData(dbcon, transaction, hash))
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
using (MySqlCommand cmd =
|
||||||
|
new MySqlCommand(
|
||||||
|
"INSERT INTO xassetsdata(hash, data) VALUES(?hash, ?data)",
|
||||||
|
dbcon))
|
||||||
|
{
|
||||||
|
cmd.Parameters.AddWithValue("?hash", hash);
|
||||||
|
cmd.Parameters.AddWithValue("?data", asset.Data);
|
||||||
|
cmd.ExecuteNonQuery();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
m_log.ErrorFormat("[XASSET DB]: MySQL failure creating asset data {0} with name \"{1}\". Error: {2}",
|
||||||
|
asset.FullID, asset.Name, e.Message);
|
||||||
|
|
||||||
|
transaction.Rollback();
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
transaction.Commit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// private void UpdateAccessTime(AssetBase asset)
|
||||||
|
// {
|
||||||
|
// lock (m_dbLock)
|
||||||
|
// {
|
||||||
|
// using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
|
||||||
|
// {
|
||||||
|
// dbcon.Open();
|
||||||
|
// MySqlCommand cmd =
|
||||||
|
// new MySqlCommand("update assets set access_time=?access_time where id=?id",
|
||||||
|
// dbcon);
|
||||||
|
//
|
||||||
|
// // need to ensure we dispose
|
||||||
|
// try
|
||||||
|
// {
|
||||||
|
// using (cmd)
|
||||||
|
// {
|
||||||
|
// // create unix epoch time
|
||||||
|
// int now = (int)Utils.DateTimeToUnixTime(DateTime.UtcNow);
|
||||||
|
// cmd.Parameters.AddWithValue("?id", asset.ID);
|
||||||
|
// cmd.Parameters.AddWithValue("?access_time", now);
|
||||||
|
// cmd.ExecuteNonQuery();
|
||||||
|
// cmd.Dispose();
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// catch (Exception e)
|
||||||
|
// {
|
||||||
|
// m_log.ErrorFormat(
|
||||||
|
// "[ASSETS DB]: " +
|
||||||
|
// "MySql failure updating access_time for asset {0} with name {1}" + Environment.NewLine + e.ToString()
|
||||||
|
// + Environment.NewLine + "Attempting reconnection", asset.FullID, asset.Name);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// We assume we already have the m_dbLock.
|
||||||
|
/// </summary>
|
||||||
|
/// TODO: need to actually use the transaction.
|
||||||
|
/// <param name="dbcon"></param>
|
||||||
|
/// <param name="transaction"></param>
|
||||||
|
/// <param name="hash"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
private bool ExistsData(MySqlConnection dbcon, MySqlTransaction transaction, byte[] hash)
|
||||||
|
{
|
||||||
|
// m_log.DebugFormat("[ASSETS DB]: Checking for asset {0}", uuid);
|
||||||
|
|
||||||
|
bool exists = false;
|
||||||
|
|
||||||
|
using (MySqlCommand cmd = new MySqlCommand("SELECT hash FROM xassetsdata WHERE hash=?hash", dbcon))
|
||||||
|
{
|
||||||
|
cmd.Parameters.AddWithValue("?hash", hash);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
using (MySqlDataReader dbReader = cmd.ExecuteReader(CommandBehavior.SingleRow))
|
||||||
|
{
|
||||||
|
if (dbReader.Read())
|
||||||
|
{
|
||||||
|
// m_log.DebugFormat("[ASSETS DB]: Found asset {0}", uuid);
|
||||||
|
exists = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
m_log.ErrorFormat(
|
||||||
|
"[XASSETS DB]: MySql failure in ExistsData fetching hash {0}. Exception {1}{2}",
|
||||||
|
hash, e.Message, e.StackTrace);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return exists;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Check if the asset exists in the database
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="uuid">The asset UUID</param>
|
||||||
|
/// <returns>true if it exists, false otherwise.</returns>
|
||||||
|
override public bool ExistsAsset(UUID uuid)
|
||||||
|
{
|
||||||
|
// m_log.DebugFormat("[ASSETS DB]: Checking for asset {0}", uuid);
|
||||||
|
|
||||||
|
bool assetExists = false;
|
||||||
|
|
||||||
|
lock (m_dbLock)
|
||||||
|
{
|
||||||
|
using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
|
||||||
|
{
|
||||||
|
dbcon.Open();
|
||||||
|
using (MySqlCommand cmd = new MySqlCommand("SELECT id FROM xassetsmeta WHERE id=?id", dbcon))
|
||||||
|
{
|
||||||
|
cmd.Parameters.AddWithValue("?id", uuid.ToString());
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
using (MySqlDataReader dbReader = cmd.ExecuteReader(CommandBehavior.SingleRow))
|
||||||
|
{
|
||||||
|
if (dbReader.Read())
|
||||||
|
{
|
||||||
|
// m_log.DebugFormat("[ASSETS DB]: Found asset {0}", uuid);
|
||||||
|
assetExists = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
m_log.ErrorFormat(
|
||||||
|
"[XASSETS DB]: MySql failure fetching asset {0}" + Environment.NewLine + e.ToString(), uuid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return assetExists;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Returns a list of AssetMetadata objects. The list is a subset of
|
||||||
|
/// the entire data set offset by <paramref name="start" /> containing
|
||||||
|
/// <paramref name="count" /> elements.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="start">The number of results to discard from the total data set.</param>
|
||||||
|
/// <param name="count">The number of rows the returned list should contain.</param>
|
||||||
|
/// <returns>A list of AssetMetadata objects.</returns>
|
||||||
|
public override List<AssetMetadata> FetchAssetMetadataSet(int start, int count)
|
||||||
|
{
|
||||||
|
List<AssetMetadata> retList = new List<AssetMetadata>(count);
|
||||||
|
|
||||||
|
lock (m_dbLock)
|
||||||
|
{
|
||||||
|
using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
|
||||||
|
{
|
||||||
|
dbcon.Open();
|
||||||
|
MySqlCommand cmd = new MySqlCommand("SELECT name,description,asset_type,temporary,id,asset_flags,creator_id FROM xassetsmeta LIMIT ?start, ?count", dbcon);
|
||||||
|
cmd.Parameters.AddWithValue("?start", start);
|
||||||
|
cmd.Parameters.AddWithValue("?count", count);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
using (MySqlDataReader dbReader = cmd.ExecuteReader())
|
||||||
|
{
|
||||||
|
while (dbReader.Read())
|
||||||
|
{
|
||||||
|
AssetMetadata metadata = new AssetMetadata();
|
||||||
|
metadata.Name = (string)dbReader["name"];
|
||||||
|
metadata.Description = (string)dbReader["description"];
|
||||||
|
metadata.Type = (sbyte)dbReader["asset_type"];
|
||||||
|
metadata.Temporary = Convert.ToBoolean(dbReader["temporary"]); // Not sure if this is correct.
|
||||||
|
metadata.Flags = (AssetFlags)Convert.ToInt32(dbReader["asset_flags"]);
|
||||||
|
metadata.FullID = DBGuid.FromDB(dbReader["id"]);
|
||||||
|
metadata.CreatorID = dbReader["creator_id"].ToString();
|
||||||
|
|
||||||
|
// We'll ignore this for now - it appears unused!
|
||||||
|
// metadata.SHA1 = dbReader["hash"]);
|
||||||
|
|
||||||
|
retList.Add(metadata);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
m_log.Error("[XASSETS DB]: MySql failure fetching asset set" + Environment.NewLine + e.ToString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return retList;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override bool Delete(string id)
|
||||||
|
{
|
||||||
|
// m_log.DebugFormat("[XASSETS DB]: Deleting asset {0}", id);
|
||||||
|
|
||||||
|
lock (m_dbLock)
|
||||||
|
{
|
||||||
|
using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
|
||||||
|
{
|
||||||
|
dbcon.Open();
|
||||||
|
|
||||||
|
using (MySqlCommand cmd = new MySqlCommand("delete from xassetsmeta where id=?id", dbcon))
|
||||||
|
{
|
||||||
|
cmd.Parameters.AddWithValue("?id", id);
|
||||||
|
cmd.ExecuteNonQuery();
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: How do we deal with data from deleted assets? Probably not easily reapable unless we
|
||||||
|
// keep a reference count (?)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,27 @@
|
||||||
|
# -----------------
|
||||||
|
:VERSION 1
|
||||||
|
|
||||||
|
BEGIN;
|
||||||
|
|
||||||
|
CREATE TABLE `xassetsmeta` (
|
||||||
|
`id` char(36) NOT NULL,
|
||||||
|
`hash` binary(32) NOT NULL,
|
||||||
|
`name` varchar(64) NOT NULL,
|
||||||
|
`description` varchar(64) NOT NULL,
|
||||||
|
`asset_type` tinyint(4) NOT NULL,
|
||||||
|
`local` tinyint(1) NOT NULL,
|
||||||
|
`temporary` tinyint(1) NOT NULL,
|
||||||
|
`create_time` int(11) NOT NULL,
|
||||||
|
`access_time` int(11) NOT NULL,
|
||||||
|
`asset_flags` int(11) NOT NULL,
|
||||||
|
`creator_id` varchar(128) NOT NULL,
|
||||||
|
PRIMARY KEY (`id`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Version 1';
|
||||||
|
|
||||||
|
CREATE TABLE `xassetsdata` (
|
||||||
|
`hash` binary(32) NOT NULL,
|
||||||
|
`data` longblob NOT NULL,
|
||||||
|
PRIMARY KEY (`hash`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Version 1';
|
||||||
|
|
||||||
|
COMMIT;
|
|
@ -541,4 +541,26 @@ CREATE TABLE regionwindlight (
|
||||||
cloud_scroll_y_lock INTEGER NOT NULL DEFAULT '0',
|
cloud_scroll_y_lock INTEGER NOT NULL DEFAULT '0',
|
||||||
draw_classic_clouds INTEGER NOT NULL DEFAULT '1');
|
draw_classic_clouds INTEGER NOT NULL DEFAULT '1');
|
||||||
|
|
||||||
COMMIT;
|
COMMIT;
|
||||||
|
|
||||||
|
|
||||||
|
:VERSION 24
|
||||||
|
|
||||||
|
BEGIN;
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS `spawn_points` (
|
||||||
|
`RegionID` varchar(36) NOT NULL DEFAULT '000000-0000-0000-0000-000000000000',
|
||||||
|
`Yaw` float NOT NULL,
|
||||||
|
`Pitch` float NOT NULL,
|
||||||
|
`Distance` float NOT NULL
|
||||||
|
);
|
||||||
|
|
||||||
|
ALTER TABLE `regionsettings` ADD COLUMN `TelehubObject` varchar(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000';
|
||||||
|
|
||||||
|
COMMIT;
|
||||||
|
|
||||||
|
:VERSION 25
|
||||||
|
|
||||||
|
BEGIN;
|
||||||
|
ALTER TABLE `regionsettings` ADD COLUMN `parcel_tile_ID` char(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000';
|
||||||
|
COMMIT;
|
||||||
|
|
|
@ -81,6 +81,9 @@ namespace OpenSim.Data.SQLite
|
||||||
/// <param name="dbconnect">connect string</param>
|
/// <param name="dbconnect">connect string</param>
|
||||||
override public void Initialise(string dbconnect)
|
override public void Initialise(string dbconnect)
|
||||||
{
|
{
|
||||||
|
if (Util.IsWindows())
|
||||||
|
Util.LoadArchSpecificWindowsDll("sqlite3.dll");
|
||||||
|
|
||||||
if (dbconnect == string.Empty)
|
if (dbconnect == string.Empty)
|
||||||
{
|
{
|
||||||
dbconnect = "URI=file:Asset.db,version=3";
|
dbconnect = "URI=file:Asset.db,version=3";
|
||||||
|
|
|
@ -65,6 +65,9 @@ namespace OpenSim.Data.SQLite
|
||||||
|
|
||||||
if (!m_initialized)
|
if (!m_initialized)
|
||||||
{
|
{
|
||||||
|
if (Util.IsWindows())
|
||||||
|
Util.LoadArchSpecificWindowsDll("sqlite3.dll");
|
||||||
|
|
||||||
m_Connection = new SqliteConnection(connectionString);
|
m_Connection = new SqliteConnection(connectionString);
|
||||||
m_Connection.Open();
|
m_Connection.Open();
|
||||||
|
|
||||||
|
|
|
@ -69,6 +69,9 @@ namespace OpenSim.Data.SQLite
|
||||||
|
|
||||||
public void Initialise(string connectionString)
|
public void Initialise(string connectionString)
|
||||||
{
|
{
|
||||||
|
if (Util.IsWindows())
|
||||||
|
Util.LoadArchSpecificWindowsDll("sqlite3.dll");
|
||||||
|
|
||||||
m_connectionString = connectionString;
|
m_connectionString = connectionString;
|
||||||
|
|
||||||
m_log.Info("[ESTATE DB]: Sqlite - connecting: "+m_connectionString);
|
m_log.Info("[ESTATE DB]: Sqlite - connecting: "+m_connectionString);
|
||||||
|
|
|
@ -48,6 +48,8 @@ namespace OpenSim.Data.SQLite
|
||||||
|
|
||||||
protected SQLiteFramework(string connectionString)
|
protected SQLiteFramework(string connectionString)
|
||||||
{
|
{
|
||||||
|
if (Util.IsWindows())
|
||||||
|
Util.LoadArchSpecificWindowsDll("sqlite3.dll");
|
||||||
}
|
}
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////
|
||||||
|
|
|
@ -77,6 +77,9 @@ namespace OpenSim.Data.SQLite
|
||||||
{
|
{
|
||||||
m_Initialized = true;
|
m_Initialized = true;
|
||||||
|
|
||||||
|
if (Util.IsWindows())
|
||||||
|
Util.LoadArchSpecificWindowsDll("sqlite3.dll");
|
||||||
|
|
||||||
if (dbconnect == string.Empty)
|
if (dbconnect == string.Empty)
|
||||||
{
|
{
|
||||||
dbconnect = "URI=file:inventoryStore.db,version=3";
|
dbconnect = "URI=file:inventoryStore.db,version=3";
|
||||||
|
|
|
@ -61,6 +61,7 @@ namespace OpenSim.Data.SQLite
|
||||||
private const string regionbanListSelect = "select * from regionban";
|
private const string regionbanListSelect = "select * from regionban";
|
||||||
private const string regionSettingsSelect = "select * from regionsettings";
|
private const string regionSettingsSelect = "select * from regionsettings";
|
||||||
private const string regionWindlightSelect = "select * from regionwindlight";
|
private const string regionWindlightSelect = "select * from regionwindlight";
|
||||||
|
private const string regionSpawnPointsSelect = "select * from spawn_points";
|
||||||
|
|
||||||
private DataSet ds;
|
private DataSet ds;
|
||||||
private SqliteDataAdapter primDa;
|
private SqliteDataAdapter primDa;
|
||||||
|
@ -71,6 +72,7 @@ namespace OpenSim.Data.SQLite
|
||||||
private SqliteDataAdapter landAccessListDa;
|
private SqliteDataAdapter landAccessListDa;
|
||||||
private SqliteDataAdapter regionSettingsDa;
|
private SqliteDataAdapter regionSettingsDa;
|
||||||
private SqliteDataAdapter regionWindlightDa;
|
private SqliteDataAdapter regionWindlightDa;
|
||||||
|
private SqliteDataAdapter regionSpawnPointsDa;
|
||||||
|
|
||||||
private SqliteConnection m_conn;
|
private SqliteConnection m_conn;
|
||||||
private String m_connectionString;
|
private String m_connectionString;
|
||||||
|
@ -108,6 +110,9 @@ namespace OpenSim.Data.SQLite
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
if (Util.IsWindows())
|
||||||
|
Util.LoadArchSpecificWindowsDll("sqlite3.dll");
|
||||||
|
|
||||||
m_connectionString = connectionString;
|
m_connectionString = connectionString;
|
||||||
|
|
||||||
ds = new DataSet("Region");
|
ds = new DataSet("Region");
|
||||||
|
@ -140,6 +145,10 @@ namespace OpenSim.Data.SQLite
|
||||||
|
|
||||||
SqliteCommand regionWindlightSelectCmd = new SqliteCommand(regionWindlightSelect, m_conn);
|
SqliteCommand regionWindlightSelectCmd = new SqliteCommand(regionWindlightSelect, m_conn);
|
||||||
regionWindlightDa = new SqliteDataAdapter(regionWindlightSelectCmd);
|
regionWindlightDa = new SqliteDataAdapter(regionWindlightSelectCmd);
|
||||||
|
|
||||||
|
SqliteCommand regionSpawnPointsSelectCmd = new SqliteCommand(regionSpawnPointsSelect, m_conn);
|
||||||
|
regionSpawnPointsDa = new SqliteDataAdapter(regionSpawnPointsSelectCmd);
|
||||||
|
|
||||||
// This actually does the roll forward assembly stuff
|
// This actually does the roll forward assembly stuff
|
||||||
Migration m = new Migration(m_conn, Assembly, "RegionStore");
|
Migration m = new Migration(m_conn, Assembly, "RegionStore");
|
||||||
m.Update();
|
m.Update();
|
||||||
|
@ -170,6 +179,9 @@ namespace OpenSim.Data.SQLite
|
||||||
ds.Tables.Add(createRegionWindlightTable());
|
ds.Tables.Add(createRegionWindlightTable());
|
||||||
setupRegionWindlightCommands(regionWindlightDa, m_conn);
|
setupRegionWindlightCommands(regionWindlightDa, m_conn);
|
||||||
|
|
||||||
|
ds.Tables.Add(createRegionSpawnPointsTable());
|
||||||
|
setupRegionSpawnPointsCommands(regionSpawnPointsDa, m_conn);
|
||||||
|
|
||||||
// WORKAROUND: This is a work around for sqlite on
|
// WORKAROUND: This is a work around for sqlite on
|
||||||
// windows, which gets really unhappy with blob columns
|
// windows, which gets really unhappy with blob columns
|
||||||
// that have no sample data in them. At some point we
|
// that have no sample data in them. At some point we
|
||||||
|
@ -246,6 +258,15 @@ namespace OpenSim.Data.SQLite
|
||||||
m_log.ErrorFormat("[SQLITE REGION DB]: Caught fill error on regionwindlight table :{0}", e.Message);
|
m_log.ErrorFormat("[SQLITE REGION DB]: Caught fill error on regionwindlight table :{0}", e.Message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
regionSpawnPointsDa.Fill(ds.Tables["spawn_points"]);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
m_log.ErrorFormat("[SQLITE REGION DB]: Caught fill error on spawn_points table :{0}", e.Message);
|
||||||
|
}
|
||||||
|
|
||||||
// We have to create a data set mapping for every table, otherwise the IDataAdaptor.Update() will not populate rows with values!
|
// We have to create a data set mapping for every table, otherwise the IDataAdaptor.Update() will not populate rows with values!
|
||||||
// Not sure exactly why this is - this kind of thing was not necessary before - justincc 20100409
|
// Not sure exactly why this is - this kind of thing was not necessary before - justincc 20100409
|
||||||
// Possibly because we manually set up our own DataTables before connecting to the database
|
// Possibly because we manually set up our own DataTables before connecting to the database
|
||||||
|
@ -257,6 +278,7 @@ namespace OpenSim.Data.SQLite
|
||||||
CreateDataSetMapping(landAccessListDa, "landaccesslist");
|
CreateDataSetMapping(landAccessListDa, "landaccesslist");
|
||||||
CreateDataSetMapping(regionSettingsDa, "regionsettings");
|
CreateDataSetMapping(regionSettingsDa, "regionsettings");
|
||||||
CreateDataSetMapping(regionWindlightDa, "regionwindlight");
|
CreateDataSetMapping(regionWindlightDa, "regionwindlight");
|
||||||
|
CreateDataSetMapping(regionSpawnPointsDa, "spawn_points");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
|
@ -319,6 +341,11 @@ namespace OpenSim.Data.SQLite
|
||||||
regionWindlightDa.Dispose();
|
regionWindlightDa.Dispose();
|
||||||
regionWindlightDa = null;
|
regionWindlightDa = null;
|
||||||
}
|
}
|
||||||
|
if (regionSpawnPointsDa != null)
|
||||||
|
{
|
||||||
|
regionSpawnPointsDa.Dispose();
|
||||||
|
regionWindlightDa = null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void StoreRegionSettings(RegionSettings rs)
|
public void StoreRegionSettings(RegionSettings rs)
|
||||||
|
@ -339,8 +366,43 @@ namespace OpenSim.Data.SQLite
|
||||||
fillRegionSettingsRow(settingsRow, rs);
|
fillRegionSettingsRow(settingsRow, rs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
StoreSpawnPoints(rs);
|
||||||
|
|
||||||
Commit();
|
Commit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void StoreSpawnPoints(RegionSettings rs)
|
||||||
|
{
|
||||||
|
lock (ds)
|
||||||
|
{
|
||||||
|
// DataTable spawnpoints = ds.Tables["spawn_points"];
|
||||||
|
|
||||||
|
// remove region's spawnpoints
|
||||||
|
using (
|
||||||
|
SqliteCommand cmd =
|
||||||
|
new SqliteCommand("delete from spawn_points where RegionID=:RegionID",
|
||||||
|
m_conn))
|
||||||
|
{
|
||||||
|
|
||||||
|
cmd.Parameters.Add(new SqliteParameter(":RegionID", rs.RegionUUID.ToString()));
|
||||||
|
cmd.ExecuteNonQuery();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (SpawnPoint sp in rs.SpawnPoints())
|
||||||
|
{
|
||||||
|
using (SqliteCommand cmd = new SqliteCommand("insert into spawn_points(RegionID, Yaw, Pitch, Distance)" +
|
||||||
|
"values ( :RegionID, :Yaw, :Pitch, :Distance)", m_conn))
|
||||||
|
{
|
||||||
|
cmd.Parameters.Add(new SqliteParameter(":RegionID", rs.RegionUUID.ToString()));
|
||||||
|
cmd.Parameters.Add(new SqliteParameter(":Yaw", sp.Yaw));
|
||||||
|
cmd.Parameters.Add(new SqliteParameter(":Pitch", sp.Pitch));
|
||||||
|
cmd.Parameters.Add(new SqliteParameter(":Distance", sp.Distance));
|
||||||
|
cmd.ExecuteNonQuery();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -435,10 +497,31 @@ namespace OpenSim.Data.SQLite
|
||||||
RegionSettings newSettings = buildRegionSettings(row);
|
RegionSettings newSettings = buildRegionSettings(row);
|
||||||
newSettings.OnSave += StoreRegionSettings;
|
newSettings.OnSave += StoreRegionSettings;
|
||||||
|
|
||||||
|
LoadSpawnPoints(newSettings);
|
||||||
|
|
||||||
return newSettings;
|
return newSettings;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void LoadSpawnPoints(RegionSettings rs)
|
||||||
|
{
|
||||||
|
rs.ClearSpawnPoints();
|
||||||
|
|
||||||
|
DataTable spawnpoints = ds.Tables["spawn_points"];
|
||||||
|
string byRegion = "RegionID = '" + rs.RegionUUID + "'";
|
||||||
|
DataRow[] spForRegion = spawnpoints.Select(byRegion);
|
||||||
|
|
||||||
|
foreach (DataRow spRow in spForRegion)
|
||||||
|
{
|
||||||
|
SpawnPoint sp = new SpawnPoint();
|
||||||
|
sp.Pitch = (float)spRow["Pitch"];
|
||||||
|
sp.Yaw = (float)spRow["Yaw"];
|
||||||
|
sp.Distance = (float)spRow["Distance"];
|
||||||
|
|
||||||
|
rs.AddSpawnPoint(sp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Adds an object into region storage
|
/// Adds an object into region storage
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -1265,6 +1348,8 @@ namespace OpenSim.Data.SQLite
|
||||||
createCol(regionsettings, "covenant", typeof(String));
|
createCol(regionsettings, "covenant", typeof(String));
|
||||||
createCol(regionsettings, "covenant_datetime", typeof(Int32));
|
createCol(regionsettings, "covenant_datetime", typeof(Int32));
|
||||||
createCol(regionsettings, "map_tile_ID", typeof(String));
|
createCol(regionsettings, "map_tile_ID", typeof(String));
|
||||||
|
createCol(regionsettings, "TelehubObject", typeof(String));
|
||||||
|
createCol(regionsettings, "parcel_tile_ID", typeof(String));
|
||||||
regionsettings.PrimaryKey = new DataColumn[] { regionsettings.Columns["regionUUID"] };
|
regionsettings.PrimaryKey = new DataColumn[] { regionsettings.Columns["regionUUID"] };
|
||||||
return regionsettings;
|
return regionsettings;
|
||||||
}
|
}
|
||||||
|
@ -1345,6 +1430,17 @@ namespace OpenSim.Data.SQLite
|
||||||
return regionwindlight;
|
return regionwindlight;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static DataTable createRegionSpawnPointsTable()
|
||||||
|
{
|
||||||
|
DataTable spawn_points = new DataTable("spawn_points");
|
||||||
|
createCol(spawn_points, "regionID", typeof(String));
|
||||||
|
createCol(spawn_points, "Yaw", typeof(float));
|
||||||
|
createCol(spawn_points, "Pitch", typeof(float));
|
||||||
|
createCol(spawn_points, "Distance", typeof(float));
|
||||||
|
|
||||||
|
return spawn_points;
|
||||||
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
*
|
*
|
||||||
* Convert between ADO.NET <=> OpenSim Objects
|
* Convert between ADO.NET <=> OpenSim Objects
|
||||||
|
@ -1666,6 +1762,8 @@ namespace OpenSim.Data.SQLite
|
||||||
newSettings.Covenant = new UUID((String)row["covenant"]);
|
newSettings.Covenant = new UUID((String)row["covenant"]);
|
||||||
newSettings.CovenantChangedDateTime = Convert.ToInt32(row["covenant_datetime"]);
|
newSettings.CovenantChangedDateTime = Convert.ToInt32(row["covenant_datetime"]);
|
||||||
newSettings.TerrainImageID = new UUID((String)row["map_tile_ID"]);
|
newSettings.TerrainImageID = new UUID((String)row["map_tile_ID"]);
|
||||||
|
newSettings.TelehubObject = new UUID((String)row["TelehubObject"]);
|
||||||
|
newSettings.ParcelImageID = new UUID((String)row["parcel_tile_ID"]);
|
||||||
|
|
||||||
return newSettings;
|
return newSettings;
|
||||||
}
|
}
|
||||||
|
@ -2059,7 +2157,7 @@ namespace OpenSim.Data.SQLite
|
||||||
row["terrain_raise_limit"] = settings.TerrainRaiseLimit;
|
row["terrain_raise_limit"] = settings.TerrainRaiseLimit;
|
||||||
row["terrain_lower_limit"] = settings.TerrainLowerLimit;
|
row["terrain_lower_limit"] = settings.TerrainLowerLimit;
|
||||||
row["use_estate_sun"] = settings.UseEstateSun;
|
row["use_estate_sun"] = settings.UseEstateSun;
|
||||||
row["Sandbox"] = settings.Sandbox; // database uses upper case S for sandbox
|
row["sandbox"] = settings.Sandbox; // unlike other database modules, sqlite uses a lower case s for sandbox!
|
||||||
row["sunvectorx"] = settings.SunVector.X;
|
row["sunvectorx"] = settings.SunVector.X;
|
||||||
row["sunvectory"] = settings.SunVector.Y;
|
row["sunvectory"] = settings.SunVector.Y;
|
||||||
row["sunvectorz"] = settings.SunVector.Z;
|
row["sunvectorz"] = settings.SunVector.Z;
|
||||||
|
@ -2068,6 +2166,8 @@ namespace OpenSim.Data.SQLite
|
||||||
row["covenant"] = settings.Covenant.ToString();
|
row["covenant"] = settings.Covenant.ToString();
|
||||||
row["covenant_datetime"] = settings.CovenantChangedDateTime;
|
row["covenant_datetime"] = settings.CovenantChangedDateTime;
|
||||||
row["map_tile_ID"] = settings.TerrainImageID.ToString();
|
row["map_tile_ID"] = settings.TerrainImageID.ToString();
|
||||||
|
row["TelehubObject"] = settings.TelehubObject.ToString();
|
||||||
|
row["parcel_tile_ID"] = settings.ParcelImageID.ToString();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -2591,6 +2691,14 @@ namespace OpenSim.Data.SQLite
|
||||||
da.UpdateCommand.Connection = conn;
|
da.UpdateCommand.Connection = conn;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void setupRegionSpawnPointsCommands(SqliteDataAdapter da, SqliteConnection conn)
|
||||||
|
{
|
||||||
|
da.InsertCommand = createInsertCommand("spawn_points", ds.Tables["spawn_points"]);
|
||||||
|
da.InsertCommand.Connection = conn;
|
||||||
|
da.UpdateCommand = createUpdateCommand("spawn_points", "RegionID=:RegionID", ds.Tables["spawn_points"]);
|
||||||
|
da.UpdateCommand.Connection = conn;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
@ -52,6 +52,9 @@ namespace OpenSim.Data.SQLite
|
||||||
|
|
||||||
public SQLiteXInventoryData(string conn, string realm)
|
public SQLiteXInventoryData(string conn, string realm)
|
||||||
{
|
{
|
||||||
|
if (Util.IsWindows())
|
||||||
|
Util.LoadArchSpecificWindowsDll("sqlite3.dll");
|
||||||
|
|
||||||
m_Folders = new SQLiteGenericTableHandler<XInventoryFolder>(
|
m_Folders = new SQLiteGenericTableHandler<XInventoryFolder>(
|
||||||
conn, "inventoryfolders", "XInventoryStore");
|
conn, "inventoryfolders", "XInventoryStore");
|
||||||
m_Items = new SqliteItemHandler(
|
m_Items = new SqliteItemHandler(
|
||||||
|
|
|
@ -29,6 +29,7 @@ using System;
|
||||||
using System.Xml;
|
using System.Xml;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
|
using System.Linq;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
|
@ -40,6 +41,8 @@ namespace OpenSim.Framework.Console
|
||||||
{
|
{
|
||||||
public class Commands : ICommands
|
public class Commands : ICommands
|
||||||
{
|
{
|
||||||
|
// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Encapsulates a command that can be invoked from the console
|
/// Encapsulates a command that can be invoked from the console
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -76,12 +79,19 @@ namespace OpenSim.Framework.Console
|
||||||
public List<CommandDelegate> fn;
|
public List<CommandDelegate> fn;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public const string GeneralHelpText = "For more information, type 'help <item>' where <item> is one of the following categories:";
|
||||||
|
|
||||||
/// <value>
|
/// <value>
|
||||||
/// Commands organized by keyword in a tree
|
/// Commands organized by keyword in a tree
|
||||||
/// </value>
|
/// </value>
|
||||||
private Dictionary<string, object> tree =
|
private Dictionary<string, object> tree =
|
||||||
new Dictionary<string, object>();
|
new Dictionary<string, object>();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Commands organized by module
|
||||||
|
/// </summary>
|
||||||
|
private Dictionary<string, List<CommandInfo>> m_modulesCommands = new Dictionary<string, List<CommandInfo>>();
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Get help for the given help string
|
/// Get help for the given help string
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -98,8 +108,8 @@ namespace OpenSim.Framework.Console
|
||||||
// General help
|
// General help
|
||||||
if (helpParts.Count == 0)
|
if (helpParts.Count == 0)
|
||||||
{
|
{
|
||||||
help.AddRange(CollectHelp(tree));
|
help.Add(GeneralHelpText);
|
||||||
help.Sort();
|
help.AddRange(CollectModulesHelp(tree));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -118,6 +128,13 @@ namespace OpenSim.Framework.Console
|
||||||
{
|
{
|
||||||
string originalHelpRequest = string.Join(" ", helpParts.ToArray());
|
string originalHelpRequest = string.Join(" ", helpParts.ToArray());
|
||||||
List<string> help = new List<string>();
|
List<string> help = new List<string>();
|
||||||
|
|
||||||
|
// Check modules first to see if we just need to display a list of those commands
|
||||||
|
if (TryCollectModuleHelp(originalHelpRequest, help))
|
||||||
|
{
|
||||||
|
help.Insert(0, GeneralHelpText);
|
||||||
|
return help;
|
||||||
|
}
|
||||||
|
|
||||||
Dictionary<string, object> dict = tree;
|
Dictionary<string, object> dict = tree;
|
||||||
while (helpParts.Count > 0)
|
while (helpParts.Count > 0)
|
||||||
|
@ -161,25 +178,61 @@ namespace OpenSim.Framework.Console
|
||||||
return help;
|
return help;
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<string> CollectHelp(Dictionary<string, object> dict)
|
/// <summary>
|
||||||
|
/// Try to collect help for the given module if that module exists.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="moduleName"></param>
|
||||||
|
/// <param name="helpText">/param>
|
||||||
|
/// <returns>true if there was the module existed, false otherwise.</returns>
|
||||||
|
private bool TryCollectModuleHelp(string moduleName, List<string> helpText)
|
||||||
{
|
{
|
||||||
List<string> result = new List<string>();
|
lock (m_modulesCommands)
|
||||||
|
|
||||||
foreach (KeyValuePair<string, object> kvp in dict)
|
|
||||||
{
|
{
|
||||||
if (kvp.Value is Dictionary<string, Object>)
|
if (m_modulesCommands.ContainsKey(moduleName))
|
||||||
{
|
{
|
||||||
result.AddRange(CollectHelp((Dictionary<string, Object>)kvp.Value));
|
List<CommandInfo> commands = m_modulesCommands[moduleName];
|
||||||
|
var ourHelpText = commands.ConvertAll(c => string.Format("{0} - {1}", c.help_text, c.long_help));
|
||||||
|
ourHelpText.Sort();
|
||||||
|
helpText.AddRange(ourHelpText);
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (((CommandInfo)kvp.Value).long_help != String.Empty)
|
return false;
|
||||||
result.Add(((CommandInfo)kvp.Value).help_text+" - "+
|
|
||||||
((CommandInfo)kvp.Value).long_help);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private List<string> CollectModulesHelp(Dictionary<string, object> dict)
|
||||||
|
{
|
||||||
|
lock (m_modulesCommands)
|
||||||
|
{
|
||||||
|
List<string> helpText = new List<string>(m_modulesCommands.Keys);
|
||||||
|
helpText.Sort();
|
||||||
|
return helpText;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// private List<string> CollectHelp(Dictionary<string, object> dict)
|
||||||
|
// {
|
||||||
|
// List<string> result = new List<string>();
|
||||||
|
//
|
||||||
|
// foreach (KeyValuePair<string, object> kvp in dict)
|
||||||
|
// {
|
||||||
|
// if (kvp.Value is Dictionary<string, Object>)
|
||||||
|
// {
|
||||||
|
// result.AddRange(CollectHelp((Dictionary<string, Object>)kvp.Value));
|
||||||
|
// }
|
||||||
|
// else
|
||||||
|
// {
|
||||||
|
// if (((CommandInfo)kvp.Value).long_help != String.Empty)
|
||||||
|
// result.Add(((CommandInfo)kvp.Value).help_text+" - "+
|
||||||
|
// ((CommandInfo)kvp.Value).long_help);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// return result;
|
||||||
|
// }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Add a command to those which can be invoked from the console.
|
/// Add a command to those which can be invoked from the console.
|
||||||
|
@ -212,21 +265,19 @@ namespace OpenSim.Framework.Console
|
||||||
|
|
||||||
Dictionary<string, Object> current = tree;
|
Dictionary<string, Object> current = tree;
|
||||||
|
|
||||||
foreach (string s in parts)
|
foreach (string part in parts)
|
||||||
{
|
{
|
||||||
if (current.ContainsKey(s))
|
if (current.ContainsKey(part))
|
||||||
{
|
{
|
||||||
if (current[s] is Dictionary<string, Object>)
|
if (current[part] is Dictionary<string, Object>)
|
||||||
{
|
current = (Dictionary<string, Object>)current[part];
|
||||||
current = (Dictionary<string, Object>)current[s];
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
current[s] = new Dictionary<string, Object>();
|
current[part] = new Dictionary<string, Object>();
|
||||||
current = (Dictionary<string, Object>)current[s];
|
current = (Dictionary<string, Object>)current[part];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -250,6 +301,24 @@ namespace OpenSim.Framework.Console
|
||||||
info.fn = new List<CommandDelegate>();
|
info.fn = new List<CommandDelegate>();
|
||||||
info.fn.Add(fn);
|
info.fn.Add(fn);
|
||||||
current[String.Empty] = info;
|
current[String.Empty] = info;
|
||||||
|
|
||||||
|
// Now add command to modules dictionary
|
||||||
|
lock (m_modulesCommands)
|
||||||
|
{
|
||||||
|
List<CommandInfo> commands;
|
||||||
|
if (m_modulesCommands.ContainsKey(module))
|
||||||
|
{
|
||||||
|
commands = m_modulesCommands[module];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
commands = new List<CommandInfo>();
|
||||||
|
m_modulesCommands[module] = commands;
|
||||||
|
}
|
||||||
|
|
||||||
|
// m_log.DebugFormat("[COMMAND CONSOLE]: Adding to category {0} command {1}", module, command);
|
||||||
|
commands.Add(info);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public string[] FindNextOption(string[] cmd, bool term)
|
public string[] FindNextOption(string[] cmd, bool term)
|
||||||
|
@ -607,8 +676,9 @@ namespace OpenSim.Framework.Console
|
||||||
{
|
{
|
||||||
Commands = new Commands();
|
Commands = new Commands();
|
||||||
|
|
||||||
Commands.AddCommand("console", false, "help", "help [<command>]",
|
Commands.AddCommand(
|
||||||
"Get general command list or more detailed help on a specific command", Help);
|
"Help", false, "help", "help [<item>]",
|
||||||
|
"Display help on a particular command or on a list of commands in a category", Help);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Help(string module, string[] cmd)
|
private void Help(string module, string[] cmd)
|
||||||
|
|
|
@ -29,6 +29,7 @@ using System;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
using System.Xml;
|
||||||
|
|
||||||
namespace OpenSim.Framework.Console
|
namespace OpenSim.Framework.Console
|
||||||
{
|
{
|
||||||
|
@ -37,28 +38,42 @@ namespace OpenSim.Framework.Console
|
||||||
/// Don't use this except for Unit Testing or you're in for a world of hurt when the
|
/// Don't use this except for Unit Testing or you're in for a world of hurt when the
|
||||||
/// sim gets to ReadLine
|
/// sim gets to ReadLine
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class MockConsole : CommandConsole
|
public class MockConsole : ICommandConsole
|
||||||
{
|
{
|
||||||
public MockConsole(string defaultPrompt) : base(defaultPrompt)
|
private MockCommands m_commands = new MockCommands();
|
||||||
{
|
|
||||||
}
|
|
||||||
public override void Output(string text)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
public override void Output(string text, string level)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public override string ReadLine(string p, bool isCommand, bool e)
|
public ICommands Commands { get { return m_commands; } }
|
||||||
{
|
|
||||||
//Thread.CurrentThread.Join(1000);
|
public void Prompt() {}
|
||||||
return string.Empty;
|
|
||||||
}
|
public void RunCommand(string cmd) {}
|
||||||
public override void UnlockOutput()
|
|
||||||
{
|
public string ReadLine(string p, bool isCommand, bool e) { return ""; }
|
||||||
}
|
|
||||||
public override void LockOutput()
|
public object ConsoleScene { get { return null; } }
|
||||||
{
|
|
||||||
}
|
public void Output(string text, string level) {}
|
||||||
|
public void Output(string text) {}
|
||||||
|
public void OutputFormat(string format, params object[] components) {}
|
||||||
|
|
||||||
|
public string CmdPrompt(string p) { return ""; }
|
||||||
|
public string CmdPrompt(string p, string def) { return ""; }
|
||||||
|
public string CmdPrompt(string p, List<char> excludedCharacters) { return ""; }
|
||||||
|
public string CmdPrompt(string p, string def, List<char> excludedCharacters) { return ""; }
|
||||||
|
|
||||||
|
public string CmdPrompt(string prompt, string defaultresponse, List<string> options) { return ""; }
|
||||||
|
|
||||||
|
public string PasswdPrompt(string p) { return ""; }
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
public class MockCommands : ICommands
|
||||||
|
{
|
||||||
|
public void FromXml(XmlElement root, CommandDelegate fn) {}
|
||||||
|
public List<string> GetHelp(string[] cmd) { return null; }
|
||||||
|
public void AddCommand(string module, bool shared, string command, string help, string longhelp, CommandDelegate fn) {}
|
||||||
|
public void AddCommand(string module, bool shared, string command, string help, string longhelp, string descriptivehelp, CommandDelegate fn) {}
|
||||||
|
public string[] FindNextOption(string[] cmd, bool term) { return null; }
|
||||||
|
public string[] Resolve(string[] cmd) { return null; }
|
||||||
|
public XmlElement GetXml(XmlDocument doc) { return null; }
|
||||||
|
}
|
||||||
|
}
|
|
@ -40,7 +40,7 @@ namespace OpenSim.Framework
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Get help for the given help string
|
/// Get help for the given help string
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="helpParts">Parsed parts of the help string. If empty then general help is returned.</param>
|
/// <param name="cmd">Parsed parts of the help string. If empty then general help is returned.</param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
List<string> GetHelp(string[] cmd);
|
List<string> GetHelp(string[] cmd);
|
||||||
|
|
||||||
|
|
|
@ -119,7 +119,7 @@ namespace OpenSim.Framework
|
||||||
// Copy the temporary stream to the network stream
|
// Copy the temporary stream to the network stream
|
||||||
formDataStream.Seek(0, SeekOrigin.Begin);
|
formDataStream.Seek(0, SeekOrigin.Begin);
|
||||||
using (Stream requestStream = request.GetRequestStream())
|
using (Stream requestStream = request.GetRequestStream())
|
||||||
formDataStream.CopyTo(requestStream, (int)formDataStream.Length);
|
formDataStream.CopyStream(requestStream, (int)formDataStream.Length);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion Stream Writing
|
#endregion Stream Writing
|
||||||
|
|
|
@ -28,6 +28,7 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
|
using System.Xml;
|
||||||
using log4net;
|
using log4net;
|
||||||
using OpenMetaverse;
|
using OpenMetaverse;
|
||||||
|
|
||||||
|
@ -39,6 +40,13 @@ namespace OpenSim.Framework
|
||||||
|
|
||||||
#region SL / file extension / content-type conversions
|
#region SL / file extension / content-type conversions
|
||||||
|
|
||||||
|
public static Dictionary<string, UUID> DefaultAvatarAnimations = new Dictionary<string, UUID>();
|
||||||
|
|
||||||
|
static SLUtil()
|
||||||
|
{
|
||||||
|
DefaultAvatarAnimations = LoadDefaultAvatarAnimations("data/avataranimations.xml");
|
||||||
|
}
|
||||||
|
|
||||||
public static string SLAssetTypeToContentType(int assetType)
|
public static string SLAssetTypeToContentType(int assetType)
|
||||||
{
|
{
|
||||||
switch ((AssetType)assetType)
|
switch ((AssetType)assetType)
|
||||||
|
@ -374,5 +382,47 @@ namespace OpenSim.Framework
|
||||||
|
|
||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Load the default SL avatar animations.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static Dictionary<string, UUID> LoadDefaultAvatarAnimations(string path)
|
||||||
|
{
|
||||||
|
Dictionary<string, UUID> animations = new Dictionary<string, UUID>();
|
||||||
|
|
||||||
|
using (XmlTextReader reader = new XmlTextReader(path))
|
||||||
|
{
|
||||||
|
XmlDocument doc = new XmlDocument();
|
||||||
|
doc.Load(reader);
|
||||||
|
if (doc.DocumentElement != null)
|
||||||
|
{
|
||||||
|
foreach (XmlNode nod in doc.DocumentElement.ChildNodes)
|
||||||
|
{
|
||||||
|
if (nod.Attributes["name"] != null)
|
||||||
|
{
|
||||||
|
string name = nod.Attributes["name"].Value.ToLower();
|
||||||
|
string id = nod.InnerText;
|
||||||
|
animations.Add(name, (UUID)id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return animations;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Get the default SL avatar animation with the given name.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="name"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static UUID GetDefaultAvatarAnimation(string name)
|
||||||
|
{
|
||||||
|
if (DefaultAvatarAnimations.ContainsKey(name))
|
||||||
|
return DefaultAvatarAnimations[name];
|
||||||
|
|
||||||
|
return UUID.Zero;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -161,43 +161,43 @@ namespace OpenSim.Framework.Servers
|
||||||
Notice(String.Format("Console log level is {0}", m_consoleAppender.Threshold));
|
Notice(String.Format("Console log level is {0}", m_consoleAppender.Threshold));
|
||||||
}
|
}
|
||||||
|
|
||||||
m_console.Commands.AddCommand("base", false, "quit",
|
m_console.Commands.AddCommand("General", false, "quit",
|
||||||
"quit",
|
"quit",
|
||||||
"Quit the application", HandleQuit);
|
"Quit the application", HandleQuit);
|
||||||
|
|
||||||
m_console.Commands.AddCommand("base", false, "shutdown",
|
m_console.Commands.AddCommand("General", false, "shutdown",
|
||||||
"shutdown",
|
"shutdown",
|
||||||
"Quit the application", HandleQuit);
|
"Quit the application", HandleQuit);
|
||||||
|
|
||||||
m_console.Commands.AddCommand("base", false, "set log level",
|
m_console.Commands.AddCommand("General", false, "set log level",
|
||||||
"set log level <level>",
|
"set log level <level>",
|
||||||
"Set the console logging level", HandleLogLevel);
|
"Set the console logging level", HandleLogLevel);
|
||||||
|
|
||||||
m_console.Commands.AddCommand("base", false, "show info",
|
m_console.Commands.AddCommand("General", false, "show info",
|
||||||
"show info",
|
"show info",
|
||||||
"Show general information about the server", HandleShow);
|
"Show general information about the server", HandleShow);
|
||||||
|
|
||||||
m_console.Commands.AddCommand("base", false, "show stats",
|
m_console.Commands.AddCommand("General", false, "show stats",
|
||||||
"show stats",
|
"show stats",
|
||||||
"Show statistics", HandleShow);
|
"Show statistics", HandleShow);
|
||||||
|
|
||||||
m_console.Commands.AddCommand("base", false, "show threads",
|
m_console.Commands.AddCommand("General", false, "show threads",
|
||||||
"show threads",
|
"show threads",
|
||||||
"Show thread status", HandleShow);
|
"Show thread status", HandleShow);
|
||||||
|
|
||||||
m_console.Commands.AddCommand("base", false, "show uptime",
|
m_console.Commands.AddCommand("General", false, "show uptime",
|
||||||
"show uptime",
|
"show uptime",
|
||||||
"Show server uptime", HandleShow);
|
"Show server uptime", HandleShow);
|
||||||
|
|
||||||
m_console.Commands.AddCommand("base", false, "show version",
|
m_console.Commands.AddCommand("General", false, "show version",
|
||||||
"show version",
|
"show version",
|
||||||
"Show server version", HandleShow);
|
"Show server version", HandleShow);
|
||||||
|
|
||||||
m_console.Commands.AddCommand("base", false, "threads abort",
|
m_console.Commands.AddCommand("General", false, "threads abort",
|
||||||
"threads abort <thread-id>",
|
"threads abort <thread-id>",
|
||||||
"Abort a managed thread. Use \"show threads\" to find possible threads.", HandleThreadsAbort);
|
"Abort a managed thread. Use \"show threads\" to find possible threads.", HandleThreadsAbort);
|
||||||
|
|
||||||
m_console.Commands.AddCommand("base", false, "threads show",
|
m_console.Commands.AddCommand("General", false, "threads show",
|
||||||
"threads show",
|
"threads show",
|
||||||
"Show thread status. Synonym for \"show threads\"",
|
"Show thread status. Synonym for \"show threads\"",
|
||||||
(string module, string[] args) => Notice(GetThreadsReport()));
|
(string module, string[] args) => Notice(GetThreadsReport()));
|
||||||
|
@ -247,7 +247,7 @@ namespace OpenSim.Framework.Servers
|
||||||
string reportFormat = "{0,6} {1,35} {2,16} {3,13} {4,10} {5,30}";
|
string reportFormat = "{0,6} {1,35} {2,16} {3,13} {4,10} {5,30}";
|
||||||
|
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
Watchdog.ThreadWatchdogInfo[] threads = Watchdog.GetThreads();
|
Watchdog.ThreadWatchdogInfo[] threads = Watchdog.GetThreadsInfo();
|
||||||
|
|
||||||
sb.Append(threads.Length + " threads are being tracked:" + Environment.NewLine);
|
sb.Append(threads.Length + " threads are being tracked:" + Environment.NewLine);
|
||||||
|
|
||||||
|
@ -308,7 +308,9 @@ namespace OpenSim.Framework.Servers
|
||||||
// clr version potentially is more confusing than helpful, since it doesn't tell us if we're running under Mono/MS .NET and
|
// clr version potentially is more confusing than helpful, since it doesn't tell us if we're running under Mono/MS .NET and
|
||||||
// the clr version number doesn't match the project version number under Mono.
|
// the clr version number doesn't match the project version number under Mono.
|
||||||
//m_log.Info("[STARTUP]: Virtual machine runtime version: " + Environment.Version + Environment.NewLine);
|
//m_log.Info("[STARTUP]: Virtual machine runtime version: " + Environment.Version + Environment.NewLine);
|
||||||
m_log.Info("[STARTUP]: Operating system version: " + Environment.OSVersion + Environment.NewLine);
|
m_log.InfoFormat(
|
||||||
|
"[STARTUP]: Operating system version: {0}, .NET platform {1}, {2}-bit\n",
|
||||||
|
Environment.OSVersion, Environment.OSVersion.Platform, Util.Is64BitProcess() ? "64" : "32");
|
||||||
|
|
||||||
StartupSpecific();
|
StartupSpecific();
|
||||||
|
|
||||||
|
|
|
@ -65,6 +65,7 @@ namespace OpenSim.Framework.Servers.HttpServer
|
||||||
String.Format("PollServiceWorkerThread{0}", i),
|
String.Format("PollServiceWorkerThread{0}", i),
|
||||||
ThreadPriority.Normal,
|
ThreadPriority.Normal,
|
||||||
false,
|
false,
|
||||||
|
true,
|
||||||
int.MaxValue);
|
int.MaxValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -73,6 +74,7 @@ namespace OpenSim.Framework.Servers.HttpServer
|
||||||
"PollServiceWatcherThread",
|
"PollServiceWatcherThread",
|
||||||
ThreadPriority.Normal,
|
ThreadPriority.Normal,
|
||||||
false,
|
false,
|
||||||
|
true,
|
||||||
1000 * 60 * 10);
|
1000 * 60 * 10);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -29,7 +29,7 @@ namespace OpenSim
|
||||||
{
|
{
|
||||||
public class VersionInfo
|
public class VersionInfo
|
||||||
{
|
{
|
||||||
private const string VERSION_NUMBER = "0.7.3";
|
private const string VERSION_NUMBER = "0.7.4";
|
||||||
private const Flavour VERSION_FLAVOUR = Flavour.Dev;
|
private const Flavour VERSION_FLAVOUR = Flavour.Dev;
|
||||||
|
|
||||||
public enum Flavour
|
public enum Flavour
|
||||||
|
|
|
@ -35,7 +35,8 @@ using System.IO;
|
||||||
using System.IO.Compression;
|
using System.IO.Compression;
|
||||||
using System.Net;
|
using System.Net;
|
||||||
using System.Net.Sockets;
|
using System.Net.Sockets;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
using System.Runtime.Serialization;
|
using System.Runtime.Serialization;
|
||||||
using System.Runtime.Serialization.Formatters.Binary;
|
using System.Runtime.Serialization.Formatters.Binary;
|
||||||
using System.Security.Cryptography;
|
using System.Security.Cryptography;
|
||||||
|
@ -375,6 +376,50 @@ namespace OpenSim.Framework
|
||||||
}
|
}
|
||||||
|
|
||||||
return sb.ToString();
|
return sb.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Is the platform Windows?
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>true if so, false otherwise</returns>
|
||||||
|
public static bool IsWindows()
|
||||||
|
{
|
||||||
|
PlatformID platformId = Environment.OSVersion.Platform;
|
||||||
|
|
||||||
|
return (platformId == PlatformID.Win32NT
|
||||||
|
|| platformId == PlatformID.Win32S
|
||||||
|
|| platformId == PlatformID.Win32Windows
|
||||||
|
|| platformId == PlatformID.WinCE);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static bool LoadArchSpecificWindowsDll(string libraryName)
|
||||||
|
{
|
||||||
|
// We do this so that OpenSimulator on Windows loads the correct native library depending on whether
|
||||||
|
// it's running as a 32-bit process or a 64-bit one. By invoking LoadLibary here, later DLLImports
|
||||||
|
// will find it already loaded later on.
|
||||||
|
//
|
||||||
|
// This isn't necessary for other platforms (e.g. Mac OSX and Linux) since the DLL used can be
|
||||||
|
// controlled in config files.
|
||||||
|
string nativeLibraryPath;
|
||||||
|
|
||||||
|
if (Util.Is64BitProcess())
|
||||||
|
nativeLibraryPath = "lib64/" + libraryName;
|
||||||
|
else
|
||||||
|
nativeLibraryPath = "lib32/" + libraryName;
|
||||||
|
|
||||||
|
m_log.DebugFormat("[UTIL]: Loading native Windows library at {0}", nativeLibraryPath);
|
||||||
|
|
||||||
|
if (Util.LoadLibrary(nativeLibraryPath) == IntPtr.Zero)
|
||||||
|
{
|
||||||
|
m_log.ErrorFormat(
|
||||||
|
"[UTIL]: Couldn't find native Windows library at {0}", nativeLibraryPath);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static bool IsEnvironmentSupported(ref string reason)
|
public static bool IsEnvironmentSupported(ref string reason)
|
||||||
|
@ -1457,6 +1502,27 @@ namespace OpenSim.Framework
|
||||||
}
|
}
|
||||||
|
|
||||||
return data;
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Used to trigger an early library load on Windows systems.
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// Required to get 32-bit and 64-bit processes to automatically use the
|
||||||
|
/// appropriate native library.
|
||||||
|
/// </remarks>
|
||||||
|
/// <param name="dllToLoad"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
[DllImport("kernel32.dll")]
|
||||||
|
public static extern IntPtr LoadLibrary(string dllToLoad);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Determine whether the current process is 64 bit
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>true if so, false if not</returns>
|
||||||
|
public static bool Is64BitProcess()
|
||||||
|
{
|
||||||
|
return IntPtr.Size == 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
#region FireAndForget Threading Pattern
|
#region FireAndForget Threading Pattern
|
||||||
|
|
|
@ -72,6 +72,11 @@ namespace OpenSim.Framework
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsTimedOut { get; set; }
|
public bool IsTimedOut { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Will this thread trigger the alarm function if it has timed out?
|
||||||
|
/// </summary>
|
||||||
|
public bool AlarmIfTimeout { get; set; }
|
||||||
|
|
||||||
public ThreadWatchdogInfo(Thread thread, int timeout)
|
public ThreadWatchdogInfo(Thread thread, int timeout)
|
||||||
{
|
{
|
||||||
Thread = thread;
|
Thread = thread;
|
||||||
|
@ -112,12 +117,13 @@ namespace OpenSim.Framework
|
||||||
/// <param name="start">The method that will be executed in a new thread</param>
|
/// <param name="start">The method that will be executed in a new thread</param>
|
||||||
/// <param name="name">A name to give to the new thread</param>
|
/// <param name="name">A name to give to the new thread</param>
|
||||||
/// <param name="priority">Priority to run the thread at</param>
|
/// <param name="priority">Priority to run the thread at</param>
|
||||||
/// <param name="isBackground">True to run this thread as a background
|
/// <param name="isBackground">True to run this thread as a background thread, otherwise false</param>
|
||||||
/// thread, otherwise false</param>
|
/// <param name="alarmIfTimeout">Trigger an alarm function is we have timed out</param>
|
||||||
/// <returns>The newly created Thread object</returns>
|
/// <returns>The newly created Thread object</returns>
|
||||||
public static Thread StartThread(ThreadStart start, string name, ThreadPriority priority, bool isBackground)
|
public static Thread StartThread(
|
||||||
|
ThreadStart start, string name, ThreadPriority priority, bool isBackground, bool alarmIfTimeout)
|
||||||
{
|
{
|
||||||
return StartThread(start, name, priority, isBackground, WATCHDOG_TIMEOUT_MS);
|
return StartThread(start, name, priority, isBackground, alarmIfTimeout, WATCHDOG_TIMEOUT_MS);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -128,21 +134,21 @@ namespace OpenSim.Framework
|
||||||
/// <param name="priority">Priority to run the thread at</param>
|
/// <param name="priority">Priority to run the thread at</param>
|
||||||
/// <param name="isBackground">True to run this thread as a background
|
/// <param name="isBackground">True to run this thread as a background
|
||||||
/// thread, otherwise false</param>
|
/// thread, otherwise false</param>
|
||||||
/// <param name="timeout">
|
/// <param name="alarmIfTimeout">Trigger an alarm function is we have timed out</param>
|
||||||
/// Number of milliseconds to wait until we issue a warning about timeout.
|
/// <param name="timeout">Number of milliseconds to wait until we issue a warning about timeout.</param>
|
||||||
/// </para>
|
|
||||||
/// <returns>The newly created Thread object</returns>
|
/// <returns>The newly created Thread object</returns>
|
||||||
public static Thread StartThread(
|
public static Thread StartThread(
|
||||||
ThreadStart start, string name, ThreadPriority priority, bool isBackground, int timeout)
|
ThreadStart start, string name, ThreadPriority priority, bool isBackground, bool alarmIfTimeout, int timeout)
|
||||||
{
|
{
|
||||||
Thread thread = new Thread(start);
|
Thread thread = new Thread(start);
|
||||||
thread.Name = name;
|
thread.Name = name;
|
||||||
thread.Priority = priority;
|
thread.Priority = priority;
|
||||||
thread.IsBackground = isBackground;
|
thread.IsBackground = isBackground;
|
||||||
|
|
||||||
ThreadWatchdogInfo twi = new ThreadWatchdogInfo(thread, timeout);
|
ThreadWatchdogInfo twi = new ThreadWatchdogInfo(thread, timeout) { AlarmIfTimeout = alarmIfTimeout };
|
||||||
|
|
||||||
m_log.Debug("[WATCHDOG]: Started tracking thread \"" + twi.Thread.Name + "\" (ID " + twi.Thread.ManagedThreadId + ")");
|
m_log.DebugFormat(
|
||||||
|
"[WATCHDOG]: Started tracking thread {0}, ID {1}", twi.Thread.Name, twi.Thread.ManagedThreadId);
|
||||||
|
|
||||||
lock (m_threads)
|
lock (m_threads)
|
||||||
m_threads.Add(twi.Thread.ManagedThreadId, twi);
|
m_threads.Add(twi.Thread.ManagedThreadId, twi);
|
||||||
|
@ -224,19 +230,39 @@ namespace OpenSim.Framework
|
||||||
/// Get currently watched threads for diagnostic purposes
|
/// Get currently watched threads for diagnostic purposes
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public static ThreadWatchdogInfo[] GetThreads()
|
public static ThreadWatchdogInfo[] GetThreadsInfo()
|
||||||
{
|
{
|
||||||
lock (m_threads)
|
lock (m_threads)
|
||||||
return m_threads.Values.ToArray();
|
return m_threads.Values.ToArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Return the current thread's watchdog info.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>The watchdog info. null if the thread isn't being monitored.</returns>
|
||||||
|
public static ThreadWatchdogInfo GetCurrentThreadInfo()
|
||||||
|
{
|
||||||
|
lock (m_threads)
|
||||||
|
{
|
||||||
|
if (m_threads.ContainsKey(Thread.CurrentThread.ManagedThreadId))
|
||||||
|
return m_threads[Thread.CurrentThread.ManagedThreadId];
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Check watched threads. Fire alarm if appropriate.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="sender"></param>
|
||||||
|
/// <param name="e"></param>
|
||||||
private static void WatchdogTimerElapsed(object sender, System.Timers.ElapsedEventArgs e)
|
private static void WatchdogTimerElapsed(object sender, System.Timers.ElapsedEventArgs e)
|
||||||
{
|
{
|
||||||
WatchdogTimeout callback = OnWatchdogTimeout;
|
WatchdogTimeout callback = OnWatchdogTimeout;
|
||||||
|
|
||||||
if (callback != null)
|
if (callback != null)
|
||||||
{
|
{
|
||||||
ThreadWatchdogInfo timedOut = null;
|
List<ThreadWatchdogInfo> callbackInfos = null;
|
||||||
|
|
||||||
lock (m_threads)
|
lock (m_threads)
|
||||||
{
|
{
|
||||||
|
@ -246,21 +272,31 @@ namespace OpenSim.Framework
|
||||||
{
|
{
|
||||||
if (threadInfo.Thread.ThreadState == ThreadState.Stopped)
|
if (threadInfo.Thread.ThreadState == ThreadState.Stopped)
|
||||||
{
|
{
|
||||||
timedOut = threadInfo;
|
|
||||||
RemoveThread(threadInfo.Thread.ManagedThreadId);
|
RemoveThread(threadInfo.Thread.ManagedThreadId);
|
||||||
break;
|
|
||||||
|
if (callbackInfos == null)
|
||||||
|
callbackInfos = new List<ThreadWatchdogInfo>();
|
||||||
|
|
||||||
|
callbackInfos.Add(threadInfo);
|
||||||
}
|
}
|
||||||
else if (!threadInfo.IsTimedOut && now - threadInfo.LastTick >= threadInfo.Timeout)
|
else if (!threadInfo.IsTimedOut && now - threadInfo.LastTick >= threadInfo.Timeout)
|
||||||
{
|
{
|
||||||
threadInfo.IsTimedOut = true;
|
threadInfo.IsTimedOut = true;
|
||||||
timedOut = threadInfo;
|
|
||||||
break;
|
if (threadInfo.AlarmIfTimeout)
|
||||||
|
{
|
||||||
|
if (callbackInfos == null)
|
||||||
|
callbackInfos = new List<ThreadWatchdogInfo>();
|
||||||
|
|
||||||
|
callbackInfos.Add(threadInfo);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (timedOut != null)
|
if (callbackInfos != null)
|
||||||
callback(timedOut.Thread, timedOut.LastTick);
|
foreach (ThreadWatchdogInfo callbackInfo in callbackInfos)
|
||||||
|
callback(callbackInfo.Thread, callbackInfo.LastTick);
|
||||||
}
|
}
|
||||||
|
|
||||||
m_watchdogTimer.Start();
|
m_watchdogTimer.Start();
|
||||||
|
|
|
@ -63,77 +63,32 @@ namespace OpenSim.Framework
|
||||||
// a "long" call for warning & debugging purposes
|
// a "long" call for warning & debugging purposes
|
||||||
public const int LongCallTime = 500;
|
public const int LongCallTime = 500;
|
||||||
|
|
||||||
// /// <summary>
|
// dictionary of end points
|
||||||
// /// Send LLSD to an HTTP client in application/llsd+json form
|
private static Dictionary<string,object> m_endpointSerializer = new Dictionary<string,object>();
|
||||||
// /// </summary>
|
|
||||||
// /// <param name="response">HTTP response to send the data in</param>
|
|
||||||
// /// <param name="body">LLSD to send to the client</param>
|
|
||||||
// public static void SendJSONResponse(OSHttpResponse response, OSDMap body)
|
|
||||||
// {
|
|
||||||
// byte[] responseData = Encoding.UTF8.GetBytes(OSDParser.SerializeJsonString(body));
|
|
||||||
//
|
|
||||||
// response.ContentEncoding = Encoding.UTF8;
|
|
||||||
// response.ContentLength = responseData.Length;
|
|
||||||
// response.ContentType = "application/llsd+json";
|
|
||||||
// response.Body.Write(responseData, 0, responseData.Length);
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// /// <summary>
|
|
||||||
// /// Send LLSD to an HTTP client in application/llsd+xml form
|
|
||||||
// /// </summary>
|
|
||||||
// /// <param name="response">HTTP response to send the data in</param>
|
|
||||||
// /// <param name="body">LLSD to send to the client</param>
|
|
||||||
// public static void SendXMLResponse(OSHttpResponse response, OSDMap body)
|
|
||||||
// {
|
|
||||||
// byte[] responseData = OSDParser.SerializeLLSDXmlBytes(body);
|
|
||||||
//
|
|
||||||
// response.ContentEncoding = Encoding.UTF8;
|
|
||||||
// response.ContentLength = responseData.Length;
|
|
||||||
// response.ContentType = "application/llsd+xml";
|
|
||||||
// response.Body.Write(responseData, 0, responseData.Length);
|
|
||||||
// }
|
|
||||||
|
|
||||||
/// <summary>
|
private static object EndPointLock(string url)
|
||||||
/// Make a GET or GET-like request to a web service that returns LLSD
|
|
||||||
/// or JSON data
|
|
||||||
/// </summary>
|
|
||||||
public static OSDMap ServiceRequest(string url, string httpVerb)
|
|
||||||
{
|
{
|
||||||
string errorMessage;
|
System.Uri uri = new System.Uri(url);
|
||||||
|
string endpoint = string.Format("{0}:{1}",uri.Host,uri.Port);
|
||||||
|
|
||||||
try
|
lock (m_endpointSerializer)
|
||||||
{
|
{
|
||||||
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
|
object eplock = null;
|
||||||
request.Method = httpVerb;
|
|
||||||
|
|
||||||
using (WebResponse response = request.GetResponse())
|
if (! m_endpointSerializer.TryGetValue(endpoint,out eplock))
|
||||||
{
|
{
|
||||||
using (Stream responseStream = response.GetResponseStream())
|
eplock = new object();
|
||||||
{
|
m_endpointSerializer.Add(endpoint,eplock);
|
||||||
try
|
// m_log.WarnFormat("[WEB UTIL] add a new host to end point serializer {0}",endpoint);
|
||||||
{
|
|
||||||
string responseStr = responseStream.GetStreamString();
|
|
||||||
OSD responseOSD = OSDParser.Deserialize(responseStr);
|
|
||||||
if (responseOSD.Type == OSDType.Map)
|
|
||||||
return (OSDMap)responseOSD;
|
|
||||||
else
|
|
||||||
errorMessage = "Response format was invalid.";
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
errorMessage = "Failed to parse the response.";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
m_log.Warn(httpVerb + " on URL " + url + " failed: " + ex.Message);
|
|
||||||
errorMessage = ex.Message;
|
|
||||||
}
|
|
||||||
|
|
||||||
return new OSDMap { { "Message", OSD.FromString("Service request failed. " + errorMessage) } };
|
return eplock;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#region JSONRequest
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// PUT JSON-encoded data to a web service that returns LLSD or
|
/// PUT JSON-encoded data to a web service that returns LLSD or
|
||||||
|
@ -165,6 +120,14 @@ namespace OpenSim.Framework
|
||||||
}
|
}
|
||||||
|
|
||||||
public static OSDMap ServiceOSDRequest(string url, OSDMap data, string method, int timeout, bool compressed)
|
public static OSDMap ServiceOSDRequest(string url, OSDMap data, string method, int timeout, bool compressed)
|
||||||
|
{
|
||||||
|
lock (EndPointLock(url))
|
||||||
|
{
|
||||||
|
return ServiceOSDRequestWorker(url,data,method,timeout,compressed);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static OSDMap ServiceOSDRequestWorker(string url, OSDMap data, string method, int timeout, bool compressed)
|
||||||
{
|
{
|
||||||
int reqnum = m_requestNumber++;
|
int reqnum = m_requestNumber++;
|
||||||
// m_log.DebugFormat("[WEB UTIL]: <{0}> start osd request for {1}, method {2}",reqnum,url,method);
|
// m_log.DebugFormat("[WEB UTIL]: <{0}> start osd request for {1}, method {2}",reqnum,url,method);
|
||||||
|
@ -303,6 +266,10 @@ namespace OpenSim.Framework
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endregion JSONRequest
|
||||||
|
|
||||||
|
#region FormRequest
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// POST URL-encoded form data to a web service that returns LLSD or
|
/// POST URL-encoded form data to a web service that returns LLSD or
|
||||||
/// JSON data
|
/// JSON data
|
||||||
|
@ -313,6 +280,14 @@ namespace OpenSim.Framework
|
||||||
}
|
}
|
||||||
|
|
||||||
public static OSDMap ServiceFormRequest(string url, NameValueCollection data, int timeout)
|
public static OSDMap ServiceFormRequest(string url, NameValueCollection data, int timeout)
|
||||||
|
{
|
||||||
|
lock (EndPointLock(url))
|
||||||
|
{
|
||||||
|
return ServiceFormRequestWorker(url,data,timeout);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static OSDMap ServiceFormRequestWorker(string url, NameValueCollection data, int timeout)
|
||||||
{
|
{
|
||||||
int reqnum = m_requestNumber++;
|
int reqnum = m_requestNumber++;
|
||||||
string method = (data != null && data["RequestMethod"] != null) ? data["RequestMethod"] : "unknown";
|
string method = (data != null && data["RequestMethod"] != null) ? data["RequestMethod"] : "unknown";
|
||||||
|
@ -397,6 +372,8 @@ namespace OpenSim.Framework
|
||||||
result["Message"] = OSD.FromString("Service request failed: " + msg);
|
result["Message"] = OSD.FromString("Service request failed: " + msg);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endregion FormRequest
|
||||||
|
|
||||||
#region Uri
|
#region Uri
|
||||||
|
|
||||||
|
@ -533,8 +510,13 @@ namespace OpenSim.Framework
|
||||||
/// <remarks>
|
/// <remarks>
|
||||||
/// Copying begins at the streams' current positions. The positions are
|
/// Copying begins at the streams' current positions. The positions are
|
||||||
/// NOT reset after copying is complete.
|
/// NOT reset after copying is complete.
|
||||||
|
/// NOTE!! .NET 4.0 adds the method 'Stream.CopyTo(stream, bufferSize)'.
|
||||||
|
/// This function could be replaced with that method once we move
|
||||||
|
/// totally to .NET 4.0. For versions before, this routine exists.
|
||||||
|
/// This routine used to be named 'CopyTo' but the int parameter has
|
||||||
|
/// a different meaning so this method was renamed to avoid any confusion.
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
public static int CopyTo(this Stream copyFrom, Stream copyTo, int maximumBytesToCopy)
|
public static int CopyStream(this Stream copyFrom, Stream copyTo, int maximumBytesToCopy)
|
||||||
{
|
{
|
||||||
byte[] buffer = new byte[4096];
|
byte[] buffer = new byte[4096];
|
||||||
int readBytes;
|
int readBytes;
|
||||||
|
|
|
@ -225,12 +225,12 @@ namespace OpenSim
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private void RegisterConsoleCommands()
|
private void RegisterConsoleCommands()
|
||||||
{
|
{
|
||||||
m_console.Commands.AddCommand("region", false, "force update",
|
m_console.Commands.AddCommand("Regions", false, "force update",
|
||||||
"force update",
|
"force update",
|
||||||
"Force the update of all objects on clients",
|
"Force the update of all objects on clients",
|
||||||
HandleForceUpdate);
|
HandleForceUpdate);
|
||||||
|
|
||||||
m_console.Commands.AddCommand("region", false, "debug packet",
|
m_console.Commands.AddCommand("Comms", false, "debug packet",
|
||||||
"debug packet <level> [<avatar-first-name> <avatar-last-name>]",
|
"debug packet <level> [<avatar-first-name> <avatar-last-name>]",
|
||||||
"Turn on packet debugging",
|
"Turn on packet debugging",
|
||||||
"If level > 255 then all incoming and outgoing packets are logged.\n"
|
"If level > 255 then all incoming and outgoing packets are logged.\n"
|
||||||
|
@ -242,7 +242,7 @@ namespace OpenSim
|
||||||
+ "If an avatar name is given then only packets from that avatar are logged",
|
+ "If an avatar name is given then only packets from that avatar are logged",
|
||||||
Debug);
|
Debug);
|
||||||
|
|
||||||
m_console.Commands.AddCommand("region", false, "debug http",
|
m_console.Commands.AddCommand("Comms", false, "debug http",
|
||||||
"debug http <level>",
|
"debug http <level>",
|
||||||
"Turn on inbound http request debugging for everything except the event queue (see debug eq).",
|
"Turn on inbound http request debugging for everything except the event queue (see debug eq).",
|
||||||
"If level >= 2 then the handler used to service the request is logged.\n"
|
"If level >= 2 then the handler used to service the request is logged.\n"
|
||||||
|
@ -250,37 +250,37 @@ namespace OpenSim
|
||||||
+ "If level <= 0 then no extra http logging is done.\n",
|
+ "If level <= 0 then no extra http logging is done.\n",
|
||||||
Debug);
|
Debug);
|
||||||
|
|
||||||
m_console.Commands.AddCommand("region", false, "debug teleport", "debug teleport", "Toggle teleport route debugging", Debug);
|
m_console.Commands.AddCommand("Comms", false, "debug teleport", "debug teleport", "Toggle teleport route debugging", Debug);
|
||||||
|
|
||||||
m_console.Commands.AddCommand("region", false, "debug scene",
|
m_console.Commands.AddCommand("Regions", false, "debug scene",
|
||||||
"debug scene <scripting> <collisions> <physics>",
|
"debug scene <scripting> <collisions> <physics>",
|
||||||
"Turn on scene debugging", Debug);
|
"Turn on scene debugging", Debug);
|
||||||
|
|
||||||
m_console.Commands.AddCommand("region", false, "change region",
|
m_console.Commands.AddCommand("General", false, "change region",
|
||||||
"change region <region name>",
|
"change region <region name>",
|
||||||
"Change current console region", ChangeSelectedRegion);
|
"Change current console region", ChangeSelectedRegion);
|
||||||
|
|
||||||
m_console.Commands.AddCommand("region", false, "save xml",
|
m_console.Commands.AddCommand("Archiving", false, "save xml",
|
||||||
"save xml",
|
"save xml",
|
||||||
"Save a region's data in XML format", SaveXml);
|
"Save a region's data in XML format", SaveXml);
|
||||||
|
|
||||||
m_console.Commands.AddCommand("region", false, "save xml2",
|
m_console.Commands.AddCommand("Archiving", false, "save xml2",
|
||||||
"save xml2",
|
"save xml2",
|
||||||
"Save a region's data in XML2 format", SaveXml2);
|
"Save a region's data in XML2 format", SaveXml2);
|
||||||
|
|
||||||
m_console.Commands.AddCommand("region", false, "load xml",
|
m_console.Commands.AddCommand("Archiving", false, "load xml",
|
||||||
"load xml [-newIDs [<x> <y> <z>]]",
|
"load xml [-newIDs [<x> <y> <z>]]",
|
||||||
"Load a region's data from XML format", LoadXml);
|
"Load a region's data from XML format", LoadXml);
|
||||||
|
|
||||||
m_console.Commands.AddCommand("region", false, "load xml2",
|
m_console.Commands.AddCommand("Archiving", false, "load xml2",
|
||||||
"load xml2",
|
"load xml2",
|
||||||
"Load a region's data from XML2 format", LoadXml2);
|
"Load a region's data from XML2 format", LoadXml2);
|
||||||
|
|
||||||
m_console.Commands.AddCommand("region", false, "save prims xml2",
|
m_console.Commands.AddCommand("Archiving", false, "save prims xml2",
|
||||||
"save prims xml2 [<prim name> <file name>]",
|
"save prims xml2 [<prim name> <file name>]",
|
||||||
"Save named prim to XML2", SavePrimsXml2);
|
"Save named prim to XML2", SavePrimsXml2);
|
||||||
|
|
||||||
m_console.Commands.AddCommand("region", false, "load oar",
|
m_console.Commands.AddCommand("Archiving", false, "load oar",
|
||||||
"load oar [--merge] [--skip-assets] [<OAR path>]",
|
"load oar [--merge] [--skip-assets] [<OAR path>]",
|
||||||
"Load a region's data from an OAR archive.",
|
"Load a region's data from an OAR archive.",
|
||||||
"--merge will merge the OAR with the existing scene." + Environment.NewLine
|
"--merge will merge the OAR with the existing scene." + Environment.NewLine
|
||||||
|
@ -289,7 +289,7 @@ namespace OpenSim
|
||||||
+ " If this is not given then the command looks for an OAR named region.oar in the current directory.",
|
+ " If this is not given then the command looks for an OAR named region.oar in the current directory.",
|
||||||
LoadOar);
|
LoadOar);
|
||||||
|
|
||||||
m_console.Commands.AddCommand("region", false, "save oar",
|
m_console.Commands.AddCommand("Archiving", false, "save oar",
|
||||||
//"save oar [-v|--version=<N>] [-p|--profile=<url>] [<OAR path>]",
|
//"save oar [-v|--version=<N>] [-p|--profile=<url>] [<OAR path>]",
|
||||||
"save oar [-h|--home=<url>] [--noassets] [--publish] [--perm=<permissions>] [<OAR path>]",
|
"save oar [-h|--home=<url>] [--noassets] [--publish] [--perm=<permissions>] [<OAR path>]",
|
||||||
"Save a region's data to an OAR archive.",
|
"Save a region's data to an OAR archive.",
|
||||||
|
@ -306,54 +306,54 @@ namespace OpenSim
|
||||||
+ " If this is not given then the oar is saved to region.oar in the current directory.",
|
+ " If this is not given then the oar is saved to region.oar in the current directory.",
|
||||||
SaveOar);
|
SaveOar);
|
||||||
|
|
||||||
m_console.Commands.AddCommand("region", false, "edit scale",
|
m_console.Commands.AddCommand("Regions", false, "edit scale",
|
||||||
"edit scale <name> <x> <y> <z>",
|
"edit scale <name> <x> <y> <z>",
|
||||||
"Change the scale of a named prim", HandleEditScale);
|
"Change the scale of a named prim", HandleEditScale);
|
||||||
|
|
||||||
m_console.Commands.AddCommand("region", false, "kick user",
|
m_console.Commands.AddCommand("Users", false, "kick user",
|
||||||
"kick user <first> <last> [message]",
|
"kick user <first> <last> [message]",
|
||||||
"Kick a user off the simulator", KickUserCommand);
|
"Kick a user off the simulator", KickUserCommand);
|
||||||
|
|
||||||
m_console.Commands.AddCommand("region", false, "show users",
|
m_console.Commands.AddCommand("Users", false, "show users",
|
||||||
"show users [full]",
|
"show users [full]",
|
||||||
"Show user data for users currently on the region",
|
"Show user data for users currently on the region",
|
||||||
"Without the 'full' option, only users actually on the region are shown."
|
"Without the 'full' option, only users actually on the region are shown."
|
||||||
+ " With the 'full' option child agents of users in neighbouring regions are also shown.",
|
+ " With the 'full' option child agents of users in neighbouring regions are also shown.",
|
||||||
HandleShow);
|
HandleShow);
|
||||||
|
|
||||||
m_console.Commands.AddCommand("region", false, "show connections",
|
m_console.Commands.AddCommand("Comms", false, "show connections",
|
||||||
"show connections",
|
"show connections",
|
||||||
"Show connection data", HandleShow);
|
"Show connection data", HandleShow);
|
||||||
|
|
||||||
m_console.Commands.AddCommand("region", false, "show circuits",
|
m_console.Commands.AddCommand("Comms", false, "show circuits",
|
||||||
"show circuits",
|
"show circuits",
|
||||||
"Show agent circuit data", HandleShow);
|
"Show agent circuit data", HandleShow);
|
||||||
|
|
||||||
m_console.Commands.AddCommand("region", false, "show http-handlers",
|
m_console.Commands.AddCommand("Comms", false, "show http-handlers",
|
||||||
"show http-handlers",
|
"show http-handlers",
|
||||||
"Show all registered http handlers", HandleShow);
|
"Show all registered http handlers", HandleShow);
|
||||||
|
|
||||||
m_console.Commands.AddCommand("region", false, "show pending-objects",
|
m_console.Commands.AddCommand("Comms", false, "show pending-objects",
|
||||||
"show pending-objects",
|
"show pending-objects",
|
||||||
"Show # of objects on the pending queues of all scene viewers", HandleShow);
|
"Show # of objects on the pending queues of all scene viewers", HandleShow);
|
||||||
|
|
||||||
m_console.Commands.AddCommand("region", false, "show modules",
|
m_console.Commands.AddCommand("General", false, "show modules",
|
||||||
"show modules",
|
"show modules",
|
||||||
"Show module data", HandleShow);
|
"Show module data", HandleShow);
|
||||||
|
|
||||||
m_console.Commands.AddCommand("region", false, "show regions",
|
m_console.Commands.AddCommand("Regions", false, "show regions",
|
||||||
"show regions",
|
"show regions",
|
||||||
"Show region data", HandleShow);
|
"Show region data", HandleShow);
|
||||||
|
|
||||||
m_console.Commands.AddCommand("region", false, "show ratings",
|
m_console.Commands.AddCommand("Regions", false, "show ratings",
|
||||||
"show ratings",
|
"show ratings",
|
||||||
"Show rating data", HandleShow);
|
"Show rating data", HandleShow);
|
||||||
|
|
||||||
m_console.Commands.AddCommand("region", false, "backup",
|
m_console.Commands.AddCommand("Regions", false, "backup",
|
||||||
"backup",
|
"backup",
|
||||||
"Persist currently unsaved object changes immediately instead of waiting for the normal persistence call.", RunCommand);
|
"Persist currently unsaved object changes immediately instead of waiting for the normal persistence call.", RunCommand);
|
||||||
|
|
||||||
m_console.Commands.AddCommand("region", false, "create region",
|
m_console.Commands.AddCommand("Regions", false, "create region",
|
||||||
"create region [\"region name\"] <region_file.ini>",
|
"create region [\"region name\"] <region_file.ini>",
|
||||||
"Create a new region.",
|
"Create a new region.",
|
||||||
"The settings for \"region name\" are read from <region_file.ini>. Paths specified with <region_file.ini> are relative to your Regions directory, unless an absolute path is given."
|
"The settings for \"region name\" are read from <region_file.ini>. Paths specified with <region_file.ini> are relative to your Regions directory, unless an absolute path is given."
|
||||||
|
@ -362,62 +362,57 @@ namespace OpenSim
|
||||||
+ "If <region_file.ini> does not exist, it will be created.",
|
+ "If <region_file.ini> does not exist, it will be created.",
|
||||||
HandleCreateRegion);
|
HandleCreateRegion);
|
||||||
|
|
||||||
m_console.Commands.AddCommand("region", false, "restart",
|
m_console.Commands.AddCommand("Regions", false, "restart",
|
||||||
"restart",
|
"restart",
|
||||||
"Restart all sims in this instance", RunCommand);
|
"Restart all sims in this instance", RunCommand);
|
||||||
|
|
||||||
m_console.Commands.AddCommand("region", false, "config set",
|
m_console.Commands.AddCommand("General", false, "config set",
|
||||||
"config set <section> <key> <value>",
|
"config set <section> <key> <value>",
|
||||||
"Set a config option. In most cases this is not useful since changed parameters are not dynamically reloaded. Neither do changed parameters persist - you will have to change a config file manually and restart.", HandleConfig);
|
"Set a config option. In most cases this is not useful since changed parameters are not dynamically reloaded. Neither do changed parameters persist - you will have to change a config file manually and restart.", HandleConfig);
|
||||||
|
|
||||||
m_console.Commands.AddCommand("region", false, "config get",
|
m_console.Commands.AddCommand("General", false, "config get",
|
||||||
"config get [<section>] [<key>]",
|
"config get [<section>] [<key>]",
|
||||||
"Synonym for config show",
|
"Synonym for config show",
|
||||||
HandleConfig);
|
HandleConfig);
|
||||||
|
|
||||||
m_console.Commands.AddCommand("region", false, "config show",
|
m_console.Commands.AddCommand("General", false, "config show",
|
||||||
"config show [<section>] [<key>]",
|
"config show [<section>] [<key>]",
|
||||||
"Show config information",
|
"Show config information",
|
||||||
"If neither section nor field are specified, then the whole current configuration is printed." + Environment.NewLine
|
"If neither section nor field are specified, then the whole current configuration is printed." + Environment.NewLine
|
||||||
+ "If a section is given but not a field, then all fields in that section are printed.",
|
+ "If a section is given but not a field, then all fields in that section are printed.",
|
||||||
HandleConfig);
|
HandleConfig);
|
||||||
|
|
||||||
m_console.Commands.AddCommand("region", false, "config save",
|
m_console.Commands.AddCommand("General", false, "config save",
|
||||||
"config save <path>",
|
"config save <path>",
|
||||||
"Save current configuration to a file at the given path", HandleConfig);
|
"Save current configuration to a file at the given path", HandleConfig);
|
||||||
|
|
||||||
m_console.Commands.AddCommand("region", false, "command-script",
|
m_console.Commands.AddCommand("General", false, "command-script",
|
||||||
"command-script <script>",
|
"command-script <script>",
|
||||||
"Run a command script from file", RunCommand);
|
"Run a command script from file", RunCommand);
|
||||||
|
|
||||||
m_console.Commands.AddCommand("region", false, "remove-region",
|
m_console.Commands.AddCommand("Regions", false, "remove-region",
|
||||||
"remove-region <name>",
|
"remove-region <name>",
|
||||||
"Remove a region from this simulator", RunCommand);
|
"Remove a region from this simulator", RunCommand);
|
||||||
|
|
||||||
m_console.Commands.AddCommand("region", false, "delete-region",
|
m_console.Commands.AddCommand("Regions", false, "delete-region",
|
||||||
"delete-region <name>",
|
"delete-region <name>",
|
||||||
"Delete a region from disk", RunCommand);
|
"Delete a region from disk", RunCommand);
|
||||||
|
|
||||||
m_console.Commands.AddCommand("region", false, "modules list",
|
m_console.Commands.AddCommand("General", false, "modules list",
|
||||||
"modules list",
|
"modules list",
|
||||||
"List modules", HandleModules);
|
"List modules", HandleModules);
|
||||||
|
|
||||||
m_console.Commands.AddCommand("region", false, "modules load",
|
m_console.Commands.AddCommand("General", false, "modules load",
|
||||||
"modules load <name>",
|
"modules load <name>",
|
||||||
"Load a module", HandleModules);
|
"Load a module", HandleModules);
|
||||||
|
|
||||||
m_console.Commands.AddCommand("region", false, "modules unload",
|
m_console.Commands.AddCommand("General", false, "modules unload",
|
||||||
"modules unload <name>",
|
"modules unload <name>",
|
||||||
"Unload a module", HandleModules);
|
"Unload a module", HandleModules);
|
||||||
|
|
||||||
m_console.Commands.AddCommand("region", false, "Add-InventoryHost",
|
m_console.Commands.AddCommand("Regions", false, "kill uuid",
|
||||||
"Add-InventoryHost <host>",
|
|
||||||
String.Empty, RunCommand);
|
|
||||||
|
|
||||||
m_console.Commands.AddCommand("region", false, "kill uuid",
|
|
||||||
"kill uuid <UUID>",
|
"kill uuid <UUID>",
|
||||||
"Kill an object by UUID", KillUUID);
|
"Kill an object by UUID", KillUUID);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void ShutdownSpecific()
|
public override void ShutdownSpecific()
|
||||||
|
@ -829,14 +824,6 @@ namespace OpenSim
|
||||||
case "restart":
|
case "restart":
|
||||||
m_sceneManager.RestartCurrentScene();
|
m_sceneManager.RestartCurrentScene();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "Add-InventoryHost":
|
|
||||||
if (cmdparams.Length > 0)
|
|
||||||
{
|
|
||||||
MainConsole.Instance.Output("Not implemented.");
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -28,6 +28,7 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
using System.Net;
|
using System.Net;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
@ -67,6 +68,9 @@ namespace OpenSim
|
||||||
private const string PLUGIN_ASSET_CACHE = "/OpenSim/AssetCache";
|
private const string PLUGIN_ASSET_CACHE = "/OpenSim/AssetCache";
|
||||||
private const string PLUGIN_ASSET_SERVER_CLIENT = "/OpenSim/AssetClient";
|
private const string PLUGIN_ASSET_SERVER_CLIENT = "/OpenSim/AssetClient";
|
||||||
|
|
||||||
|
// OpenSim.ini Section name for ESTATES Settings
|
||||||
|
public const string ESTATE_SECTION_NAME = "Estates";
|
||||||
|
|
||||||
protected string proxyUrl;
|
protected string proxyUrl;
|
||||||
protected int proxyOffset = 0;
|
protected int proxyOffset = 0;
|
||||||
|
|
||||||
|
@ -242,15 +246,17 @@ namespace OpenSim
|
||||||
|
|
||||||
foreach (string topic in topics)
|
foreach (string topic in topics)
|
||||||
{
|
{
|
||||||
m_console.Commands.AddCommand("plugin", false, "help " + topic,
|
string capitalizedTopic = char.ToUpper(topic[0]) + topic.Substring(1);
|
||||||
"help " + topic,
|
|
||||||
|
m_console.Commands.AddCommand(capitalizedTopic, false, "help " + capitalizedTopic,
|
||||||
|
"help " + capitalizedTopic,
|
||||||
"Get help on plugin command '" + topic + "'",
|
"Get help on plugin command '" + topic + "'",
|
||||||
HandleCommanderHelp);
|
HandleCommanderHelp);
|
||||||
|
//
|
||||||
m_console.Commands.AddCommand("plugin", false, topic,
|
// m_console.Commands.AddCommand("General", false, topic,
|
||||||
topic,
|
// topic,
|
||||||
"Execute subcommand for plugin '" + topic + "'",
|
// "Execute subcommand for plugin '" + topic + "'",
|
||||||
null);
|
// null);
|
||||||
|
|
||||||
ICommander commander = null;
|
ICommander commander = null;
|
||||||
|
|
||||||
|
@ -267,7 +273,7 @@ namespace OpenSim
|
||||||
|
|
||||||
foreach (string command in commander.Commands.Keys)
|
foreach (string command in commander.Commands.Keys)
|
||||||
{
|
{
|
||||||
m_console.Commands.AddCommand(topic, false,
|
m_console.Commands.AddCommand(capitalizedTopic, false,
|
||||||
topic + " " + command,
|
topic + " " + command,
|
||||||
topic + " " + commander.Commands[command].ShortHelp(),
|
topic + " " + commander.Commands[command].ShortHelp(),
|
||||||
String.Empty, HandleCommanderCommand);
|
String.Empty, HandleCommanderCommand);
|
||||||
|
@ -286,7 +292,7 @@ namespace OpenSim
|
||||||
// Only safe for the interactive console, since it won't
|
// Only safe for the interactive console, since it won't
|
||||||
// let us come here unless both scene and commander exist
|
// let us come here unless both scene and commander exist
|
||||||
//
|
//
|
||||||
ICommander moduleCommander = SceneManager.CurrentOrFirstScene.GetCommander(cmd[1]);
|
ICommander moduleCommander = SceneManager.CurrentOrFirstScene.GetCommander(cmd[1].ToLower());
|
||||||
if (moduleCommander != null)
|
if (moduleCommander != null)
|
||||||
m_console.Output(moduleCommander.Help);
|
m_console.Output(moduleCommander.Help);
|
||||||
}
|
}
|
||||||
|
@ -443,12 +449,42 @@ namespace OpenSim
|
||||||
{
|
{
|
||||||
RegionInfo regionInfo = scene.RegionInfo;
|
RegionInfo regionInfo = scene.RegionInfo;
|
||||||
|
|
||||||
|
string estateOwnerFirstName = null;
|
||||||
|
string estateOwnerLastName = null;
|
||||||
|
string estateOwnerEMail = null;
|
||||||
|
string estateOwnerPassword = null;
|
||||||
|
string rawEstateOwnerUuid = null;
|
||||||
|
|
||||||
|
if (m_config.Source.Configs[ESTATE_SECTION_NAME] != null)
|
||||||
|
{
|
||||||
|
string defaultEstateOwnerName
|
||||||
|
= m_config.Source.Configs[ESTATE_SECTION_NAME].GetString("DefaultEstateOwnerName", "").Trim();
|
||||||
|
string[] ownerNames = defaultEstateOwnerName.Split(' ');
|
||||||
|
|
||||||
|
if (ownerNames.Length >= 2)
|
||||||
|
{
|
||||||
|
estateOwnerFirstName = ownerNames[0];
|
||||||
|
estateOwnerLastName = ownerNames[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Info to be used only on Standalone Mode
|
||||||
|
rawEstateOwnerUuid = m_config.Source.Configs[ESTATE_SECTION_NAME].GetString("DefaultEstateOwnerUUID", null);
|
||||||
|
estateOwnerEMail = m_config.Source.Configs[ESTATE_SECTION_NAME].GetString("DefaultEstateOwnerEMail", null);
|
||||||
|
estateOwnerPassword = m_config.Source.Configs[ESTATE_SECTION_NAME].GetString("DefaultEstateOwnerPassword", null);
|
||||||
|
}
|
||||||
|
|
||||||
MainConsole.Instance.OutputFormat("Estate {0} has no owner set.", regionInfo.EstateSettings.EstateName);
|
MainConsole.Instance.OutputFormat("Estate {0} has no owner set.", regionInfo.EstateSettings.EstateName);
|
||||||
List<char> excluded = new List<char>(new char[1]{' '});
|
List<char> excluded = new List<char>(new char[1]{' '});
|
||||||
string first = MainConsole.Instance.CmdPrompt("Estate owner first name", "Test", excluded);
|
|
||||||
string last = MainConsole.Instance.CmdPrompt("Estate owner last name", "User", excluded);
|
|
||||||
|
|
||||||
UserAccount account = scene.UserAccountService.GetUserAccount(regionInfo.ScopeID, first, last);
|
|
||||||
|
if (estateOwnerFirstName == null || estateOwnerLastName == null)
|
||||||
|
{
|
||||||
|
estateOwnerFirstName = MainConsole.Instance.CmdPrompt("Estate owner first name", "Test", excluded);
|
||||||
|
estateOwnerLastName = MainConsole.Instance.CmdPrompt("Estate owner last name", "User", excluded);
|
||||||
|
}
|
||||||
|
|
||||||
|
UserAccount account
|
||||||
|
= scene.UserAccountService.GetUserAccount(regionInfo.ScopeID, estateOwnerFirstName, estateOwnerLastName);
|
||||||
|
|
||||||
if (account == null)
|
if (account == null)
|
||||||
{
|
{
|
||||||
|
@ -467,23 +503,35 @@ namespace OpenSim
|
||||||
|
|
||||||
if (scene.UserAccountService is UserAccountService)
|
if (scene.UserAccountService is UserAccountService)
|
||||||
{
|
{
|
||||||
string password = MainConsole.Instance.PasswdPrompt("Password");
|
if (estateOwnerPassword == null)
|
||||||
string email = MainConsole.Instance.CmdPrompt("Email", "");
|
estateOwnerPassword = MainConsole.Instance.PasswdPrompt("Password");
|
||||||
|
|
||||||
string rawPrincipalId = MainConsole.Instance.CmdPrompt("User ID", UUID.Random().ToString());
|
if (estateOwnerEMail == null)
|
||||||
|
estateOwnerEMail = MainConsole.Instance.CmdPrompt("Email");
|
||||||
|
|
||||||
|
if (rawEstateOwnerUuid == null)
|
||||||
|
rawEstateOwnerUuid = MainConsole.Instance.CmdPrompt("User ID", UUID.Random().ToString());
|
||||||
|
|
||||||
UUID principalId = UUID.Zero;
|
UUID estateOwnerUuid = UUID.Zero;
|
||||||
if (!UUID.TryParse(rawPrincipalId, out principalId))
|
if (!UUID.TryParse(rawEstateOwnerUuid, out estateOwnerUuid))
|
||||||
{
|
{
|
||||||
m_log.ErrorFormat("[OPENSIM]: ID {0} is not a valid UUID", rawPrincipalId);
|
m_log.ErrorFormat("[OPENSIM]: ID {0} is not a valid UUID", rawEstateOwnerUuid);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If we've been given a zero uuid then this signals that we should use a random user id
|
||||||
|
if (estateOwnerUuid == UUID.Zero)
|
||||||
|
estateOwnerUuid = UUID.Random();
|
||||||
|
|
||||||
account
|
account
|
||||||
= ((UserAccountService)scene.UserAccountService).CreateUser(
|
= ((UserAccountService)scene.UserAccountService).CreateUser(
|
||||||
regionInfo.ScopeID, principalId, first, last, password, email);
|
regionInfo.ScopeID,
|
||||||
|
estateOwnerUuid,
|
||||||
|
estateOwnerFirstName,
|
||||||
|
estateOwnerLastName,
|
||||||
|
estateOwnerPassword,
|
||||||
|
estateOwnerEMail);
|
||||||
}
|
}
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (account == null)
|
if (account == null)
|
||||||
|
@ -883,15 +931,21 @@ namespace OpenSim
|
||||||
/// This method doesn't allow an estate to be created with the same name as existing estates.
|
/// This method doesn't allow an estate to be created with the same name as existing estates.
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
/// <param name="regInfo"></param>
|
/// <param name="regInfo"></param>
|
||||||
/// <param name="existingName">A list of estate names that already exist.</param>
|
/// <param name="estatesByName">A list of estate names that already exist.</param>
|
||||||
|
/// <param name="estateName">Estate name to create if already known</param>
|
||||||
/// <returns>true if the estate was created, false otherwise</returns>
|
/// <returns>true if the estate was created, false otherwise</returns>
|
||||||
public bool CreateEstate(RegionInfo regInfo, List<string> existingNames)
|
public bool CreateEstate(RegionInfo regInfo, Dictionary<string, EstateSettings> estatesByName, string estateName)
|
||||||
{
|
{
|
||||||
// Create a new estate
|
// Create a new estate
|
||||||
regInfo.EstateSettings = EstateDataService.LoadEstateSettings(regInfo.RegionID, true);
|
regInfo.EstateSettings = EstateDataService.LoadEstateSettings(regInfo.RegionID, true);
|
||||||
string newName = MainConsole.Instance.CmdPrompt("New estate name", regInfo.EstateSettings.EstateName);
|
|
||||||
|
|
||||||
if (existingNames.Contains(newName))
|
string newName;
|
||||||
|
if (estateName != null && estateName != "")
|
||||||
|
newName = estateName;
|
||||||
|
else
|
||||||
|
newName = MainConsole.Instance.CmdPrompt("New estate name", regInfo.EstateSettings.EstateName);
|
||||||
|
|
||||||
|
if (estatesByName.ContainsKey(newName))
|
||||||
{
|
{
|
||||||
MainConsole.Instance.OutputFormat("An estate named {0} already exists. Please try again.", newName);
|
MainConsole.Instance.OutputFormat("An estate named {0} already exists. Please try again.", newName);
|
||||||
return false;
|
return false;
|
||||||
|
@ -918,66 +972,102 @@ namespace OpenSim
|
||||||
if (EstateDataService != null)
|
if (EstateDataService != null)
|
||||||
regInfo.EstateSettings = EstateDataService.LoadEstateSettings(regInfo.RegionID, false);
|
regInfo.EstateSettings = EstateDataService.LoadEstateSettings(regInfo.RegionID, false);
|
||||||
|
|
||||||
if (regInfo.EstateSettings.EstateID == 0) // No record at all
|
if (regInfo.EstateSettings.EstateID != 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
m_log.WarnFormat("[ESTATE] Region {0} is not part of an estate.", regInfo.RegionName);
|
||||||
|
|
||||||
|
List<EstateSettings> estates = EstateDataService.LoadEstateSettingsAll();
|
||||||
|
Dictionary<string, EstateSettings> estatesByName = new Dictionary<string, EstateSettings>();
|
||||||
|
|
||||||
|
foreach (EstateSettings estate in estates)
|
||||||
|
estatesByName[estate.EstateName] = estate;
|
||||||
|
|
||||||
|
string defaultEstateName = null;
|
||||||
|
|
||||||
|
if (m_config.Source.Configs[ESTATE_SECTION_NAME] != null)
|
||||||
{
|
{
|
||||||
m_log.WarnFormat("[ESTATE] Region {0} is not part of an estate.", regInfo.RegionName);
|
defaultEstateName = m_config.Source.Configs[ESTATE_SECTION_NAME].GetString("DefaultEstateName", null);
|
||||||
|
|
||||||
List<EstateSettings> estates = EstateDataService.LoadEstateSettingsAll();
|
if (defaultEstateName != null)
|
||||||
List<string> estateNames = new List<string>();
|
|
||||||
foreach (EstateSettings estate in estates)
|
|
||||||
estateNames.Add(estate.EstateName);
|
|
||||||
|
|
||||||
while (true)
|
|
||||||
{
|
{
|
||||||
if (estates.Count == 0)
|
EstateSettings defaultEstate;
|
||||||
{
|
bool defaultEstateJoined = false;
|
||||||
m_log.Info("[ESTATE] No existing estates found. You must create a new one.");
|
|
||||||
|
if (estatesByName.ContainsKey(defaultEstateName))
|
||||||
if (CreateEstate(regInfo, estateNames))
|
{
|
||||||
break;
|
defaultEstate = estatesByName[defaultEstateName];
|
||||||
|
|
||||||
|
if (EstateDataService.LinkRegion(regInfo.RegionID, (int)defaultEstate.EstateID))
|
||||||
|
defaultEstateJoined = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (CreateEstate(regInfo, estatesByName, defaultEstateName))
|
||||||
|
defaultEstateJoined = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (defaultEstateJoined)
|
||||||
|
return;
|
||||||
|
else
|
||||||
|
m_log.ErrorFormat(
|
||||||
|
"[OPENSIM BASE]: Joining default estate {0} failed", defaultEstateName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If we have no default estate or creation of the default estate failed then ask the user.
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
if (estates.Count == 0)
|
||||||
|
{
|
||||||
|
m_log.Info("[ESTATE]: No existing estates found. You must create a new one.");
|
||||||
|
|
||||||
|
if (CreateEstate(regInfo, estatesByName, null))
|
||||||
|
break;
|
||||||
|
else
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
string response
|
||||||
|
= MainConsole.Instance.CmdPrompt(
|
||||||
|
string.Format(
|
||||||
|
"Do you wish to join region {0} to an existing estate (yes/no)?", regInfo.RegionName),
|
||||||
|
"yes",
|
||||||
|
new List<string>() { "yes", "no" });
|
||||||
|
|
||||||
|
if (response == "no")
|
||||||
|
{
|
||||||
|
if (CreateEstate(regInfo, estatesByName, null))
|
||||||
|
break;
|
||||||
else
|
else
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
string response
|
string[] estateNames = estatesByName.Keys.ToArray();
|
||||||
|
response
|
||||||
= MainConsole.Instance.CmdPrompt(
|
= MainConsole.Instance.CmdPrompt(
|
||||||
string.Format(
|
string.Format(
|
||||||
"Do you wish to join region {0} to an existing estate (yes/no)?", regInfo.RegionName),
|
"Name of estate to join. Existing estate names are ({0})",
|
||||||
"yes",
|
string.Join(", ", estateNames)),
|
||||||
new List<string>() { "yes", "no" });
|
estateNames[0]);
|
||||||
|
|
||||||
if (response == "no")
|
List<int> estateIDs = EstateDataService.GetEstates(response);
|
||||||
|
if (estateIDs.Count < 1)
|
||||||
{
|
{
|
||||||
if (CreateEstate(regInfo, estateNames))
|
MainConsole.Instance.Output("The name you have entered matches no known estate. Please try again.");
|
||||||
break;
|
continue;
|
||||||
else
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
response
|
|
||||||
= MainConsole.Instance.CmdPrompt(
|
|
||||||
string.Format(
|
|
||||||
"Name of estate to join. Existing estate names are ({0})", string.Join(", ", estateNames.ToArray())),
|
|
||||||
estateNames[0]);
|
|
||||||
|
|
||||||
List<int> estateIDs = EstateDataService.GetEstates(response);
|
|
||||||
if (estateIDs.Count < 1)
|
|
||||||
{
|
|
||||||
MainConsole.Instance.Output("The name you have entered matches no known estate. Please try again.");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
int estateID = estateIDs[0];
|
|
||||||
|
|
||||||
regInfo.EstateSettings = EstateDataService.LoadEstateSettings(estateID);
|
|
||||||
|
|
||||||
if (EstateDataService.LinkRegion(regInfo.RegionID, estateID))
|
|
||||||
break;
|
|
||||||
|
|
||||||
MainConsole.Instance.Output("Joining the estate failed. Please try again.");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int estateID = estateIDs[0];
|
||||||
|
|
||||||
|
regInfo.EstateSettings = EstateDataService.LoadEstateSettings(estateID);
|
||||||
|
|
||||||
|
if (EstateDataService.LinkRegion(regInfo.RegionID, estateID))
|
||||||
|
break;
|
||||||
|
|
||||||
|
MainConsole.Instance.Output("Joining the estate failed. Please try again.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -262,7 +262,7 @@ namespace OpenSim.Region.ClientStack.Linden
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
m_log.Debug("[CAPS]: ScriptTaskInventory Request in region: " + m_regionName);
|
// m_log.Debug("[CAPS]: ScriptTaskInventory Request in region: " + m_regionName);
|
||||||
//m_log.DebugFormat("[CAPS]: request: {0}, path: {1}, param: {2}", request, path, param);
|
//m_log.DebugFormat("[CAPS]: request: {0}, path: {1}, param: {2}", request, path, param);
|
||||||
|
|
||||||
Hashtable hash = (Hashtable)LLSD.LLSDDeserialize(Utils.StringToBytes(request));
|
Hashtable hash = (Hashtable)LLSD.LLSDDeserialize(Utils.StringToBytes(request));
|
||||||
|
|
|
@ -106,7 +106,7 @@ namespace OpenSim.Region.ClientStack.Linden
|
||||||
scene.EventManager.OnRegisterCaps += OnRegisterCaps;
|
scene.EventManager.OnRegisterCaps += OnRegisterCaps;
|
||||||
|
|
||||||
MainConsole.Instance.Commands.AddCommand(
|
MainConsole.Instance.Commands.AddCommand(
|
||||||
"event queue",
|
"Comms",
|
||||||
false,
|
false,
|
||||||
"debug eq",
|
"debug eq",
|
||||||
"debug eq [0|1]",
|
"debug eq [0|1]",
|
||||||
|
|
|
@ -317,7 +317,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
protected readonly UUID m_agentId;
|
protected readonly UUID m_agentId;
|
||||||
private readonly uint m_circuitCode;
|
private readonly uint m_circuitCode;
|
||||||
private readonly byte[] m_channelVersion = Utils.EmptyBytes;
|
private readonly byte[] m_channelVersion = Utils.EmptyBytes;
|
||||||
private readonly Dictionary<string, UUID> m_defaultAnimations = new Dictionary<string, UUID>();
|
|
||||||
private readonly IGroupsModule m_GroupsModule;
|
private readonly IGroupsModule m_GroupsModule;
|
||||||
|
|
||||||
private int m_cachedTextureSerial;
|
private int m_cachedTextureSerial;
|
||||||
|
@ -452,10 +451,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
RegisterInterface<IClientChat>(this);
|
RegisterInterface<IClientChat>(this);
|
||||||
RegisterInterface<IClientIPEndpoint>(this);
|
RegisterInterface<IClientIPEndpoint>(this);
|
||||||
|
|
||||||
InitDefaultAnimations();
|
|
||||||
|
|
||||||
m_scene = scene;
|
m_scene = scene;
|
||||||
|
|
||||||
m_entityUpdates = new PriorityQueue(m_scene.Entities.Count);
|
m_entityUpdates = new PriorityQueue(m_scene.Entities.Count);
|
||||||
m_entityProps = new PriorityQueue(m_scene.Entities.Count);
|
m_entityProps = new PriorityQueue(m_scene.Entities.Count);
|
||||||
m_fullUpdateDataBlocksBuilder = new List<ObjectUpdatePacket.ObjectDataBlock>();
|
m_fullUpdateDataBlocksBuilder = new List<ObjectUpdatePacket.ObjectDataBlock>();
|
||||||
|
@ -11210,30 +11206,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
OutPacket(scriptQuestion, ThrottleOutPacketType.Task);
|
OutPacket(scriptQuestion, ThrottleOutPacketType.Task);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void InitDefaultAnimations()
|
|
||||||
{
|
|
||||||
using (XmlTextReader reader = new XmlTextReader("data/avataranimations.xml"))
|
|
||||||
{
|
|
||||||
XmlDocument doc = new XmlDocument();
|
|
||||||
doc.Load(reader);
|
|
||||||
if (doc.DocumentElement != null)
|
|
||||||
foreach (XmlNode nod in doc.DocumentElement.ChildNodes)
|
|
||||||
{
|
|
||||||
if (nod.Attributes["name"] != null)
|
|
||||||
{
|
|
||||||
string name = nod.Attributes["name"].Value.ToLower();
|
|
||||||
string id = nod.InnerText;
|
|
||||||
m_defaultAnimations.Add(name, (UUID)id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public UUID GetDefaultAnimation(string name)
|
public UUID GetDefaultAnimation(string name)
|
||||||
{
|
{
|
||||||
if (m_defaultAnimations.ContainsKey(name))
|
return SLUtil.GetDefaultAvatarAnimation(name);
|
||||||
return m_defaultAnimations[name];
|
|
||||||
return UUID.Zero;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
|
@ -244,8 +244,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
base.Start(m_recvBufferSize, m_asyncPacketHandling);
|
base.Start(m_recvBufferSize, m_asyncPacketHandling);
|
||||||
|
|
||||||
// Start the packet processing threads
|
// Start the packet processing threads
|
||||||
Watchdog.StartThread(IncomingPacketHandler, "Incoming Packets (" + m_scene.RegionInfo.RegionName + ")", ThreadPriority.Normal, false);
|
Watchdog.StartThread(
|
||||||
Watchdog.StartThread(OutgoingPacketHandler, "Outgoing Packets (" + m_scene.RegionInfo.RegionName + ")", ThreadPriority.Normal, false);
|
IncomingPacketHandler, "Incoming Packets (" + m_scene.RegionInfo.RegionName + ")", ThreadPriority.Normal, false, true);
|
||||||
|
Watchdog.StartThread(
|
||||||
|
OutgoingPacketHandler, "Outgoing Packets (" + m_scene.RegionInfo.RegionName + ")", ThreadPriority.Normal, false, true);
|
||||||
|
|
||||||
m_elapsedMSSinceLastStatReport = Environment.TickCount;
|
m_elapsedMSSinceLastStatReport = Environment.TickCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -203,10 +203,10 @@ namespace Flotsam.RegionModules.AssetCache
|
||||||
m_CacheDirectoryTierLen = 4;
|
m_CacheDirectoryTierLen = 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
MainConsole.Instance.Commands.AddCommand(Name, true, "fcache status", "fcache status", "Display cache status", HandleConsoleCommand);
|
MainConsole.Instance.Commands.AddCommand("Assets", true, "fcache status", "fcache status", "Display cache status", HandleConsoleCommand);
|
||||||
MainConsole.Instance.Commands.AddCommand(Name, true, "fcache clear", "fcache clear [file] [memory]", "Remove all assets in the cache. If file or memory is specified then only this cache is cleared.", HandleConsoleCommand);
|
MainConsole.Instance.Commands.AddCommand("Assets", true, "fcache clear", "fcache clear [file] [memory]", "Remove all assets in the cache. If file or memory is specified then only this cache is cleared.", HandleConsoleCommand);
|
||||||
MainConsole.Instance.Commands.AddCommand(Name, true, "fcache assets", "fcache assets", "Attempt a deep scan and cache of all assets in all scenes", HandleConsoleCommand);
|
MainConsole.Instance.Commands.AddCommand("Assets", true, "fcache assets", "fcache assets", "Attempt a deep scan and cache of all assets in all scenes", HandleConsoleCommand);
|
||||||
MainConsole.Instance.Commands.AddCommand(Name, true, "fcache expire", "fcache expire <datetime>", "Purge cached assets older then the specified date/time", HandleConsoleCommand);
|
MainConsole.Instance.Commands.AddCommand("Assets", true, "fcache expire", "fcache expire <datetime>", "Purge cached assets older then the specified date/time", HandleConsoleCommand);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -496,6 +496,10 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
|
||||||
SetAppearanceAssets(sp.UUID, sp.Appearance);
|
SetAppearanceAssets(sp.UUID, sp.Appearance);
|
||||||
|
|
||||||
m_scene.AvatarService.SetAppearance(agentid, sp.Appearance);
|
m_scene.AvatarService.SetAppearance(agentid, sp.Appearance);
|
||||||
|
|
||||||
|
// Trigger this here because it's the final step in the set/queue/save process for appearance setting.
|
||||||
|
// Everything has been updated and stored. Ensures bakes have been persisted (if option is set to persist bakes).
|
||||||
|
m_scene.EventManager.TriggerAvatarAppearanceChanged(sp);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SetAppearanceAssets(UUID userID, AvatarAppearance appearance)
|
private void SetAppearanceAssets(UUID userID, AvatarAppearance appearance)
|
||||||
|
|
|
@ -51,12 +51,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Dialog
|
||||||
m_scene.RegisterModuleInterface<IDialogModule>(this);
|
m_scene.RegisterModuleInterface<IDialogModule>(this);
|
||||||
|
|
||||||
m_scene.AddCommand(
|
m_scene.AddCommand(
|
||||||
this, "alert", "alert <message>",
|
"Users", this, "alert", "alert <message>",
|
||||||
"Send an alert to everyone",
|
"Send an alert to everyone",
|
||||||
HandleAlertConsoleCommand);
|
HandleAlertConsoleCommand);
|
||||||
|
|
||||||
m_scene.AddCommand(
|
m_scene.AddCommand(
|
||||||
this, "alert-user", "alert-user <first> <last> <message>",
|
"Users", this, "alert-user", "alert-user <first> <last> <message>",
|
||||||
"Send an alert to a user",
|
"Send an alert to a user",
|
||||||
HandleAlertConsoleCommand);
|
HandleAlertConsoleCommand);
|
||||||
}
|
}
|
||||||
|
|
|
@ -309,11 +309,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
|
||||||
|
|
||||||
m_archiveWriter = new TarArchiveWriter(m_saveStream);
|
m_archiveWriter = new TarArchiveWriter(m_saveStream);
|
||||||
|
|
||||||
|
m_log.InfoFormat("[INVENTORY ARCHIVER]: Adding control file to archive.");
|
||||||
|
|
||||||
// Write out control file. This has to be done first so that subsequent loaders will see this file first
|
// Write out control file. This has to be done first so that subsequent loaders will see this file first
|
||||||
// XXX: I know this is a weak way of doing it since external non-OAR aware tar executables will not do this
|
// XXX: I know this is a weak way of doing it since external non-OAR aware tar executables will not do this
|
||||||
// not sure how to fix this though, short of going with a completely different file format.
|
// not sure how to fix this though, short of going with a completely different file format.
|
||||||
m_archiveWriter.WriteFile(ArchiveConstants.CONTROL_FILE_PATH, CreateControlFile(options));
|
m_archiveWriter.WriteFile(ArchiveConstants.CONTROL_FILE_PATH, CreateControlFile(options));
|
||||||
m_log.InfoFormat("[INVENTORY ARCHIVER]: Added control file to archive.");
|
|
||||||
|
|
||||||
if (inventoryFolder != null)
|
if (inventoryFolder != null)
|
||||||
{
|
{
|
||||||
|
|
|
@ -108,7 +108,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
|
||||||
OnInventoryArchiveSaved += SaveInvConsoleCommandCompleted;
|
OnInventoryArchiveSaved += SaveInvConsoleCommandCompleted;
|
||||||
|
|
||||||
scene.AddCommand(
|
scene.AddCommand(
|
||||||
this, "load iar",
|
"Archiving", this, "load iar",
|
||||||
"load iar [-m|--merge] <first> <last> <inventory path> <password> [<IAR path>]",
|
"load iar [-m|--merge] <first> <last> <inventory path> <password> [<IAR path>]",
|
||||||
"Load user inventory archive (IAR).",
|
"Load user inventory archive (IAR).",
|
||||||
"-m|--merge is an option which merges the loaded IAR with existing inventory folders where possible, rather than always creating new ones"
|
"-m|--merge is an option which merges the loaded IAR with existing inventory folders where possible, rather than always creating new ones"
|
||||||
|
@ -121,9 +121,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
|
||||||
HandleLoadInvConsoleCommand);
|
HandleLoadInvConsoleCommand);
|
||||||
|
|
||||||
scene.AddCommand(
|
scene.AddCommand(
|
||||||
this, "save iar",
|
"Archiving", this, "save iar",
|
||||||
"save iar [-h|--home=<url>] [--noassets] <first> <last> <inventory path> <password> [<IAR path>] [-c|--creators] [-e|--exclude=<name/uuid>] [-f|--excludefolder=<foldername/uuid>] [-v|--verbose]",
|
"save iar [-h|--home=<url>] [--noassets] <first> <last> <inventory path> <password> [<IAR path>] [-c|--creators] [-v|--verbose]",
|
||||||
"Save user inventory archive (IAR).",
|
"Save user inventory archive (IAR).",
|
||||||
"<first> is the user's first name." + Environment.NewLine
|
"<first> is the user's first name." + Environment.NewLine
|
||||||
+ "<last> is the user's last name." + Environment.NewLine
|
+ "<last> is the user's last name." + Environment.NewLine
|
||||||
+ "<inventory path> is the path inside the user's inventory for the folder/item to be saved." + Environment.NewLine
|
+ "<inventory path> is the path inside the user's inventory for the folder/item to be saved." + Environment.NewLine
|
||||||
|
@ -351,8 +351,6 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
m_log.Info("[INVENTORY ARCHIVER]: PLEASE NOTE THAT THIS FACILITY IS EXPERIMENTAL. BUG REPORTS WELCOME.");
|
|
||||||
|
|
||||||
Dictionary<string, object> options = new Dictionary<string, object>();
|
Dictionary<string, object> options = new Dictionary<string, object>();
|
||||||
OptionSet optionSet = new OptionSet().Add("m|merge", delegate (string v) { options["merge"] = v != null; });
|
OptionSet optionSet = new OptionSet().Add("m|merge", delegate (string v) { options["merge"] = v != null; });
|
||||||
|
|
||||||
|
@ -425,8 +423,6 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
|
||||||
"[INVENTORY ARCHIVER]: save iar [-h|--home=<url>] [--noassets] <first> <last> <inventory path> <password> [<IAR path>] [-c|--creators] [-e|--exclude=<name/uuid>] [-f|--excludefolder=<foldername/uuid>] [-v|--verbose]");
|
"[INVENTORY ARCHIVER]: save iar [-h|--home=<url>] [--noassets] <first> <last> <inventory path> <password> [<IAR path>] [-c|--creators] [-e|--exclude=<name/uuid>] [-f|--excludefolder=<foldername/uuid>] [-v|--verbose]");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_log.Info("[INVENTORY ARCHIVER]: PLEASE NOTE THAT THIS FACILITY IS EXPERIMENTAL. BUG REPORTS WELCOME.");
|
|
||||||
if (options.ContainsKey("home"))
|
if (options.ContainsKey("home"))
|
||||||
m_log.WarnFormat("[INVENTORY ARCHIVER]: Please be aware that inventory archives with creator information are not compatible with OpenSim 0.7.0.2 and earlier. Do not use the -home option if you want to produce a compatible IAR");
|
m_log.WarnFormat("[INVENTORY ARCHIVER]: Please be aware that inventory archives with creator information are not compatible with OpenSim 0.7.0.2 and earlier. Do not use the -home option if you want to produce a compatible IAR");
|
||||||
|
|
||||||
|
|
|
@ -150,7 +150,16 @@ namespace OpenSim.Region.CoreModules.Avatar.Profile
|
||||||
string skillsText = String.Empty;
|
string skillsText = String.Empty;
|
||||||
string languages = String.Empty;
|
string languages = String.Empty;
|
||||||
|
|
||||||
Byte[] charterMember = Utils.StringToBytes("Avatar");
|
UserAccount account = m_Scenes[0].UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, avatarID);
|
||||||
|
|
||||||
|
string name = "Avatar";
|
||||||
|
int created = 0;
|
||||||
|
if (account != null)
|
||||||
|
{
|
||||||
|
name = account.FirstName + " " + account.LastName;
|
||||||
|
created = account.Created;
|
||||||
|
}
|
||||||
|
Byte[] charterMember = Utils.StringToBytes(name);
|
||||||
|
|
||||||
profileUrl = "No profile data";
|
profileUrl = "No profile data";
|
||||||
aboutText = string.Empty;
|
aboutText = string.Empty;
|
||||||
|
@ -160,7 +169,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Profile
|
||||||
partner = UUID.Zero;
|
partner = UUID.Zero;
|
||||||
|
|
||||||
remoteClient.SendAvatarProperties(avatarID, aboutText,
|
remoteClient.SendAvatarProperties(avatarID, aboutText,
|
||||||
Util.ToDateTime(0).ToString(
|
Util.ToDateTime(created).ToString(
|
||||||
"M/d/yyyy", CultureInfo.InvariantCulture),
|
"M/d/yyyy", CultureInfo.InvariantCulture),
|
||||||
charterMember, firstLifeAboutText,
|
charterMember, firstLifeAboutText,
|
||||||
(uint)(0 & 0xff),
|
(uint)(0 & 0xff),
|
||||||
|
|
|
@ -69,9 +69,10 @@ namespace OpenSim.Region.CoreModules.Framework
|
||||||
{
|
{
|
||||||
m_scene = scene;
|
m_scene = scene;
|
||||||
m_scene.RegisterModuleInterface<ICapabilitiesModule>(this);
|
m_scene.RegisterModuleInterface<ICapabilitiesModule>(this);
|
||||||
MainConsole.Instance.Commands.AddCommand("Capabilities", false, "show caps",
|
|
||||||
|
MainConsole.Instance.Commands.AddCommand("Comms", false, "show caps",
|
||||||
"show caps",
|
"show caps",
|
||||||
"Shows all registered capabilities", HandleShowCapsCommand);
|
"Shows all registered capabilities for users", HandleShowCapsCommand);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RegionLoaded(Scene scene)
|
public void RegionLoaded(Scene scene)
|
||||||
|
|
|
@ -994,6 +994,9 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
||||||
neighbourRegion.RegionHandle);
|
neighbourRegion.RegionHandle);
|
||||||
return agent;
|
return agent;
|
||||||
}
|
}
|
||||||
|
// No turning back
|
||||||
|
agent.IsChildAgent = true;
|
||||||
|
|
||||||
string capsPath = neighbourRegion.ServerURI + CapsUtil.GetCapsSeedPath(agentcaps);
|
string capsPath = neighbourRegion.ServerURI + CapsUtil.GetCapsSeedPath(agentcaps);
|
||||||
|
|
||||||
m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Sending new CAPS seed url {0} to client {1}", capsPath, agent.UUID);
|
m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Sending new CAPS seed url {0} to client {1}", capsPath, agent.UUID);
|
||||||
|
@ -1138,7 +1141,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// This informs all neighbouring regions about agent "avatar".
|
/// This informs all neighbouring regions about agent "avatar".
|
||||||
/// Calls an asynchronous method to do so.. so it doesn't lag the sim.
|
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="sp"></param>
|
/// <param name="sp"></param>
|
||||||
public void EnableChildAgents(ScenePresence sp)
|
public void EnableChildAgents(ScenePresence sp)
|
||||||
|
@ -1258,12 +1260,16 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
||||||
|
|
||||||
if (neighbour.RegionHandle != sp.Scene.RegionInfo.RegionHandle)
|
if (neighbour.RegionHandle != sp.Scene.RegionInfo.RegionHandle)
|
||||||
{
|
{
|
||||||
InformClientOfNeighbourDelegate d = InformClientOfNeighbourAsync;
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
d.BeginInvoke(sp, cagents[count], neighbour, neighbour.ExternalEndPoint, newAgent,
|
// Let's put this back at sync, so that it doesn't clog
|
||||||
InformClientOfNeighbourCompleted,
|
// the network, especially for regions in the same physical server.
|
||||||
d);
|
// We're really not in a hurry here.
|
||||||
|
InformClientOfNeighbourAsync(sp, cagents[count], neighbour, neighbour.ExternalEndPoint, newAgent);
|
||||||
|
//InformClientOfNeighbourDelegate d = InformClientOfNeighbourAsync;
|
||||||
|
//d.BeginInvoke(sp, cagents[count], neighbour, neighbour.ExternalEndPoint, newAgent,
|
||||||
|
// InformClientOfNeighbourCompleted,
|
||||||
|
// d);
|
||||||
}
|
}
|
||||||
|
|
||||||
catch (ArgumentOutOfRangeException)
|
catch (ArgumentOutOfRangeException)
|
||||||
|
@ -1698,14 +1704,13 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
||||||
|
|
||||||
// Offset the positions for the new region across the border
|
// Offset the positions for the new region across the border
|
||||||
Vector3 oldGroupPosition = grp.RootPart.GroupPosition;
|
Vector3 oldGroupPosition = grp.RootPart.GroupPosition;
|
||||||
grp.RootPart.GroupPosition = pos;
|
|
||||||
|
|
||||||
// If we fail to cross the border, then reset the position of the scene object on that border.
|
// If we fail to cross the border, then reset the position of the scene object on that border.
|
||||||
uint x = 0, y = 0;
|
uint x = 0, y = 0;
|
||||||
Utils.LongToUInts(newRegionHandle, out x, out y);
|
Utils.LongToUInts(newRegionHandle, out x, out y);
|
||||||
GridRegion destination = scene.GridService.GetRegionByPosition(scene.RegionInfo.ScopeID, (int)x, (int)y);
|
GridRegion destination = scene.GridService.GetRegionByPosition(scene.RegionInfo.ScopeID, (int)x, (int)y);
|
||||||
|
|
||||||
if (destination == null || !CrossPrimGroupIntoNewRegion(destination, grp, silent))
|
if (destination == null || !CrossPrimGroupIntoNewRegion(destination, pos, grp, silent))
|
||||||
{
|
{
|
||||||
m_log.InfoFormat("[ENTITY TRANSFER MODULE] cross region transfer failed for object {0}",grp.UUID);
|
m_log.InfoFormat("[ENTITY TRANSFER MODULE] cross region transfer failed for object {0}",grp.UUID);
|
||||||
|
|
||||||
|
@ -1735,7 +1740,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
||||||
/// true if the crossing itself was successful, false on failure
|
/// true if the crossing itself was successful, false on failure
|
||||||
/// FIMXE: we still return true if the crossing object was not successfully deleted from the originating region
|
/// FIMXE: we still return true if the crossing object was not successfully deleted from the originating region
|
||||||
/// </returns>
|
/// </returns>
|
||||||
protected bool CrossPrimGroupIntoNewRegion(GridRegion destination, SceneObjectGroup grp, bool silent)
|
protected bool CrossPrimGroupIntoNewRegion(GridRegion destination, Vector3 newPosition, SceneObjectGroup grp, bool silent)
|
||||||
{
|
{
|
||||||
//m_log.Debug(" >>> CrossPrimGroupIntoNewRegion <<<");
|
//m_log.Debug(" >>> CrossPrimGroupIntoNewRegion <<<");
|
||||||
|
|
||||||
|
@ -1760,7 +1765,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
||||||
//if (m_interregionCommsOut != null)
|
//if (m_interregionCommsOut != null)
|
||||||
// successYN = m_interregionCommsOut.SendCreateObject(newRegionHandle, grp, true);
|
// successYN = m_interregionCommsOut.SendCreateObject(newRegionHandle, grp, true);
|
||||||
if (m_aScene.SimulationService != null)
|
if (m_aScene.SimulationService != null)
|
||||||
successYN = m_aScene.SimulationService.CreateObject(destination, grp, true);
|
successYN = m_aScene.SimulationService.CreateObject(destination, newPosition, grp, true);
|
||||||
|
|
||||||
if (successYN)
|
if (successYN)
|
||||||
{
|
{
|
||||||
|
@ -1819,7 +1824,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
||||||
gobj.IsAttachment = false;
|
gobj.IsAttachment = false;
|
||||||
//gobj.RootPart.LastOwnerID = gobj.GetFromAssetID();
|
//gobj.RootPart.LastOwnerID = gobj.GetFromAssetID();
|
||||||
m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Sending attachment {0} to region {1}", gobj.UUID, destination.RegionName);
|
m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Sending attachment {0} to region {1}", gobj.UUID, destination.RegionName);
|
||||||
CrossPrimGroupIntoNewRegion(destination, gobj, silent);
|
CrossPrimGroupIntoNewRegion(destination, Vector3.Zero, gobj, silent);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -117,7 +117,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
|
||||||
string userAssetServer = string.Empty;
|
string userAssetServer = string.Empty;
|
||||||
if (IsForeignUser(avatarID, out userAssetServer) && userAssetServer != string.Empty && m_OutboundPermission)
|
if (IsForeignUser(avatarID, out userAssetServer) && userAssetServer != string.Empty && m_OutboundPermission)
|
||||||
{
|
{
|
||||||
Util.FireAndForget(delegate { m_assMapper.Post(assetID, avatarID, userAssetServer); });
|
m_assMapper.Post(assetID, avatarID, userAssetServer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -551,9 +551,14 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
|
||||||
// "[INVENTORY ACCESS MODULE]: Target of {0} in CreateItemForObject() is {1} {2}",
|
// "[INVENTORY ACCESS MODULE]: Target of {0} in CreateItemForObject() is {1} {2}",
|
||||||
// action, remoteClient.Name, userID);
|
// action, remoteClient.Name, userID);
|
||||||
}
|
}
|
||||||
|
else if (so.RootPart.OwnerID == so.RootPart.GroupID)
|
||||||
|
{
|
||||||
|
// Group owned objects go to the last owner before the object was transferred.
|
||||||
|
userID = so.RootPart.LastOwnerID;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// All returns / deletes go to the object owner
|
// Other returns / deletes go to the object owner
|
||||||
//
|
//
|
||||||
userID = so.RootPart.OwnerID;
|
userID = so.RootPart.OwnerID;
|
||||||
|
|
||||||
|
|
|
@ -72,7 +72,7 @@ namespace OpenSim.Region.CoreModules.Framework.Monitoring
|
||||||
|
|
||||||
m_scene = scene;
|
m_scene = scene;
|
||||||
|
|
||||||
m_scene.AddCommand(this, "monitor report",
|
m_scene.AddCommand("General", this, "monitor report",
|
||||||
"monitor report",
|
"monitor report",
|
||||||
"Returns a variety of statistics about the current region and/or simulator",
|
"Returns a variety of statistics about the current region and/or simulator",
|
||||||
DebugMonitors);
|
DebugMonitors);
|
||||||
|
|
|
@ -80,7 +80,7 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
//}
|
//}
|
||||||
MainConsole.Instance.Commands.AddCommand("grid", true,
|
MainConsole.Instance.Commands.AddCommand("Users", true,
|
||||||
"show names",
|
"show names",
|
||||||
"show names",
|
"show names",
|
||||||
"Show the bindings between user UUIDs and user names",
|
"Show the bindings between user UUIDs and user names",
|
||||||
|
|
|
@ -1210,7 +1210,7 @@ namespace OpenSim.Region.CoreModules.InterGrid
|
||||||
if (homeScene.TryGetScenePresence(avatarId,out avatar))
|
if (homeScene.TryGetScenePresence(avatarId,out avatar))
|
||||||
{
|
{
|
||||||
KillAUser ku = new KillAUser(avatar,mod);
|
KillAUser ku = new KillAUser(avatar,mod);
|
||||||
Watchdog.StartThread(ku.ShutdownNoLogout, "OGPShutdown", ThreadPriority.Normal, true);
|
Watchdog.StartThread(ku.ShutdownNoLogout, "OGPShutdown", ThreadPriority.Normal, true, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -151,6 +151,14 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm
|
||||||
|
|
||||||
#region IWorldComm Members
|
#region IWorldComm Members
|
||||||
|
|
||||||
|
public int ListenerCount
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return m_listenerManager.ListenerCount;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Create a listen event callback with the specified filters.
|
/// Create a listen event callback with the specified filters.
|
||||||
/// The parameters localID,itemID are needed to uniquely identify
|
/// The parameters localID,itemID are needed to uniquely identify
|
||||||
|
@ -438,6 +446,18 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm
|
||||||
private int m_maxhandles;
|
private int m_maxhandles;
|
||||||
private int m_curlisteners;
|
private int m_curlisteners;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Total number of listeners
|
||||||
|
/// </summary>
|
||||||
|
public int ListenerCount
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
lock (m_listeners)
|
||||||
|
return m_listeners.Count;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public ListenerManager(int maxlisteners, int maxhandles)
|
public ListenerManager(int maxlisteners, int maxhandles)
|
||||||
{
|
{
|
||||||
m_maxlisteners = maxlisteners;
|
m_maxlisteners = maxlisteners;
|
||||||
|
|
|
@ -73,14 +73,17 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Asset
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
string serviceDll = assetConfig.GetString("LocalServiceModule",
|
string serviceDll = assetConfig.GetString("LocalServiceModule", String.Empty);
|
||||||
String.Empty);
|
|
||||||
|
|
||||||
if (serviceDll == String.Empty)
|
if (serviceDll == String.Empty)
|
||||||
{
|
{
|
||||||
m_log.Error("[LOCAL ASSET SERVICES CONNECTOR]: No LocalServiceModule named in section AssetService");
|
m_log.Error("[LOCAL ASSET SERVICES CONNECTOR]: No LocalServiceModule named in section AssetService");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_log.DebugFormat("[LOCAL ASSET SERVICES CONNECTOR]: Loading asset service at {0}", serviceDll);
|
||||||
|
}
|
||||||
|
|
||||||
Object[] args = new Object[] { source };
|
Object[] args = new Object[] { source };
|
||||||
m_AssetService = ServerUtils.LoadPlugin<IAssetService>(serviceDll, args);
|
m_AssetService = ServerUtils.LoadPlugin<IAssetService>(serviceDll, args);
|
||||||
|
|
|
@ -48,8 +48,6 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
|
||||||
LogManager.GetLogger(
|
LogManager.GetLogger(
|
||||||
MethodBase.GetCurrentMethod().DeclaringType);
|
MethodBase.GetCurrentMethod().DeclaringType);
|
||||||
|
|
||||||
private static LocalGridServicesConnector m_MainInstance;
|
|
||||||
|
|
||||||
private IGridService m_GridService;
|
private IGridService m_GridService;
|
||||||
private Dictionary<UUID, RegionCache> m_LocalCache = new Dictionary<UUID, RegionCache>();
|
private Dictionary<UUID, RegionCache> m_LocalCache = new Dictionary<UUID, RegionCache>();
|
||||||
|
|
||||||
|
@ -62,7 +60,6 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
|
||||||
public LocalGridServicesConnector(IConfigSource source)
|
public LocalGridServicesConnector(IConfigSource source)
|
||||||
{
|
{
|
||||||
m_log.Debug("[LOCAL GRID CONNECTOR]: LocalGridServicesConnector instantiated");
|
m_log.Debug("[LOCAL GRID CONNECTOR]: LocalGridServicesConnector instantiated");
|
||||||
m_MainInstance = this;
|
|
||||||
InitialiseService(source);
|
InitialiseService(source);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -87,7 +84,6 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
|
||||||
if (name == Name)
|
if (name == Name)
|
||||||
{
|
{
|
||||||
InitialiseService(source);
|
InitialiseService(source);
|
||||||
m_MainInstance = this;
|
|
||||||
m_Enabled = true;
|
m_Enabled = true;
|
||||||
m_log.Info("[LOCAL GRID CONNECTOR]: Local grid connector enabled");
|
m_log.Info("[LOCAL GRID CONNECTOR]: Local grid connector enabled");
|
||||||
}
|
}
|
||||||
|
@ -126,12 +122,9 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
|
||||||
|
|
||||||
public void PostInitialise()
|
public void PostInitialise()
|
||||||
{
|
{
|
||||||
if (m_MainInstance == this)
|
MainConsole.Instance.Commands.AddCommand("Regions", false, "show neighbours",
|
||||||
{
|
"show neighbours",
|
||||||
MainConsole.Instance.Commands.AddCommand("LocalGridConnector", false, "show neighbours",
|
"Shows the local regions' neighbours", NeighboursCommand);
|
||||||
"show neighbours",
|
|
||||||
"Shows the local regions' neighbours", NeighboursCommand);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Close()
|
public void Close()
|
||||||
|
@ -143,22 +136,16 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
|
||||||
if (m_Enabled)
|
if (m_Enabled)
|
||||||
scene.RegisterModuleInterface<IGridService>(this);
|
scene.RegisterModuleInterface<IGridService>(this);
|
||||||
|
|
||||||
if (m_MainInstance == this)
|
if (m_LocalCache.ContainsKey(scene.RegionInfo.RegionID))
|
||||||
{
|
m_log.ErrorFormat("[LOCAL GRID CONNECTOR]: simulator seems to have more than one region with the same UUID. Please correct this!");
|
||||||
if (m_LocalCache.ContainsKey(scene.RegionInfo.RegionID))
|
else
|
||||||
m_log.ErrorFormat("[LOCAL GRID CONNECTOR]: simulator seems to have more than one region with the same UUID. Please correct this!");
|
m_LocalCache.Add(scene.RegionInfo.RegionID, new RegionCache(scene));
|
||||||
else
|
|
||||||
m_LocalCache.Add(scene.RegionInfo.RegionID, new RegionCache(scene));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RemoveRegion(Scene scene)
|
public void RemoveRegion(Scene scene)
|
||||||
{
|
{
|
||||||
if (m_MainInstance == this)
|
m_LocalCache[scene.RegionInfo.RegionID].Clear();
|
||||||
{
|
m_LocalCache.Remove(scene.RegionInfo.RegionID);
|
||||||
m_LocalCache[scene.RegionInfo.RegionID].Clear();
|
|
||||||
m_LocalCache.Remove(scene.RegionInfo.RegionID);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RegionLoaded(Scene scene)
|
public void RegionLoaded(Scene scene)
|
||||||
|
@ -259,6 +246,5 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
|
||||||
|
|
||||||
MainConsole.Instance.Output(caps.ToString());
|
MainConsole.Instance.Output(caps.ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -65,13 +65,26 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal struct ScopedRegionPosition
|
||||||
|
{
|
||||||
|
public UUID m_scopeID;
|
||||||
|
public ulong m_regionHandle;
|
||||||
|
public ScopedRegionPosition(UUID scopeID, ulong handle)
|
||||||
|
{
|
||||||
|
m_scopeID = scopeID;
|
||||||
|
m_regionHandle = handle;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private ExpiringCache<ScopedRegionUUID, GridRegion> m_UUIDCache;
|
private ExpiringCache<ScopedRegionUUID, GridRegion> m_UUIDCache;
|
||||||
private ExpiringCache<ScopedRegionName, ScopedRegionUUID> m_NameCache;
|
private ExpiringCache<ScopedRegionName, ScopedRegionUUID> m_NameCache;
|
||||||
|
private ExpiringCache<ScopedRegionPosition, GridRegion> m_PositionCache;
|
||||||
|
|
||||||
public RegionInfoCache()
|
public RegionInfoCache()
|
||||||
{
|
{
|
||||||
m_UUIDCache = new ExpiringCache<ScopedRegionUUID, GridRegion>();
|
m_UUIDCache = new ExpiringCache<ScopedRegionUUID, GridRegion>();
|
||||||
m_NameCache = new ExpiringCache<ScopedRegionName, ScopedRegionUUID>();
|
m_NameCache = new ExpiringCache<ScopedRegionName, ScopedRegionUUID>();
|
||||||
|
m_PositionCache = new ExpiringCache<ScopedRegionPosition, GridRegion>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Cache(GridRegion rinfo)
|
public void Cache(GridRegion rinfo)
|
||||||
|
@ -96,6 +109,9 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
|
||||||
{
|
{
|
||||||
ScopedRegionName name = new ScopedRegionName(scopeID,rinfo.RegionName);
|
ScopedRegionName name = new ScopedRegionName(scopeID,rinfo.RegionName);
|
||||||
m_NameCache.AddOrUpdate(name, id, CACHE_EXPIRATION_SECONDS);
|
m_NameCache.AddOrUpdate(name, id, CACHE_EXPIRATION_SECONDS);
|
||||||
|
|
||||||
|
ScopedRegionPosition pos = new ScopedRegionPosition(scopeID, rinfo.RegionHandle);
|
||||||
|
m_PositionCache.AddOrUpdate(pos, rinfo, CACHE_EXPIRATION_SECONDS);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -114,6 +130,22 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public GridRegion Get(UUID scopeID, ulong handle, out bool inCache)
|
||||||
|
{
|
||||||
|
inCache = false;
|
||||||
|
|
||||||
|
GridRegion rinfo = null;
|
||||||
|
ScopedRegionPosition pos = new ScopedRegionPosition(scopeID, handle);
|
||||||
|
if (m_PositionCache.TryGetValue(pos, out rinfo))
|
||||||
|
{
|
||||||
|
inCache = true;
|
||||||
|
return rinfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public GridRegion Get(UUID scopeID, string name, out bool inCache)
|
public GridRegion Get(UUID scopeID, string name, out bool inCache)
|
||||||
{
|
{
|
||||||
inCache = false;
|
inCache = false;
|
||||||
|
|
|
@ -186,10 +186,16 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
|
||||||
|
|
||||||
public GridRegion GetRegionByPosition(UUID scopeID, int x, int y)
|
public GridRegion GetRegionByPosition(UUID scopeID, int x, int y)
|
||||||
{
|
{
|
||||||
GridRegion rinfo = m_LocalGridService.GetRegionByPosition(scopeID, x, y);
|
bool inCache = false;
|
||||||
|
GridRegion rinfo = m_RegionInfoCache.Get(scopeID, Util.UIntsToLong((uint)x, (uint)y), out inCache);
|
||||||
|
if (inCache)
|
||||||
|
return rinfo;
|
||||||
|
|
||||||
|
rinfo = m_LocalGridService.GetRegionByPosition(scopeID, x, y);
|
||||||
if (rinfo == null)
|
if (rinfo == null)
|
||||||
rinfo = m_RemoteGridService.GetRegionByPosition(scopeID, x, y);
|
rinfo = m_RemoteGridService.GetRegionByPosition(scopeID, x, y);
|
||||||
|
|
||||||
|
m_RegionInfoCache.Cache(rinfo);
|
||||||
return rinfo;
|
return rinfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -58,6 +58,8 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
|
||||||
|
|
||||||
private List<Scene> m_Scenes = new List<Scene>();
|
private List<Scene> m_Scenes = new List<Scene>();
|
||||||
|
|
||||||
|
private InventoryCache m_Cache = new InventoryCache();
|
||||||
|
|
||||||
protected IUserManagement m_UserManagement;
|
protected IUserManagement m_UserManagement;
|
||||||
protected IUserManagement UserManagementModule
|
protected IUserManagement UserManagementModule
|
||||||
{
|
{
|
||||||
|
@ -312,6 +314,9 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
|
||||||
public InventoryFolderBase GetRootFolder(UUID userID)
|
public InventoryFolderBase GetRootFolder(UUID userID)
|
||||||
{
|
{
|
||||||
//m_log.DebugFormat("[HG INVENTORY CONNECTOR]: GetRootFolder for {0}", userID);
|
//m_log.DebugFormat("[HG INVENTORY CONNECTOR]: GetRootFolder for {0}", userID);
|
||||||
|
InventoryFolderBase root = m_Cache.GetRootFolder(userID);
|
||||||
|
if (root != null)
|
||||||
|
return root;
|
||||||
|
|
||||||
string invURL = GetInventoryServiceURL(userID);
|
string invURL = GetInventoryServiceURL(userID);
|
||||||
|
|
||||||
|
@ -320,12 +325,19 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
|
||||||
|
|
||||||
IInventoryService connector = GetConnector(invURL);
|
IInventoryService connector = GetConnector(invURL);
|
||||||
|
|
||||||
return connector.GetRootFolder(userID);
|
root = connector.GetRootFolder(userID);
|
||||||
|
|
||||||
|
m_Cache.Cache(userID, root);
|
||||||
|
|
||||||
|
return root;
|
||||||
}
|
}
|
||||||
|
|
||||||
public InventoryFolderBase GetFolderForType(UUID userID, AssetType type)
|
public InventoryFolderBase GetFolderForType(UUID userID, AssetType type)
|
||||||
{
|
{
|
||||||
//m_log.DebugFormat("[HG INVENTORY CONNECTOR]: GetFolderForType {0} type {1}", userID, type);
|
//m_log.DebugFormat("[HG INVENTORY CONNECTOR]: GetFolderForType {0} type {1}", userID, type);
|
||||||
|
InventoryFolderBase f = m_Cache.GetFolderForType(userID, type);
|
||||||
|
if (f != null)
|
||||||
|
return f;
|
||||||
|
|
||||||
string invURL = GetInventoryServiceURL(userID);
|
string invURL = GetInventoryServiceURL(userID);
|
||||||
|
|
||||||
|
@ -334,7 +346,11 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
|
||||||
|
|
||||||
IInventoryService connector = GetConnector(invURL);
|
IInventoryService connector = GetConnector(invURL);
|
||||||
|
|
||||||
return connector.GetFolderForType(userID, type);
|
f = connector.GetFolderForType(userID, type);
|
||||||
|
|
||||||
|
m_Cache.Cache(userID, type, f);
|
||||||
|
|
||||||
|
return f;
|
||||||
}
|
}
|
||||||
|
|
||||||
public InventoryCollection GetFolderContent(UUID userID, UUID folderID)
|
public InventoryCollection GetFolderContent(UUID userID, UUID folderID)
|
||||||
|
|
|
@ -0,0 +1,59 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
using OpenSim.Framework;
|
||||||
|
using OpenMetaverse;
|
||||||
|
|
||||||
|
namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
|
||||||
|
{
|
||||||
|
public class InventoryCache
|
||||||
|
{
|
||||||
|
private const double CACHE_EXPIRATION_SECONDS = 3600.0; // 1 hour
|
||||||
|
|
||||||
|
private static ExpiringCache<UUID, InventoryFolderBase> m_RootFolders = new ExpiringCache<UUID, InventoryFolderBase>();
|
||||||
|
private static ExpiringCache<UUID, Dictionary<AssetType, InventoryFolderBase>> m_FolderTypes = new ExpiringCache<UUID, Dictionary<AssetType, InventoryFolderBase>>();
|
||||||
|
|
||||||
|
public void Cache(UUID userID, InventoryFolderBase root)
|
||||||
|
{
|
||||||
|
lock (m_RootFolders)
|
||||||
|
m_RootFolders.AddOrUpdate(userID, root, CACHE_EXPIRATION_SECONDS);
|
||||||
|
}
|
||||||
|
|
||||||
|
public InventoryFolderBase GetRootFolder(UUID userID)
|
||||||
|
{
|
||||||
|
InventoryFolderBase root = null;
|
||||||
|
if (m_RootFolders.TryGetValue(userID, out root))
|
||||||
|
return root;
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Cache(UUID userID, AssetType type, InventoryFolderBase folder)
|
||||||
|
{
|
||||||
|
lock (m_FolderTypes)
|
||||||
|
{
|
||||||
|
Dictionary<AssetType, InventoryFolderBase> ff = null;
|
||||||
|
if (!m_FolderTypes.TryGetValue(userID, out ff))
|
||||||
|
{
|
||||||
|
ff = new Dictionary<AssetType, InventoryFolderBase>();
|
||||||
|
m_FolderTypes.Add(userID, ff, CACHE_EXPIRATION_SECONDS);
|
||||||
|
}
|
||||||
|
if (!ff.ContainsKey(type))
|
||||||
|
ff.Add(type, folder);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public InventoryFolderBase GetFolderForType(UUID userID, AssetType type)
|
||||||
|
{
|
||||||
|
Dictionary<AssetType, InventoryFolderBase> ff = null;
|
||||||
|
if (m_FolderTypes.TryGetValue(userID, out ff))
|
||||||
|
{
|
||||||
|
InventoryFolderBase f = null;
|
||||||
|
if (ff.TryGetValue(type, out f))
|
||||||
|
return f;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -315,7 +315,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
|
||||||
* Object-related communications
|
* Object-related communications
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public bool CreateObject(GridRegion destination, ISceneObject sog, bool isLocalCall)
|
public bool CreateObject(GridRegion destination, Vector3 newPosition, ISceneObject sog, bool isLocalCall)
|
||||||
{
|
{
|
||||||
if (destination == null)
|
if (destination == null)
|
||||||
return false;
|
return false;
|
||||||
|
@ -330,12 +330,12 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
|
||||||
// We need to make a local copy of the object
|
// We need to make a local copy of the object
|
||||||
ISceneObject sogClone = sog.CloneForNewScene();
|
ISceneObject sogClone = sog.CloneForNewScene();
|
||||||
sogClone.SetState(sog.GetStateSnapshot(), s);
|
sogClone.SetState(sog.GetStateSnapshot(), s);
|
||||||
return s.IncomingCreateObject(sogClone);
|
return s.IncomingCreateObject(newPosition, sogClone);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Use the object as it came through the wire
|
// Use the object as it came through the wire
|
||||||
return s.IncomingCreateObject(sog);
|
return s.IncomingCreateObject(newPosition, sog);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -282,13 +282,13 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
|
||||||
* Object-related communications
|
* Object-related communications
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public bool CreateObject(GridRegion destination, ISceneObject sog, bool isLocalCall)
|
public bool CreateObject(GridRegion destination, Vector3 newPosition, ISceneObject sog, bool isLocalCall)
|
||||||
{
|
{
|
||||||
if (destination == null)
|
if (destination == null)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// Try local first
|
// Try local first
|
||||||
if (m_localBackend.CreateObject(destination, sog, isLocalCall))
|
if (m_localBackend.CreateObject(destination, newPosition, sog, isLocalCall))
|
||||||
{
|
{
|
||||||
//m_log.Debug("[REST COMMS]: LocalBackEnd SendCreateObject succeeded");
|
//m_log.Debug("[REST COMMS]: LocalBackEnd SendCreateObject succeeded");
|
||||||
return true;
|
return true;
|
||||||
|
@ -296,7 +296,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
|
||||||
|
|
||||||
// else do the remote thing
|
// else do the remote thing
|
||||||
if (!m_localBackend.IsLocalRegion(destination.RegionHandle))
|
if (!m_localBackend.IsLocalRegion(destination.RegionHandle))
|
||||||
return m_remoteConnector.CreateObject(destination, sog, isLocalCall);
|
return m_remoteConnector.CreateObject(destination, newPosition, sog, isLocalCall);
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,21 +47,21 @@ namespace OpenSim.Region.CoreModules.World
|
||||||
|
|
||||||
public void Initialise(IConfigSource config)
|
public void Initialise(IConfigSource config)
|
||||||
{
|
{
|
||||||
MainConsole.Instance.Commands.AddCommand("access", true,
|
MainConsole.Instance.Commands.AddCommand("Users", true,
|
||||||
"login enable",
|
"login enable",
|
||||||
"login enable",
|
"login enable",
|
||||||
"Enable simulator logins",
|
"Enable simulator logins",
|
||||||
String.Empty,
|
String.Empty,
|
||||||
HandleLoginCommand);
|
HandleLoginCommand);
|
||||||
|
|
||||||
MainConsole.Instance.Commands.AddCommand("access", true,
|
MainConsole.Instance.Commands.AddCommand("Users", true,
|
||||||
"login disable",
|
"login disable",
|
||||||
"login disable",
|
"login disable",
|
||||||
"Disable simulator logins",
|
"Disable simulator logins",
|
||||||
String.Empty,
|
String.Empty,
|
||||||
HandleLoginCommand);
|
HandleLoginCommand);
|
||||||
|
|
||||||
MainConsole.Instance.Commands.AddCommand("access", true,
|
MainConsole.Instance.Commands.AddCommand("Users", true,
|
||||||
"login status",
|
"login status",
|
||||||
"login status",
|
"login status",
|
||||||
"Show login status",
|
"Show login status",
|
||||||
|
|
|
@ -108,12 +108,14 @@ namespace OpenSim.Region.CoreModules.World.Archiver
|
||||||
// "[ARCHIVER]: Received {0} of {1} assets requested",
|
// "[ARCHIVER]: Received {0} of {1} assets requested",
|
||||||
// assetsFoundUuids.Count, assetsFoundUuids.Count + assetsNotFoundUuids.Count);
|
// assetsFoundUuids.Count, assetsFoundUuids.Count + assetsNotFoundUuids.Count);
|
||||||
|
|
||||||
|
m_log.InfoFormat("[ARCHIVER]: Adding region settings to archive.");
|
||||||
|
|
||||||
// Write out region settings
|
// Write out region settings
|
||||||
string settingsPath
|
string settingsPath
|
||||||
= String.Format("{0}{1}.xml", ArchiveConstants.SETTINGS_PATH, m_scene.RegionInfo.RegionName);
|
= String.Format("{0}{1}.xml", ArchiveConstants.SETTINGS_PATH, m_scene.RegionInfo.RegionName);
|
||||||
m_archiveWriter.WriteFile(settingsPath, RegionSettingsSerializer.Serialize(m_scene.RegionInfo.RegionSettings));
|
m_archiveWriter.WriteFile(settingsPath, RegionSettingsSerializer.Serialize(m_scene.RegionInfo.RegionSettings));
|
||||||
|
|
||||||
m_log.InfoFormat("[ARCHIVER]: Added region settings to archive.");
|
m_log.InfoFormat("[ARCHIVER]: Adding parcel settings to archive.");
|
||||||
|
|
||||||
// Write out land data (aka parcel) settings
|
// Write out land data (aka parcel) settings
|
||||||
List<ILandObject>landObjects = m_scene.LandChannel.AllParcels();
|
List<ILandObject>landObjects = m_scene.LandChannel.AllParcels();
|
||||||
|
@ -124,7 +126,8 @@ namespace OpenSim.Region.CoreModules.World.Archiver
|
||||||
landData.GlobalID.ToString());
|
landData.GlobalID.ToString());
|
||||||
m_archiveWriter.WriteFile(landDataPath, LandDataSerializer.Serialize(landData));
|
m_archiveWriter.WriteFile(landDataPath, LandDataSerializer.Serialize(landData));
|
||||||
}
|
}
|
||||||
m_log.InfoFormat("[ARCHIVER]: Added parcel settings to archive.");
|
|
||||||
|
m_log.InfoFormat("[ARCHIVER]: Adding terrain information to archive.");
|
||||||
|
|
||||||
// Write out terrain
|
// Write out terrain
|
||||||
string terrainPath
|
string terrainPath
|
||||||
|
@ -135,7 +138,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver
|
||||||
m_archiveWriter.WriteFile(terrainPath, ms.ToArray());
|
m_archiveWriter.WriteFile(terrainPath, ms.ToArray());
|
||||||
ms.Close();
|
ms.Close();
|
||||||
|
|
||||||
m_log.InfoFormat("[ARCHIVER]: Added terrain information to archive.");
|
m_log.InfoFormat("[ARCHIVER]: Adding scene objects to archive.");
|
||||||
|
|
||||||
// Write out scene object metadata
|
// Write out scene object metadata
|
||||||
foreach (SceneObjectGroup sceneObject in m_sceneObjects)
|
foreach (SceneObjectGroup sceneObject in m_sceneObjects)
|
||||||
|
@ -145,10 +148,6 @@ namespace OpenSim.Region.CoreModules.World.Archiver
|
||||||
string serializedObject = m_serialiser.SerializeGroupToXml2(sceneObject, m_options);
|
string serializedObject = m_serialiser.SerializeGroupToXml2(sceneObject, m_options);
|
||||||
m_archiveWriter.WriteFile(ArchiveHelpers.CreateObjectPath(sceneObject), serializedObject);
|
m_archiveWriter.WriteFile(ArchiveHelpers.CreateObjectPath(sceneObject), serializedObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
m_log.InfoFormat("[ARCHIVER]: Added scene objects to archive.");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -219,12 +219,19 @@ namespace OpenSim.Region.CoreModules.World.Archiver
|
||||||
m_log.InfoFormat("[ARCHIVER]: Added control file to archive.");
|
m_log.InfoFormat("[ARCHIVER]: Added control file to archive.");
|
||||||
|
|
||||||
if (SaveAssets)
|
if (SaveAssets)
|
||||||
new AssetsRequest(
|
{
|
||||||
new AssetsArchiver(archiveWriter), assetUuids,
|
AssetsRequest ar
|
||||||
m_scene.AssetService, m_scene.UserAccountService,
|
= new AssetsRequest(
|
||||||
m_scene.RegionInfo.ScopeID, options, awre.ReceivedAllAssets).Execute();
|
new AssetsArchiver(archiveWriter), assetUuids,
|
||||||
|
m_scene.AssetService, m_scene.UserAccountService,
|
||||||
|
m_scene.RegionInfo.ScopeID, options, awre.ReceivedAllAssets);
|
||||||
|
|
||||||
|
Util.FireAndForget(o => ar.Execute());
|
||||||
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
awre.ReceivedAllAssets(new List<UUID>(), new List<UUID>());
|
awre.ReceivedAllAssets(new List<UUID>(), new List<UUID>());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
catch (Exception)
|
catch (Exception)
|
||||||
{
|
{
|
||||||
|
|
|
@ -141,13 +141,15 @@ namespace OpenSim.Region.CoreModules.World.Archiver
|
||||||
PerformAssetsRequestCallback(null);
|
PerformAssetsRequestCallback(null);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (KeyValuePair<UUID, AssetType> kvp in m_uuids)
|
|
||||||
{
|
|
||||||
m_assetService.Get(kvp.Key.ToString(), kvp.Value, PreAssetRequestCallback);
|
|
||||||
}
|
|
||||||
|
|
||||||
m_requestCallbackTimer.Enabled = true;
|
m_requestCallbackTimer.Enabled = true;
|
||||||
|
|
||||||
|
foreach (KeyValuePair<UUID, AssetType> kvp in m_uuids)
|
||||||
|
{
|
||||||
|
// m_assetService.Get(kvp.Key.ToString(), kvp.Value, PreAssetRequestCallback);
|
||||||
|
AssetBase asset = m_assetService.Get(kvp.Key.ToString());
|
||||||
|
PreAssetRequestCallback(kvp.Key.ToString(), kvp.Value, asset);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void OnRequestCallbackTimeout(object source, ElapsedEventArgs args)
|
protected void OnRequestCallbackTimeout(object source, ElapsedEventArgs args)
|
||||||
|
|
|
@ -62,58 +62,25 @@ namespace OpenSim.Region.CoreModules.World.Estate
|
||||||
{
|
{
|
||||||
m_log.DebugFormat("[ESTATE MODULE]: Setting up estate commands for region {0}", m_module.Scene.RegionInfo.RegionName);
|
m_log.DebugFormat("[ESTATE MODULE]: Setting up estate commands for region {0}", m_module.Scene.RegionInfo.RegionName);
|
||||||
|
|
||||||
m_module.Scene.AddCommand(m_module, "set terrain texture",
|
m_module.Scene.AddCommand("Regions", m_module, "set terrain texture",
|
||||||
"set terrain texture <number> <uuid> [<x>] [<y>]",
|
"set terrain texture <number> <uuid> [<x>] [<y>]",
|
||||||
"Sets the terrain <number> to <uuid>, if <x> or <y> are specified, it will only " +
|
"Sets the terrain <number> to <uuid>, if <x> or <y> are specified, it will only " +
|
||||||
"set it on regions with a matching coordinate. Specify -1 in <x> or <y> to wildcard" +
|
"set it on regions with a matching coordinate. Specify -1 in <x> or <y> to wildcard" +
|
||||||
" that coordinate.",
|
" that coordinate.",
|
||||||
consoleSetTerrainTexture);
|
consoleSetTerrainTexture);
|
||||||
|
|
||||||
m_module.Scene.AddCommand(m_module, "set terrain heights",
|
m_module.Scene.AddCommand("Regions", m_module, "set terrain heights",
|
||||||
"set terrain heights <corner> <min> <max> [<x>] [<y>]",
|
"set terrain heights <corner> <min> <max> [<x>] [<y>]",
|
||||||
"Sets the terrain texture heights on corner #<corner> to <min>/<max>, if <x> or <y> are specified, it will only " +
|
"Sets the terrain texture heights on corner #<corner> to <min>/<max>, if <x> or <y> are specified, it will only " +
|
||||||
"set it on regions with a matching coordinate. Specify -1 in <x> or <y> to wildcard" +
|
"set it on regions with a matching coordinate. Specify -1 in <x> or <y> to wildcard" +
|
||||||
" that coordinate. Corner # SW = 0, NW = 1, SE = 2, NE = 3.",
|
" that coordinate. Corner # SW = 0, NW = 1, SE = 2, NE = 3.",
|
||||||
consoleSetTerrainHeights);
|
consoleSetTerrainHeights);
|
||||||
|
|
||||||
Command showCommand
|
|
||||||
= new Command("show", CommandIntentions.COMMAND_STATISTICAL, ShowEstatesCommand, "Shows all estates on the simulator.");
|
|
||||||
|
|
||||||
m_commander.RegisterCommand("show", showCommand);
|
m_module.Scene.AddCommand(
|
||||||
|
"Estates", m_module, "estate show", "estate show", "Shows all estates on the simulator.", ShowEstatesCommand);
|
||||||
m_module.Scene.RegisterModuleCommander(m_commander);
|
|
||||||
|
|
||||||
m_module.Scene.EventManager.OnPluginConsole += EventManagerOnPluginConsole;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Close()
|
public void Close() {}
|
||||||
{
|
|
||||||
m_module.Scene.EventManager.OnPluginConsole -= EventManagerOnPluginConsole;
|
|
||||||
m_module.Scene.UnregisterModuleCommander(m_commander.Name);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Processes commandline input. Do not call directly.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="args">Commandline arguments</param>
|
|
||||||
protected void EventManagerOnPluginConsole(string[] args)
|
|
||||||
{
|
|
||||||
if (args[0] == "estate")
|
|
||||||
{
|
|
||||||
if (args.Length == 1)
|
|
||||||
{
|
|
||||||
m_commander.ProcessConsoleCommand("help", new string[0]);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
string[] tmpArgs = new string[args.Length - 2];
|
|
||||||
int i;
|
|
||||||
for (i = 2; i < args.Length; i++)
|
|
||||||
tmpArgs[i - 2] = args[i];
|
|
||||||
|
|
||||||
m_commander.ProcessConsoleCommand(args[1], tmpArgs);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void consoleSetTerrainTexture(string module, string[] args)
|
protected void consoleSetTerrainTexture(string module, string[] args)
|
||||||
{
|
{
|
||||||
|
@ -201,7 +168,7 @@ namespace OpenSim.Region.CoreModules.World.Estate
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void ShowEstatesCommand(Object[] args)
|
protected void ShowEstatesCommand(string module, string[] cmd)
|
||||||
{
|
{
|
||||||
StringBuilder report = new StringBuilder();
|
StringBuilder report = new StringBuilder();
|
||||||
RegionInfo ri = m_module.Scene.RegionInfo;
|
RegionInfo ri = m_module.Scene.RegionInfo;
|
||||||
|
|
|
@ -94,8 +94,11 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
|
|
||||||
// caches ExtendedLandData
|
// caches ExtendedLandData
|
||||||
private Cache parcelInfoCache;
|
private Cache parcelInfoCache;
|
||||||
private Dictionary<UUID, Vector3> forcedPosition =
|
|
||||||
new Dictionary<UUID, Vector3>();
|
/// <summary>
|
||||||
|
/// Record positions that avatar's are currently being forced to move to due to parcel entry restrictions.
|
||||||
|
/// </summary>
|
||||||
|
private Dictionary<UUID, Vector3> forcedPosition = new Dictionary<UUID, Vector3>();
|
||||||
|
|
||||||
#region INonSharedRegionModule Members
|
#region INonSharedRegionModule Members
|
||||||
|
|
||||||
|
@ -224,22 +227,34 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
//When the avatar walks into a ban line on the ground, it prevents getting stuck
|
//When the avatar walks into a ban line on the ground, it prevents getting stuck
|
||||||
agentData.ControlFlags = (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY;
|
agentData.ControlFlags = (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY;
|
||||||
|
|
||||||
|
|
||||||
//Make sure we stop if they get about to the right place to prevent yoyo and prevents getting stuck on banlines
|
//Make sure we stop if they get about to the right place to prevent yoyo and prevents getting stuck on banlines
|
||||||
if (Vector3.Distance(clientAvatar.AbsolutePosition, forcedPosition[remoteClient.AgentId]) < .2)
|
if (Vector3.Distance(clientAvatar.AbsolutePosition, forcedPosition[remoteClient.AgentId]) < .2)
|
||||||
{
|
{
|
||||||
Debug.WriteLine(string.Format("Stopping force position because {0} is close enough to position {1}", forcedPosition[remoteClient.AgentId], clientAvatar.AbsolutePosition));
|
// m_log.DebugFormat(
|
||||||
|
// "[LAND MANAGEMENT MODULE]: Stopping force position of {0} because {1} is close enough to {2}",
|
||||||
|
// clientAvatar.Name, clientAvatar.AbsolutePosition, forcedPosition[remoteClient.AgentId]);
|
||||||
|
|
||||||
forcedPosition.Remove(remoteClient.AgentId);
|
forcedPosition.Remove(remoteClient.AgentId);
|
||||||
}
|
}
|
||||||
//if we are far away, teleport
|
//if we are far away, teleport
|
||||||
else if (Vector3.Distance(clientAvatar.AbsolutePosition, forcedPosition[remoteClient.AgentId]) > 3)
|
else if (Vector3.Distance(clientAvatar.AbsolutePosition, forcedPosition[remoteClient.AgentId]) > 3)
|
||||||
{
|
{
|
||||||
Debug.WriteLine(string.Format("Teleporting out because {0} is too far from avatar position {1}", forcedPosition[remoteClient.AgentId], clientAvatar.AbsolutePosition));
|
Vector3 forcePosition = forcedPosition[remoteClient.AgentId];
|
||||||
clientAvatar.Teleport(forcedPosition[remoteClient.AgentId]);
|
// m_log.DebugFormat(
|
||||||
|
// "[LAND MANAGEMENT MODULE]: Teleporting out {0} because {1} is too far from avatar position {2}",
|
||||||
|
// clientAvatar.Name, clientAvatar.AbsolutePosition, forcePosition);
|
||||||
|
|
||||||
|
m_scene.RequestTeleportLocation(remoteClient, m_scene.RegionInfo.RegionHandle,
|
||||||
|
forcePosition, clientAvatar.Lookat, (uint)Constants.TeleportFlags.ForceRedirect);
|
||||||
|
|
||||||
forcedPosition.Remove(remoteClient.AgentId);
|
forcedPosition.Remove(remoteClient.AgentId);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
// m_log.DebugFormat(
|
||||||
|
// "[LAND MANAGEMENT MODULE]: Forcing {0} from {1} to {2}",
|
||||||
|
// clientAvatar.Name, clientAvatar.AbsolutePosition, forcedPosition[remoteClient.AgentId]);
|
||||||
|
|
||||||
//Forces them toward the forced position we want if they aren't there yet
|
//Forces them toward the forced position we want if they aren't there yet
|
||||||
agentData.UseClientAgentPosition = true;
|
agentData.UseClientAgentPosition = true;
|
||||||
agentData.ClientAgentPosition = forcedPosition[remoteClient.AgentId];
|
agentData.ClientAgentPosition = forcedPosition[remoteClient.AgentId];
|
||||||
|
|
|
@ -272,7 +272,8 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
ParcelFlags.AllowGroupScripts |
|
ParcelFlags.AllowGroupScripts |
|
||||||
ParcelFlags.CreateGroupObjects |
|
ParcelFlags.CreateGroupObjects |
|
||||||
ParcelFlags.AllowAPrimitiveEntry |
|
ParcelFlags.AllowAPrimitiveEntry |
|
||||||
ParcelFlags.AllowGroupObjectEntry);
|
ParcelFlags.AllowGroupObjectEntry |
|
||||||
|
ParcelFlags.AllowFly);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_scene.Permissions.CanEditParcelProperties(remote_client.AgentId, this, GroupPowers.LandSetSale))
|
if (m_scene.Permissions.CanEditParcelProperties(remote_client.AgentId, this, GroupPowers.LandSetSale))
|
||||||
|
|
|
@ -78,45 +78,45 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands
|
||||||
m_scene = scene;
|
m_scene = scene;
|
||||||
m_console = MainConsole.Instance;
|
m_console = MainConsole.Instance;
|
||||||
|
|
||||||
m_console.Commands.AddCommand("region", false, "delete object owner",
|
m_console.Commands.AddCommand("Regions", false, "delete object owner",
|
||||||
"delete object owner <UUID>",
|
"delete object owner <UUID>",
|
||||||
"Delete a scene object by owner", HandleDeleteObject);
|
"Delete a scene object by owner", HandleDeleteObject);
|
||||||
m_console.Commands.AddCommand("region", false, "delete object creator",
|
m_console.Commands.AddCommand("Regions", false, "delete object creator",
|
||||||
"delete object creator <UUID>",
|
"delete object creator <UUID>",
|
||||||
"Delete a scene object by creator", HandleDeleteObject);
|
"Delete a scene object by creator", HandleDeleteObject);
|
||||||
m_console.Commands.AddCommand("region", false, "delete object uuid",
|
m_console.Commands.AddCommand("Regions", false, "delete object uuid",
|
||||||
"delete object uuid <UUID>",
|
"delete object uuid <UUID>",
|
||||||
"Delete a scene object by uuid", HandleDeleteObject);
|
"Delete a scene object by uuid", HandleDeleteObject);
|
||||||
m_console.Commands.AddCommand("region", false, "delete object name",
|
m_console.Commands.AddCommand("Regions", false, "delete object name",
|
||||||
"delete object name <name>",
|
"delete object name <name>",
|
||||||
"Delete a scene object by name", HandleDeleteObject);
|
"Delete a scene object by name", HandleDeleteObject);
|
||||||
m_console.Commands.AddCommand("region", false, "delete object outside",
|
m_console.Commands.AddCommand("Regions", false, "delete object outside",
|
||||||
"delete object outside",
|
"delete object outside",
|
||||||
"Delete all scene objects outside region boundaries", HandleDeleteObject);
|
"Delete all scene objects outside region boundaries", HandleDeleteObject);
|
||||||
|
|
||||||
m_console.Commands.AddCommand(
|
m_console.Commands.AddCommand(
|
||||||
"region",
|
"Regions",
|
||||||
false,
|
false,
|
||||||
"show object uuid",
|
"show object uuid",
|
||||||
"show object uuid <UUID>",
|
"show object uuid <UUID>",
|
||||||
"Show details of a scene object with the given UUID", HandleShowObjectByUuid);
|
"Show details of a scene object with the given UUID", HandleShowObjectByUuid);
|
||||||
|
|
||||||
m_console.Commands.AddCommand(
|
m_console.Commands.AddCommand(
|
||||||
"region",
|
"Regions",
|
||||||
false,
|
false,
|
||||||
"show object name",
|
"show object name",
|
||||||
"show object name <name>",
|
"show object name <name>",
|
||||||
"Show details of scene objects with the given name", HandleShowObjectByName);
|
"Show details of scene objects with the given name", HandleShowObjectByName);
|
||||||
|
|
||||||
m_console.Commands.AddCommand(
|
m_console.Commands.AddCommand(
|
||||||
"region",
|
"Regions",
|
||||||
false,
|
false,
|
||||||
"show part uuid",
|
"show part uuid",
|
||||||
"show part uuid <UUID>",
|
"show part uuid <UUID>",
|
||||||
"Show details of a scene object parts with the given UUID", HandleShowPartByUuid);
|
"Show details of a scene object parts with the given UUID", HandleShowPartByUuid);
|
||||||
|
|
||||||
m_console.Commands.AddCommand(
|
m_console.Commands.AddCommand(
|
||||||
"region",
|
"Regions",
|
||||||
false,
|
false,
|
||||||
"show part name",
|
"show part name",
|
||||||
"show part name <name>",
|
"show part name <name>",
|
||||||
|
|
|
@ -206,17 +206,17 @@ namespace OpenSim.Region.CoreModules.World.Permissions
|
||||||
m_scene.Permissions.OnControlPrimMedia += CanControlPrimMedia;
|
m_scene.Permissions.OnControlPrimMedia += CanControlPrimMedia;
|
||||||
m_scene.Permissions.OnInteractWithPrimMedia += CanInteractWithPrimMedia;
|
m_scene.Permissions.OnInteractWithPrimMedia += CanInteractWithPrimMedia;
|
||||||
|
|
||||||
m_scene.AddCommand(this, "bypass permissions",
|
m_scene.AddCommand("Users", this, "bypass permissions",
|
||||||
"bypass permissions <true / false>",
|
"bypass permissions <true / false>",
|
||||||
"Bypass permission checks",
|
"Bypass permission checks",
|
||||||
HandleBypassPermissions);
|
HandleBypassPermissions);
|
||||||
|
|
||||||
m_scene.AddCommand(this, "force permissions",
|
m_scene.AddCommand("Users", this, "force permissions",
|
||||||
"force permissions <true / false>",
|
"force permissions <true / false>",
|
||||||
"Force permissions on or off",
|
"Force permissions on or off",
|
||||||
HandleForcePermissions);
|
HandleForcePermissions);
|
||||||
|
|
||||||
m_scene.AddCommand(this, "debug permissions",
|
m_scene.AddCommand("Users", this, "debug permissions",
|
||||||
"debug permissions <true / false>",
|
"debug permissions <true / false>",
|
||||||
"Turn on permissions debugging",
|
"Turn on permissions debugging",
|
||||||
HandleDebugPermissions);
|
HandleDebugPermissions);
|
||||||
|
@ -677,18 +677,12 @@ namespace OpenSim.Region.CoreModules.World.Permissions
|
||||||
bool permission = false;
|
bool permission = false;
|
||||||
bool locked = false;
|
bool locked = false;
|
||||||
|
|
||||||
if (!m_scene.Entities.ContainsKey(objId))
|
SceneObjectPart part = m_scene.GetSceneObjectPart(objId);
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// If it's not an object, we cant edit it.
|
if (part == null)
|
||||||
if ((!(m_scene.Entities[objId] is SceneObjectGroup)))
|
|
||||||
{
|
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
|
|
||||||
SceneObjectGroup group = (SceneObjectGroup)m_scene.Entities[objId];
|
SceneObjectGroup group = part.ParentGroup;
|
||||||
|
|
||||||
UUID objectOwner = group.OwnerID;
|
UUID objectOwner = group.OwnerID;
|
||||||
locked = ((group.RootPart.OwnerMask & PERM_LOCKED) == 0);
|
locked = ((group.RootPart.OwnerMask & PERM_LOCKED) == 0);
|
||||||
|
@ -977,16 +971,6 @@ namespace OpenSim.Region.CoreModules.World.Permissions
|
||||||
DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name);
|
DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name);
|
||||||
if (m_bypassPermissions) return m_bypassPermissionsValue;
|
if (m_bypassPermissions) return m_bypassPermissionsValue;
|
||||||
|
|
||||||
SceneObjectPart part = m_scene.GetSceneObjectPart(objectID);
|
|
||||||
|
|
||||||
// If we selected a sub-prim to edit, the objectID won't represent the object, but only a part.
|
|
||||||
// We have to check the permissions of the group, though.
|
|
||||||
if (part.ParentID != 0)
|
|
||||||
{
|
|
||||||
objectID = part.ParentUUID;
|
|
||||||
part = m_scene.GetSceneObjectPart(objectID);
|
|
||||||
}
|
|
||||||
|
|
||||||
return GenericObjectPermission(editorID, objectID, false);
|
return GenericObjectPermission(editorID, objectID, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -66,21 +66,21 @@ namespace OpenSim.Region.CoreModules.World.Region
|
||||||
m_Scene = scene;
|
m_Scene = scene;
|
||||||
|
|
||||||
scene.RegisterModuleInterface<IRestartModule>(this);
|
scene.RegisterModuleInterface<IRestartModule>(this);
|
||||||
MainConsole.Instance.Commands.AddCommand("RestartModule",
|
MainConsole.Instance.Commands.AddCommand("Regions",
|
||||||
false, "region restart bluebox",
|
false, "region restart bluebox",
|
||||||
"region restart bluebox <message> <delta seconds>+",
|
"region restart bluebox <message> <delta seconds>+",
|
||||||
"Schedule a region restart",
|
"Schedule a region restart",
|
||||||
"Schedule a region restart after a given number of seconds. If one delta is given then the region is restarted in delta seconds time. A time to restart is sent to users in the region as a dismissable bluebox notice. If multiple deltas are given then a notice is sent when we reach each delta.",
|
"Schedule a region restart after a given number of seconds. If one delta is given then the region is restarted in delta seconds time. A time to restart is sent to users in the region as a dismissable bluebox notice. If multiple deltas are given then a notice is sent when we reach each delta.",
|
||||||
HandleRegionRestart);
|
HandleRegionRestart);
|
||||||
|
|
||||||
MainConsole.Instance.Commands.AddCommand("RestartModule",
|
MainConsole.Instance.Commands.AddCommand("Regions",
|
||||||
false, "region restart notice",
|
false, "region restart notice",
|
||||||
"region restart notice <message> <delta seconds>+",
|
"region restart notice <message> <delta seconds>+",
|
||||||
"Schedule a region restart",
|
"Schedule a region restart",
|
||||||
"Schedule a region restart after a given number of seconds. If one delta is given then the region is restarted in delta seconds time. A time to restart is sent to users in the region as a transient notice. If multiple deltas are given then a notice is sent when we reach each delta.",
|
"Schedule a region restart after a given number of seconds. If one delta is given then the region is restarted in delta seconds time. A time to restart is sent to users in the region as a transient notice. If multiple deltas are given then a notice is sent when we reach each delta.",
|
||||||
HandleRegionRestart);
|
HandleRegionRestart);
|
||||||
|
|
||||||
MainConsole.Instance.Commands.AddCommand("RestartModule",
|
MainConsole.Instance.Commands.AddCommand("Regions",
|
||||||
false, "region restart abort",
|
false, "region restart abort",
|
||||||
"region restart abort [<message>]",
|
"region restart abort [<message>]",
|
||||||
"Abort a region restart", HandleRegionRestart);
|
"Abort a region restart", HandleRegionRestart);
|
||||||
|
|
|
@ -148,6 +148,113 @@ namespace OpenSim.Region.CoreModules.World.Serialiser.Tests
|
||||||
<OtherParts />
|
<OtherParts />
|
||||||
</SceneObjectGroup>";
|
</SceneObjectGroup>";
|
||||||
|
|
||||||
|
private string badFloatsXml = @"
|
||||||
|
<SceneObjectGroup>
|
||||||
|
<RootPart>
|
||||||
|
<SceneObjectPart xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"">
|
||||||
|
<AllowedDrop>false</AllowedDrop>
|
||||||
|
<CreatorID><Guid>a6dacf01-4636-4bb9-8a97-30609438af9d</Guid></CreatorID>
|
||||||
|
<FolderID><Guid>e6a5a05e-e8cc-4816-8701-04165e335790</Guid></FolderID>
|
||||||
|
<InventorySerial>1</InventorySerial>
|
||||||
|
<TaskInventory />
|
||||||
|
<ObjectFlags>0</ObjectFlags>
|
||||||
|
<UUID><Guid>e6a5a05e-e8cc-4816-8701-04165e335790</Guid></UUID>
|
||||||
|
<LocalId>2698615125</LocalId>
|
||||||
|
<Name>NaughtyPrim</Name>
|
||||||
|
<Material>0</Material>
|
||||||
|
<PassTouches>false</PassTouches>
|
||||||
|
<RegionHandle>1099511628032000</RegionHandle>
|
||||||
|
<ScriptAccessPin>0</ScriptAccessPin>
|
||||||
|
<GroupPosition><X>147.23</X><Y>92.698</Y><Z>22.78084</Z></GroupPosition>
|
||||||
|
<OffsetPosition><X>0</X><Y>0</Y><Z>0</Z></OffsetPosition>
|
||||||
|
<RotationOffset><X>-4.371139E-08</X><Y>-1</Y><Z>-4.371139E-08</Z><W>0</W></RotationOffset>
|
||||||
|
<Velocity><X>0</X><Y>0</Y><Z>0</Z></Velocity>
|
||||||
|
<RotationalVelocity><X>0</X><Y>0</Y><Z>0</Z></RotationalVelocity>
|
||||||
|
<AngularVelocity><X>0</X><Y>0</Y><Z>0</Z></AngularVelocity>
|
||||||
|
<Acceleration><X>0</X><Y>0</Y><Z>0</Z></Acceleration>
|
||||||
|
<Description />
|
||||||
|
<Color />
|
||||||
|
<Text />
|
||||||
|
<SitName />
|
||||||
|
<TouchName />
|
||||||
|
<LinkNum>0</LinkNum>
|
||||||
|
<ClickAction>0</ClickAction>
|
||||||
|
<Shape>
|
||||||
|
<ProfileCurve>1</ProfileCurve>
|
||||||
|
<TextureEntry>AAAAAAAAERGZmQAAAAAABQCVlZUAAAAAQEAAAABAQAAAAAAAAAAAAAAAAAAAAA==</TextureEntry>
|
||||||
|
<ExtraParams>AA==</ExtraParams>
|
||||||
|
<PathBegin>0</PathBegin>
|
||||||
|
<PathCurve>16</PathCurve>
|
||||||
|
<PathEnd>0</PathEnd>
|
||||||
|
<PathRadiusOffset>0</PathRadiusOffset>
|
||||||
|
<PathRevolutions>0</PathRevolutions>
|
||||||
|
<PathScaleX>100</PathScaleX>
|
||||||
|
<PathScaleY>100</PathScaleY>
|
||||||
|
<PathShearX>0</PathShearX>
|
||||||
|
<PathShearY>0</PathShearY>
|
||||||
|
<PathSkew>0</PathSkew>
|
||||||
|
<PathTaperX>0</PathTaperX>
|
||||||
|
<PathTaperY>0</PathTaperY>
|
||||||
|
<PathTwist>0</PathTwist>
|
||||||
|
<PathTwistBegin>0</PathTwistBegin>
|
||||||
|
<PCode>9</PCode>
|
||||||
|
<ProfileBegin>0</ProfileBegin>
|
||||||
|
<ProfileEnd>0</ProfileEnd>
|
||||||
|
<ProfileHollow>0</ProfileHollow>
|
||||||
|
<Scale><X>10</X><Y>10</Y><Z>0.5</Z></Scale>
|
||||||
|
<State>0</State>
|
||||||
|
<ProfileShape>Square</ProfileShape>
|
||||||
|
<HollowShape>Same</HollowShape>
|
||||||
|
<SculptTexture><Guid>00000000-0000-0000-0000-000000000000</Guid></SculptTexture>
|
||||||
|
<SculptType>0</SculptType><SculptData />
|
||||||
|
<FlexiSoftness>0</FlexiSoftness>
|
||||||
|
<FlexiTension>0,5</FlexiTension>
|
||||||
|
<FlexiDrag>yo mamma</FlexiDrag>
|
||||||
|
<FlexiGravity>0</FlexiGravity>
|
||||||
|
<FlexiWind>0</FlexiWind>
|
||||||
|
<FlexiForceX>0</FlexiForceX>
|
||||||
|
<FlexiForceY>0</FlexiForceY>
|
||||||
|
<FlexiForceZ>0</FlexiForceZ>
|
||||||
|
<LightColorR>0</LightColorR>
|
||||||
|
<LightColorG>0</LightColorG>
|
||||||
|
<LightColorB>0</LightColorB>
|
||||||
|
<LightColorA>1</LightColorA>
|
||||||
|
<LightRadius>0</LightRadius>
|
||||||
|
<LightCutoff>0</LightCutoff>
|
||||||
|
<LightFalloff>0</LightFalloff>
|
||||||
|
<LightIntensity>1</LightIntensity>
|
||||||
|
<FlexiEntry>false</FlexiEntry>
|
||||||
|
<LightEntry>false</LightEntry>
|
||||||
|
<SculptEntry>false</SculptEntry>
|
||||||
|
</Shape>
|
||||||
|
<Scale><X>10</X><Y>10</Y><Z>0.5</Z></Scale>
|
||||||
|
<UpdateFlag>0</UpdateFlag>
|
||||||
|
<SitTargetOrientation><X>0</X><Y>0</Y><Z>0</Z><W>1</W></SitTargetOrientation>
|
||||||
|
<SitTargetPosition><X>0</X><Y>0</Y><Z>0</Z></SitTargetPosition>
|
||||||
|
<SitTargetPositionLL><X>0</X><Y>0</Y><Z>0</Z></SitTargetPositionLL>
|
||||||
|
<SitTargetOrientationLL><X>0</X><Y>0</Y><Z>0</Z><W>1</W></SitTargetOrientationLL>
|
||||||
|
<ParentID>0</ParentID>
|
||||||
|
<CreationDate>1211330445</CreationDate>
|
||||||
|
<Category>0</Category>
|
||||||
|
<SalePrice>0</SalePrice>
|
||||||
|
<ObjectSaleType>0</ObjectSaleType>
|
||||||
|
<OwnershipCost>0</OwnershipCost>
|
||||||
|
<GroupID><Guid>00000000-0000-0000-0000-000000000000</Guid></GroupID>
|
||||||
|
<OwnerID><Guid>a6dacf01-4636-4bb9-8a97-30609438af9d</Guid></OwnerID>
|
||||||
|
<LastOwnerID><Guid>a6dacf01-4636-4bb9-8a97-30609438af9d</Guid></LastOwnerID>
|
||||||
|
<BaseMask>2147483647</BaseMask>
|
||||||
|
<OwnerMask>2147483647</OwnerMask>
|
||||||
|
<GroupMask>0</GroupMask>
|
||||||
|
<EveryoneMask>0</EveryoneMask>
|
||||||
|
<NextOwnerMask>2147483647</NextOwnerMask>
|
||||||
|
<Flags>None</Flags>
|
||||||
|
<CollisionSound><Guid>00000000-0000-0000-0000-000000000000</Guid></CollisionSound>
|
||||||
|
<CollisionSoundVolume>0</CollisionSoundVolume>
|
||||||
|
</SceneObjectPart>
|
||||||
|
</RootPart>
|
||||||
|
<OtherParts />
|
||||||
|
</SceneObjectGroup>";
|
||||||
|
|
||||||
private string xml2 = @"
|
private string xml2 = @"
|
||||||
<SceneObjectGroup>
|
<SceneObjectGroup>
|
||||||
<SceneObjectPart xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"">
|
<SceneObjectPart xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"">
|
||||||
|
@ -256,6 +363,32 @@ namespace OpenSim.Region.CoreModules.World.Serialiser.Tests
|
||||||
// TODO: Check other properties
|
// TODO: Check other properties
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestDeserializeBadFloatsXml()
|
||||||
|
{
|
||||||
|
TestHelpers.InMethod();
|
||||||
|
// log4net.Config.XmlConfigurator.Configure();
|
||||||
|
|
||||||
|
SceneObjectGroup so = SceneObjectSerializer.FromOriginalXmlFormat(badFloatsXml);
|
||||||
|
SceneObjectPart rootPart = so.RootPart;
|
||||||
|
|
||||||
|
Assert.That(rootPart.UUID, Is.EqualTo(new UUID("e6a5a05e-e8cc-4816-8701-04165e335790")));
|
||||||
|
Assert.That(rootPart.CreatorID, Is.EqualTo(new UUID("a6dacf01-4636-4bb9-8a97-30609438af9d")));
|
||||||
|
Assert.That(rootPart.Name, Is.EqualTo("NaughtyPrim"));
|
||||||
|
|
||||||
|
// This terminates the deserialization earlier if couldn't be parsed.
|
||||||
|
// TODO: Need to address this
|
||||||
|
Assert.That(rootPart.GroupPosition.X, Is.EqualTo(147.23f));
|
||||||
|
|
||||||
|
Assert.That(rootPart.Shape.PathCurve, Is.EqualTo(16));
|
||||||
|
|
||||||
|
// Defaults for bad parses
|
||||||
|
Assert.That(rootPart.Shape.FlexiTension, Is.EqualTo(0));
|
||||||
|
Assert.That(rootPart.Shape.FlexiDrag, Is.EqualTo(0));
|
||||||
|
|
||||||
|
// TODO: Check other properties
|
||||||
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void TestSerializeXml()
|
public void TestSerializeXml()
|
||||||
{
|
{
|
||||||
|
|
|
@ -277,18 +277,19 @@ namespace OpenSim.Region.CoreModules
|
||||||
m_frame = 0;
|
m_frame = 0;
|
||||||
|
|
||||||
// This one puts an entry in the main help screen
|
// This one puts an entry in the main help screen
|
||||||
m_scene.AddCommand(this, String.Empty, "sun", "Usage: sun [param] [value] - Get or Update Sun module paramater", null);
|
// m_scene.AddCommand("Regions", this, "sun", "sun", "Usage: sun [param] [value] - Get or Update Sun module paramater", null);
|
||||||
|
|
||||||
// This one enables the ability to type just "sun" without any parameters
|
// This one enables the ability to type just "sun" without any parameters
|
||||||
m_scene.AddCommand(this, "sun", "", "", HandleSunConsoleCommand);
|
// m_scene.AddCommand("Regions", this, "sun", "", "", HandleSunConsoleCommand);
|
||||||
foreach (KeyValuePair<string, string> kvp in GetParamList())
|
foreach (KeyValuePair<string, string> kvp in GetParamList())
|
||||||
{
|
{
|
||||||
m_scene.AddCommand(this, String.Format("sun {0}", kvp.Key), String.Format("{0} - {1}", kvp.Key, kvp.Value), "", HandleSunConsoleCommand);
|
string sunCommand = string.Format("sun {0}", kvp.Key);
|
||||||
|
m_scene.AddCommand("Regions", this, sunCommand, string.Format("{0} [<value>]", sunCommand), kvp.Value, "", HandleSunConsoleCommand);
|
||||||
}
|
}
|
||||||
|
|
||||||
TimeZone local = TimeZone.CurrentTimeZone;
|
TimeZone local = TimeZone.CurrentTimeZone;
|
||||||
TicksUTCOffset = local.GetUtcOffset(local.ToLocalTime(DateTime.Now)).Ticks;
|
TicksUTCOffset = local.GetUtcOffset(local.ToLocalTime(DateTime.Now)).Ticks;
|
||||||
m_log.Debug("[SUN]: localtime offset is " + TicksUTCOffset);
|
m_log.DebugFormat("[SUN]: localtime offset is {0}", TicksUTCOffset);
|
||||||
|
|
||||||
// Align ticks with Second Life
|
// Align ticks with Second Life
|
||||||
|
|
||||||
|
|
|
@ -117,24 +117,31 @@ namespace OpenSim.Region.CoreModules
|
||||||
}
|
}
|
||||||
|
|
||||||
// This one puts an entry in the main help screen
|
// This one puts an entry in the main help screen
|
||||||
m_scene.AddCommand(this, String.Empty, "wind", "Usage: wind <plugin> <param> [value] - Get or Update Wind paramaters", null);
|
// m_scene.AddCommand("Regions", this, "wind", "wind", "Usage: wind <plugin> <param> [value] - Get or Update Wind paramaters", null);
|
||||||
|
|
||||||
// This one enables the ability to type just the base command without any parameters
|
// This one enables the ability to type just the base command without any parameters
|
||||||
m_scene.AddCommand(this, "wind", "", "", HandleConsoleCommand);
|
// m_scene.AddCommand("Regions", this, "wind", "", "", HandleConsoleCommand);
|
||||||
|
|
||||||
// Get a list of the parameters for each plugin
|
// Get a list of the parameters for each plugin
|
||||||
foreach (IWindModelPlugin windPlugin in m_availableWindPlugins.Values)
|
foreach (IWindModelPlugin windPlugin in m_availableWindPlugins.Values)
|
||||||
{
|
{
|
||||||
m_scene.AddCommand(this, String.Format("wind base wind_plugin {0}", windPlugin.Name), String.Format("{0} - {1}", windPlugin.Name, windPlugin.Description), "", HandleConsoleBaseCommand);
|
// m_scene.AddCommand("Regions", this, String.Format("wind base wind_plugin {0}", windPlugin.Name), String.Format("{0} - {1}", windPlugin.Name, windPlugin.Description), "", HandleConsoleBaseCommand);
|
||||||
m_scene.AddCommand(this, String.Format("wind base wind_update_rate"), "Change the wind update rate.", "", HandleConsoleBaseCommand);
|
m_scene.AddCommand(
|
||||||
|
"Regions",
|
||||||
|
this,
|
||||||
|
"wind base wind_update_rate",
|
||||||
|
"wind base wind_update_rate [<value>]",
|
||||||
|
"Get or set the wind update rate.",
|
||||||
|
"",
|
||||||
|
HandleConsoleBaseCommand);
|
||||||
|
|
||||||
foreach (KeyValuePair<string, string> kvp in windPlugin.WindParams())
|
foreach (KeyValuePair<string, string> kvp in windPlugin.WindParams())
|
||||||
{
|
{
|
||||||
m_scene.AddCommand(this, String.Format("wind {0} {1}", windPlugin.Name, kvp.Key), String.Format("{0} : {1} - {2}", windPlugin.Name, kvp.Key, kvp.Value), "", HandleConsoleParamCommand);
|
string windCommand = String.Format("wind {0} {1}", windPlugin.Name, kvp.Key);
|
||||||
|
m_scene.AddCommand("Regions", this, windCommand, string.Format("{0} [<value>]", windCommand), kvp.Value, "", HandleConsoleParamCommand);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Register event handlers for when Avatars enter the region, and frame ticks
|
// Register event handlers for when Avatars enter the region, and frame ticks
|
||||||
m_scene.EventManager.OnFrame += WindUpdate;
|
m_scene.EventManager.OnFrame += WindUpdate;
|
||||||
m_scene.EventManager.OnMakeRootAgent += OnAgentEnteredRegion;
|
m_scene.EventManager.OnMakeRootAgent += OnAgentEnteredRegion;
|
||||||
|
|
|
@ -102,7 +102,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap
|
||||||
m_scene.RegisterModuleInterface<IWorldMapModule>(this);
|
m_scene.RegisterModuleInterface<IWorldMapModule>(this);
|
||||||
|
|
||||||
m_scene.AddCommand(
|
m_scene.AddCommand(
|
||||||
this, "export-map",
|
"Regions", this, "export-map",
|
||||||
"export-map [<path>]",
|
"export-map [<path>]",
|
||||||
"Save an image of the world map", HandleExportWorldMapConsoleCommand);
|
"Save an image of the world map", HandleExportWorldMapConsoleCommand);
|
||||||
|
|
||||||
|
@ -132,7 +132,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
public Type ReplaceableInterface
|
public Type ReplaceableInterface
|
||||||
{
|
{
|
||||||
get { return null; }
|
get { return null; }
|
||||||
}
|
}
|
||||||
|
@ -220,7 +220,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap
|
||||||
// There is a major hack going on in this method. The viewer doesn't request
|
// There is a major hack going on in this method. The viewer doesn't request
|
||||||
// map blocks (RequestMapBlocks) above 2048. That means that if we don't hack,
|
// map blocks (RequestMapBlocks) above 2048. That means that if we don't hack,
|
||||||
// grids above that cell don't have a map at all. So, here's the hack: we wait
|
// grids above that cell don't have a map at all. So, here's the hack: we wait
|
||||||
// for this CAP request to come, and we inject the map blocks at this point.
|
// for this CAP request to come, and we inject the map blocks at this point.
|
||||||
// In a normal scenario, this request simply sends back the MapLayer (the blue color).
|
// In a normal scenario, this request simply sends back the MapLayer (the blue color).
|
||||||
// In the hacked scenario, it also sends the map blocks via UDP.
|
// In the hacked scenario, it also sends the map blocks via UDP.
|
||||||
//
|
//
|
||||||
|
@ -351,6 +351,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap
|
||||||
process,
|
process,
|
||||||
string.Format("MapItemRequestThread ({0})", m_scene.RegionInfo.RegionName),
|
string.Format("MapItemRequestThread ({0})", m_scene.RegionInfo.RegionName),
|
||||||
ThreadPriority.BelowNormal,
|
ThreadPriority.BelowNormal,
|
||||||
|
true,
|
||||||
true);
|
true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -750,7 +751,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap
|
||||||
{
|
{
|
||||||
uint x = 0, y = 0;
|
uint x = 0, y = 0;
|
||||||
Utils.LongToUInts(regionhandle, out x, out y);
|
Utils.LongToUInts(regionhandle, out x, out y);
|
||||||
GridRegion mreg = m_scene.GridService.GetRegionByPosition(m_scene.RegionInfo.ScopeID, (int)x, (int)y);
|
GridRegion mreg = m_scene.GridService.GetRegionByPosition(m_scene.RegionInfo.ScopeID, (int)x, (int)y);
|
||||||
|
|
||||||
if (mreg != null)
|
if (mreg != null)
|
||||||
{
|
{
|
||||||
|
@ -856,7 +857,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
if (os != null)
|
if (os != null)
|
||||||
os.Close();
|
os.Close();
|
||||||
}
|
}
|
||||||
|
|
||||||
string response_mapItems_reply = null;
|
string response_mapItems_reply = null;
|
||||||
|
@ -959,16 +960,16 @@ namespace OpenSim.Region.CoreModules.World.WorldMap
|
||||||
// on an unloaded square.
|
// on an unloaded square.
|
||||||
// But make sure: Look whether the one we requested is in there
|
// But make sure: Look whether the one we requested is in there
|
||||||
List<GridRegion> regions = m_scene.GridService.GetRegionRange(m_scene.RegionInfo.ScopeID,
|
List<GridRegion> regions = m_scene.GridService.GetRegionRange(m_scene.RegionInfo.ScopeID,
|
||||||
minX * (int)Constants.RegionSize,
|
minX * (int)Constants.RegionSize,
|
||||||
maxX * (int)Constants.RegionSize,
|
maxX * (int)Constants.RegionSize,
|
||||||
minY * (int)Constants.RegionSize,
|
minY * (int)Constants.RegionSize,
|
||||||
maxY * (int)Constants.RegionSize);
|
maxY * (int)Constants.RegionSize);
|
||||||
|
|
||||||
if (regions != null)
|
if (regions != null)
|
||||||
{
|
{
|
||||||
foreach (GridRegion r in regions)
|
foreach (GridRegion r in regions)
|
||||||
{
|
{
|
||||||
if ((r.RegionLocX == minX * (int)Constants.RegionSize) &&
|
if ((r.RegionLocX == minX * (int)Constants.RegionSize) &&
|
||||||
(r.RegionLocY == minY * (int)Constants.RegionSize))
|
(r.RegionLocY == minY * (int)Constants.RegionSize))
|
||||||
{
|
{
|
||||||
// found it => add it to response
|
// found it => add it to response
|
||||||
|
@ -1003,7 +1004,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap
|
||||||
{
|
{
|
||||||
List<MapBlockData> mapBlocks = new List<MapBlockData>();
|
List<MapBlockData> mapBlocks = new List<MapBlockData>();
|
||||||
List<GridRegion> regions = m_scene.GridService.GetRegionRange(m_scene.RegionInfo.ScopeID,
|
List<GridRegion> regions = m_scene.GridService.GetRegionRange(m_scene.RegionInfo.ScopeID,
|
||||||
(minX - 4) * (int)Constants.RegionSize,
|
(minX - 4) * (int)Constants.RegionSize,
|
||||||
(maxX + 4) * (int)Constants.RegionSize,
|
(maxX + 4) * (int)Constants.RegionSize,
|
||||||
(minY - 4) * (int)Constants.RegionSize,
|
(minY - 4) * (int)Constants.RegionSize,
|
||||||
(maxY + 4) * (int)Constants.RegionSize);
|
(maxY + 4) * (int)Constants.RegionSize);
|
||||||
|
@ -1335,7 +1336,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap
|
||||||
// Cannot create a map for a nonexistant heightmap
|
// Cannot create a map for a nonexistant heightmap
|
||||||
if (m_scene.Heightmap == null)
|
if (m_scene.Heightmap == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
//create a texture asset of the terrain
|
//create a texture asset of the terrain
|
||||||
IMapImageGenerator terrain = m_scene.RequestModuleInterface<IMapImageGenerator>();
|
IMapImageGenerator terrain = m_scene.RequestModuleInterface<IMapImageGenerator>();
|
||||||
if (terrain == null)
|
if (terrain == null)
|
||||||
|
@ -1344,7 +1345,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap
|
||||||
byte[] data = terrain.WriteJpeg2000Image();
|
byte[] data = terrain.WriteJpeg2000Image();
|
||||||
if (data == null)
|
if (data == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
byte[] overlay = GenerateOverlay();
|
byte[] overlay = GenerateOverlay();
|
||||||
|
|
||||||
m_log.Debug("[WORLDMAP]: STORING MAPTILE IMAGE");
|
m_log.Debug("[WORLDMAP]: STORING MAPTILE IMAGE");
|
||||||
|
@ -1365,7 +1366,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap
|
||||||
// Store the new one
|
// Store the new one
|
||||||
m_log.DebugFormat("[WORLDMAP]: Storing map tile {0}", asset.ID);
|
m_log.DebugFormat("[WORLDMAP]: Storing map tile {0}", asset.ID);
|
||||||
m_scene.AssetService.Store(asset);
|
m_scene.AssetService.Store(asset);
|
||||||
|
|
||||||
if (overlay != null)
|
if (overlay != null)
|
||||||
{
|
{
|
||||||
parcelImageID = UUID.Random();
|
parcelImageID = UUID.Random();
|
||||||
|
@ -1389,7 +1390,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap
|
||||||
m_scene.RegionInfo.RegionSettings.TerrainImageID = terrainImageID;
|
m_scene.RegionInfo.RegionSettings.TerrainImageID = terrainImageID;
|
||||||
m_scene.RegionInfo.RegionSettings.ParcelImageID = parcelImageID;
|
m_scene.RegionInfo.RegionSettings.ParcelImageID = parcelImageID;
|
||||||
m_scene.RegionInfo.RegionSettings.Save();
|
m_scene.RegionInfo.RegionSettings.Save();
|
||||||
|
|
||||||
// Delete the old one
|
// Delete the old one
|
||||||
// m_log.DebugFormat("[WORLDMAP]: Deleting old map tile {0}", lastTerrainImageID);
|
// m_log.DebugFormat("[WORLDMAP]: Deleting old map tile {0}", lastTerrainImageID);
|
||||||
m_scene.AssetService.Delete(lastTerrainImageID.ToString());
|
m_scene.AssetService.Delete(lastTerrainImageID.ToString());
|
||||||
|
@ -1468,18 +1469,18 @@ namespace OpenSim.Region.CoreModules.World.WorldMap
|
||||||
if ((land.LandData.Flags & (uint)ParcelFlags.ForSale) != 0)
|
if ((land.LandData.Flags & (uint)ParcelFlags.ForSale) != 0)
|
||||||
{
|
{
|
||||||
landForSale = true;
|
landForSale = true;
|
||||||
|
|
||||||
saleBitmap = land.MergeLandBitmaps(saleBitmap, land.GetLandBitmap());
|
saleBitmap = land.MergeLandBitmaps(saleBitmap, land.GetLandBitmap());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!landForSale)
|
if (!landForSale)
|
||||||
{
|
{
|
||||||
m_log.DebugFormat("[WORLD MAP]: Region {0} has no parcels for sale, not geenrating overlay", m_scene.RegionInfo.RegionName);
|
m_log.DebugFormat("[WORLD MAP]: Region {0} has no parcels for sale, not generating overlay", m_scene.RegionInfo.RegionName);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_log.DebugFormat("[WORLD MAP]: Region {0} has parcels for sale, genrating overlay", m_scene.RegionInfo.RegionName);
|
m_log.DebugFormat("[WORLD MAP]: Region {0} has parcels for sale, generating overlay", m_scene.RegionInfo.RegionName);
|
||||||
|
|
||||||
for (int x = 0 ; x < 64 ; x++)
|
for (int x = 0 ; x < 64 ; x++)
|
||||||
{
|
{
|
||||||
|
|
|
@ -103,10 +103,10 @@ namespace OpenSim.Region.DataSnapshot
|
||||||
m_enabled = config.Configs["DataSnapshot"].GetBoolean("index_sims", m_enabled);
|
m_enabled = config.Configs["DataSnapshot"].GetBoolean("index_sims", m_enabled);
|
||||||
IConfig conf = config.Configs["GridService"];
|
IConfig conf = config.Configs["GridService"];
|
||||||
if (conf != null)
|
if (conf != null)
|
||||||
m_gridinfo.Add("gridserverURL", conf.GetString("GridServerURI", "http://127.0.0.1:8003"));
|
m_gridinfo.Add("gatekeeperURL", conf.GetString("Gatekeeper", String.Empty));
|
||||||
|
|
||||||
m_gridinfo.Add(
|
m_gridinfo.Add(
|
||||||
"Name", config.Configs["DataSnapshot"].GetString("gridname", "the lost continent of hippo"));
|
"name", config.Configs["DataSnapshot"].GetString("gridname", "the lost continent of hippo"));
|
||||||
m_exposure_level = config.Configs["DataSnapshot"].GetString("data_exposure", m_exposure_level);
|
m_exposure_level = config.Configs["DataSnapshot"].GetString("data_exposure", m_exposure_level);
|
||||||
m_period = config.Configs["DataSnapshot"].GetInt("default_snapshot_period", m_period);
|
m_period = config.Configs["DataSnapshot"].GetInt("default_snapshot_period", m_period);
|
||||||
m_maxStales = config.Configs["DataSnapshot"].GetInt("max_changes_before_update", m_maxStales);
|
m_maxStales = config.Configs["DataSnapshot"].GetInt("max_changes_before_update", m_maxStales);
|
||||||
|
|
|
@ -49,6 +49,11 @@ namespace OpenSim.Region.Framework.Interfaces
|
||||||
|
|
||||||
public interface IWorldComm
|
public interface IWorldComm
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Total number of listeners
|
||||||
|
/// </summary>
|
||||||
|
int ListenerCount { get; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Create a listen event callback with the specified filters.
|
/// Create a listen event callback with the specified filters.
|
||||||
/// The parameters localID,itemID are needed to uniquely identify
|
/// The parameters localID,itemID are needed to uniquely identify
|
||||||
|
|
|
@ -138,8 +138,11 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
public event OnPermissionErrorDelegate OnPermissionError;
|
public event OnPermissionErrorDelegate OnPermissionError;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Fired when a new script is created.
|
/// Fired when a script is run.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// Occurs after OnNewScript.
|
||||||
|
/// </remarks>
|
||||||
public event NewRezScript OnRezScript;
|
public event NewRezScript OnRezScript;
|
||||||
public delegate void NewRezScript(uint localID, UUID itemID, string script, int startParam, bool postOnRez, string engine, int stateSource);
|
public delegate void NewRezScript(uint localID, UUID itemID, string script, int startParam, bool postOnRez, string engine, int stateSource);
|
||||||
|
|
||||||
|
@ -173,6 +176,9 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
public delegate void AvatarEnteringNewParcel(ScenePresence avatar, int localLandID, UUID regionID);
|
public delegate void AvatarEnteringNewParcel(ScenePresence avatar, int localLandID, UUID regionID);
|
||||||
public event AvatarEnteringNewParcel OnAvatarEnteringNewParcel;
|
public event AvatarEnteringNewParcel OnAvatarEnteringNewParcel;
|
||||||
|
|
||||||
|
public delegate void AvatarAppearanceChange(ScenePresence avatar);
|
||||||
|
public event AvatarAppearanceChange OnAvatarAppearanceChange;
|
||||||
|
|
||||||
public event Action<ScenePresence> OnSignificantClientMovement;
|
public event Action<ScenePresence> OnSignificantClientMovement;
|
||||||
|
|
||||||
public delegate void IncomingInstantMessage(GridInstantMessage message);
|
public delegate void IncomingInstantMessage(GridInstantMessage message);
|
||||||
|
@ -184,10 +190,74 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
public event ClientClosed OnClientClosed;
|
public event ClientClosed OnClientClosed;
|
||||||
|
|
||||||
|
public delegate void NewScript(UUID clientID, SceneObjectPart part, UUID itemID);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// This is fired when a scene object property that a script might be interested in (such as color, scale or
|
/// Fired when a script is created.
|
||||||
/// inventory) changes. Only enough information is sent for the LSL changed event
|
/// </summary>
|
||||||
/// (see http://lslwiki.net/lslwiki/wakka.php?wakka=changed)
|
/// <remarks>
|
||||||
|
/// Occurs before OnRezScript
|
||||||
|
/// </remarks>
|
||||||
|
public event NewScript OnNewScript;
|
||||||
|
|
||||||
|
public virtual void TriggerNewScript(UUID clientID, SceneObjectPart part, UUID itemID)
|
||||||
|
{
|
||||||
|
NewScript handlerNewScript = OnNewScript;
|
||||||
|
if (handlerNewScript != null)
|
||||||
|
{
|
||||||
|
foreach (NewScript d in handlerNewScript.GetInvocationList())
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
d(clientID, part, itemID);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
m_log.ErrorFormat(
|
||||||
|
"[EVENT MANAGER]: Delegate for TriggerNewScript failed - continuing. {0} {1}",
|
||||||
|
e.Message, e.StackTrace);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public delegate void UpdateScript(UUID clientID, UUID itemId, UUID primId, bool isScriptRunning, UUID newAssetID);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// An indication that the script has changed.
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// Triggered after the scene receives a client's upload of an updated script and has stored it in an asset.
|
||||||
|
/// </remarks>
|
||||||
|
public event UpdateScript OnUpdateScript;
|
||||||
|
|
||||||
|
public virtual void TriggerUpdateScript(UUID clientId, UUID itemId, UUID primId, bool isScriptRunning, UUID newAssetID)
|
||||||
|
{
|
||||||
|
UpdateScript handlerUpdateScript = OnUpdateScript;
|
||||||
|
if (handlerUpdateScript != null)
|
||||||
|
{
|
||||||
|
foreach (UpdateScript d in handlerUpdateScript.GetInvocationList())
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
d(clientId, itemId, primId, isScriptRunning, newAssetID);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
m_log.ErrorFormat(
|
||||||
|
"[EVENT MANAGER]: Delegate for TriggerUpdateScript failed - continuing. {0} {1}",
|
||||||
|
e.Message, e.StackTrace);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// ScriptChangedEvent is fired when a scene object property that a script might be interested
|
||||||
|
/// in (such as color, scale or inventory) changes. Only enough information sent is for the LSL changed event.
|
||||||
|
/// This is not an indication that the script has changed (see OnUpdateScript for that).
|
||||||
|
/// This event is sent to a script to tell it that some property changed on
|
||||||
|
/// the object the script is in. See http://lslwiki.net/lslwiki/wakka.php?wakka=changed .
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public event ScriptChangedEvent OnScriptChangedEvent;
|
public event ScriptChangedEvent OnScriptChangedEvent;
|
||||||
public delegate void ScriptChangedEvent(uint localID, uint change);
|
public delegate void ScriptChangedEvent(uint localID, uint change);
|
||||||
|
@ -1238,6 +1308,27 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void TriggerAvatarAppearanceChanged(ScenePresence avatar)
|
||||||
|
{
|
||||||
|
AvatarAppearanceChange handler = OnAvatarAppearanceChange;
|
||||||
|
if (handler != null)
|
||||||
|
{
|
||||||
|
foreach (AvatarAppearanceChange d in handler.GetInvocationList())
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
d(avatar);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
m_log.ErrorFormat(
|
||||||
|
"[EVENT MANAGER]: Delegate for TriggerAvatarAppearanceChanged failed - continuing. {0} {1}",
|
||||||
|
e.Message, e.StackTrace);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void TriggerIncomingInstantMessage(GridInstantMessage message)
|
public void TriggerIncomingInstantMessage(GridInstantMessage message)
|
||||||
{
|
{
|
||||||
IncomingInstantMessage handlerIncomingInstantMessage = OnIncomingInstantMessage;
|
IncomingInstantMessage handlerIncomingInstantMessage = OnIncomingInstantMessage;
|
||||||
|
|
|
@ -283,6 +283,10 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
{
|
{
|
||||||
remoteClient.SendAgentAlertMessage("Script saved", false);
|
remoteClient.SendAgentAlertMessage("Script saved", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Tell anyone managing scripts that a script has been reloaded/changed
|
||||||
|
EventManager.TriggerUpdateScript(remoteClient.AgentId, itemId, primId, isScriptRunning, item.AssetID);
|
||||||
|
|
||||||
part.ParentGroup.ResumeScripts();
|
part.ParentGroup.ResumeScripts();
|
||||||
return errors;
|
return errors;
|
||||||
}
|
}
|
||||||
|
@ -629,7 +633,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
{
|
{
|
||||||
IInventoryAccessModule invAccess = RequestModuleInterface<IInventoryAccessModule>();
|
IInventoryAccessModule invAccess = RequestModuleInterface<IInventoryAccessModule>();
|
||||||
if (invAccess != null)
|
if (invAccess != null)
|
||||||
invAccess.TransferInventoryAssets(itemCopy, senderId, recipient);
|
Util.FireAndForget(delegate { invAccess.TransferInventoryAssets(itemCopy, senderId, recipient); });
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!Permissions.BypassPermissions())
|
if (!Permissions.BypassPermissions())
|
||||||
|
@ -1151,8 +1155,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
TaskInventoryItem item = part.Inventory.GetInventoryItem(itemId);
|
if ((taskItem.CurrentPermissions & (uint)PermissionMask.Copy) == 0)
|
||||||
if ((item.CurrentPermissions & (uint)PermissionMask.Copy) == 0)
|
|
||||||
{
|
{
|
||||||
// If the item to be moved is no copy, we need to be able to
|
// If the item to be moved is no copy, we need to be able to
|
||||||
// edit the prim.
|
// edit the prim.
|
||||||
|
@ -1624,9 +1627,13 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
// have state in inventory
|
// have state in inventory
|
||||||
part.Inventory.CreateScriptInstance(copyID, 0, false, DefaultScriptEngine, 0);
|
part.Inventory.CreateScriptInstance(copyID, 0, false, DefaultScriptEngine, 0);
|
||||||
|
|
||||||
|
// tell anyone watching that there is a new script in town
|
||||||
|
EventManager.TriggerNewScript(agentID, part, copyID);
|
||||||
|
|
||||||
// m_log.InfoFormat("[PRIMINVENTORY]: " +
|
// m_log.InfoFormat("[PRIMINVENTORY]: " +
|
||||||
// "Rezzed script {0} into prim local ID {1} for user {2}",
|
// "Rezzed script {0} into prim local ID {1} for user {2}",
|
||||||
// item.inventoryName, localID, remoteClient.Name);
|
// item.inventoryName, localID, remoteClient.Name);
|
||||||
|
|
||||||
part.ParentGroup.ResumeScripts();
|
part.ParentGroup.ResumeScripts();
|
||||||
|
|
||||||
return part;
|
return part;
|
||||||
|
@ -1707,6 +1714,10 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
part.Inventory.AddInventoryItem(taskItem, false);
|
part.Inventory.AddInventoryItem(taskItem, false);
|
||||||
part.Inventory.CreateScriptInstance(taskItem, 0, false, DefaultScriptEngine, 0);
|
part.Inventory.CreateScriptInstance(taskItem, 0, false, DefaultScriptEngine, 0);
|
||||||
|
|
||||||
|
// tell anyone managing scripts that a new script exists
|
||||||
|
EventManager.TriggerNewScript(agentID, part, taskItem.ItemID);
|
||||||
|
|
||||||
part.ParentGroup.ResumeScripts();
|
part.ParentGroup.ResumeScripts();
|
||||||
|
|
||||||
return part;
|
return part;
|
||||||
|
@ -1926,7 +1937,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
foreach (SceneObjectGroup g in deleteGroups)
|
foreach (SceneObjectGroup g in deleteGroups)
|
||||||
{
|
{
|
||||||
AddReturn(g.OwnerID, g.Name, g.AbsolutePosition, "parcel owner return");
|
AddReturn(g.OwnerID == g.GroupID ? g.LastOwnerID : g.OwnerID, g.Name, g.AbsolutePosition, "parcel owner return");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -596,7 +596,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
#endregion Region Settings
|
#endregion Region Settings
|
||||||
|
|
||||||
MainConsole.Instance.Commands.AddCommand("region", false, "reload estate",
|
MainConsole.Instance.Commands.AddCommand("Estates", false, "reload estate",
|
||||||
"reload estate",
|
"reload estate",
|
||||||
"Reload the estate data", HandleReloadEstate);
|
"Reload the estate data", HandleReloadEstate);
|
||||||
|
|
||||||
|
@ -628,10 +628,10 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
#region Region Config
|
#region Region Config
|
||||||
|
|
||||||
try
|
// Region config overrides global config
|
||||||
|
//
|
||||||
|
if (m_config.Configs["Startup"] != null)
|
||||||
{
|
{
|
||||||
// Region config overrides global config
|
|
||||||
//
|
|
||||||
IConfig startupConfig = m_config.Configs["Startup"];
|
IConfig startupConfig = m_config.Configs["Startup"];
|
||||||
|
|
||||||
m_defaultDrawDistance = startupConfig.GetFloat("DefaultDrawDistance",m_defaultDrawDistance);
|
m_defaultDrawDistance = startupConfig.GetFloat("DefaultDrawDistance",m_defaultDrawDistance);
|
||||||
|
@ -721,46 +721,39 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
m_update_terrain = startupConfig.GetInt( "UpdateTerrainEveryNFrames", m_update_terrain);
|
m_update_terrain = startupConfig.GetInt( "UpdateTerrainEveryNFrames", m_update_terrain);
|
||||||
m_update_temp_cleaning = startupConfig.GetInt( "UpdateTempCleaningEveryNFrames", m_update_temp_cleaning);
|
m_update_temp_cleaning = startupConfig.GetInt( "UpdateTempCleaningEveryNFrames", m_update_temp_cleaning);
|
||||||
}
|
}
|
||||||
catch
|
|
||||||
{
|
|
||||||
m_log.Warn("[SCENE]: Failed to load StartupConfig");
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion Region Config
|
#endregion Region Config
|
||||||
|
|
||||||
#region Interest Management
|
#region Interest Management
|
||||||
|
|
||||||
if (m_config != null)
|
IConfig interestConfig = m_config.Configs["InterestManagement"];
|
||||||
|
if (interestConfig != null)
|
||||||
{
|
{
|
||||||
IConfig interestConfig = m_config.Configs["InterestManagement"];
|
string update_prioritization_scheme = interestConfig.GetString("UpdatePrioritizationScheme", "Time").Trim().ToLower();
|
||||||
if (interestConfig != null)
|
|
||||||
|
try
|
||||||
{
|
{
|
||||||
string update_prioritization_scheme = interestConfig.GetString("UpdatePrioritizationScheme", "Time").Trim().ToLower();
|
m_priorityScheme = (UpdatePrioritizationSchemes)Enum.Parse(typeof(UpdatePrioritizationSchemes), update_prioritization_scheme, true);
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
m_priorityScheme = (UpdatePrioritizationSchemes)Enum.Parse(typeof(UpdatePrioritizationSchemes), update_prioritization_scheme, true);
|
|
||||||
}
|
|
||||||
catch (Exception)
|
|
||||||
{
|
|
||||||
m_log.Warn("[PRIORITIZER]: UpdatePrioritizationScheme was not recognized, setting to default prioritizer Time");
|
|
||||||
m_priorityScheme = UpdatePrioritizationSchemes.Time;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_reprioritizationEnabled = interestConfig.GetBoolean("ReprioritizationEnabled", true);
|
|
||||||
m_reprioritizationInterval = interestConfig.GetDouble("ReprioritizationInterval", 5000.0);
|
|
||||||
m_rootReprioritizationDistance = interestConfig.GetDouble("RootReprioritizationDistance", 10.0);
|
|
||||||
m_childReprioritizationDistance = interestConfig.GetDouble("ChildReprioritizationDistance", 20.0);
|
|
||||||
}
|
}
|
||||||
|
catch (Exception)
|
||||||
|
{
|
||||||
|
m_log.Warn("[PRIORITIZER]: UpdatePrioritizationScheme was not recognized, setting to default prioritizer Time");
|
||||||
|
m_priorityScheme = UpdatePrioritizationSchemes.Time;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_reprioritizationEnabled = interestConfig.GetBoolean("ReprioritizationEnabled", true);
|
||||||
|
m_reprioritizationInterval = interestConfig.GetDouble("ReprioritizationInterval", 5000.0);
|
||||||
|
m_rootReprioritizationDistance = interestConfig.GetDouble("RootReprioritizationDistance", 10.0);
|
||||||
|
m_childReprioritizationDistance = interestConfig.GetDouble("ChildReprioritizationDistance", 20.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
m_log.InfoFormat("[SCENE]: Using the {0} prioritization scheme", m_priorityScheme);
|
m_log.DebugFormat("[SCENE]: Using the {0} prioritization scheme", m_priorityScheme);
|
||||||
|
|
||||||
#endregion Interest Management
|
#endregion Interest Management
|
||||||
|
|
||||||
StatsReporter = new SimStatsReporter(this);
|
StatsReporter = new SimStatsReporter(this);
|
||||||
StatsReporter.OnSendStatsResult += SendSimStatsPackets;
|
StatsReporter.OnSendStatsResult += SendSimStatsPackets;
|
||||||
StatsReporter.OnStatsIncorrect += m_sceneGraph.RecalculateStats;
|
StatsReporter.OnStatsIncorrect += m_sceneGraph.RecalculateStats;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -864,16 +857,16 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
ForEachRootScenePresence(delegate(ScenePresence agent)
|
ForEachRootScenePresence(delegate(ScenePresence agent)
|
||||||
{
|
{
|
||||||
//agent.ControllingClient.new
|
//agent.ControllingClient.new
|
||||||
//this.CommsManager.InterRegion.InformRegionOfChildAgent(otherRegion.RegionHandle, agent.ControllingClient.RequestClientInfo());
|
//this.CommsManager.InterRegion.InformRegionOfChildAgent(otherRegion.RegionHandle, agent.ControllingClient.RequestClientInfo());
|
||||||
|
|
||||||
List<ulong> old = new List<ulong>();
|
List<ulong> old = new List<ulong>();
|
||||||
old.Add(otherRegion.RegionHandle);
|
old.Add(otherRegion.RegionHandle);
|
||||||
agent.DropOldNeighbours(old);
|
agent.DropOldNeighbours(old);
|
||||||
if (m_teleportModule != null)
|
if (m_teleportModule != null && agent.PresenceType != PresenceType.Npc)
|
||||||
m_teleportModule.EnableChildAgent(agent, otherRegion);
|
m_teleportModule.EnableChildAgent(agent, otherRegion);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
catch (NullReferenceException)
|
catch (NullReferenceException)
|
||||||
{
|
{
|
||||||
|
@ -881,7 +874,6 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
// This shouldn't happen too often anymore.
|
// This shouldn't happen too often anymore.
|
||||||
m_log.Error("[SCENE]: Couldn't inform client of regionup because we got a null reference exception");
|
m_log.Error("[SCENE]: Couldn't inform client of regionup because we got a null reference exception");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1009,10 +1001,10 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
ForEachRootScenePresence(delegate(ScenePresence agent)
|
ForEachRootScenePresence(delegate(ScenePresence agent)
|
||||||
{
|
{
|
||||||
if (m_teleportModule != null)
|
if (m_teleportModule != null && agent.PresenceType != PresenceType.Npc)
|
||||||
m_teleportModule.EnableChildAgent(agent, r);
|
m_teleportModule.EnableChildAgent(agent, r);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
catch (NullReferenceException)
|
catch (NullReferenceException)
|
||||||
{
|
{
|
||||||
|
@ -1077,6 +1069,8 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
{
|
{
|
||||||
m_log.InfoFormat("[SCENE]: Closing down the single simulator: {0}", RegionInfo.RegionName);
|
m_log.InfoFormat("[SCENE]: Closing down the single simulator: {0}", RegionInfo.RegionName);
|
||||||
|
|
||||||
|
StatsReporter.Close();
|
||||||
|
|
||||||
m_restartTimer.Stop();
|
m_restartTimer.Stop();
|
||||||
m_restartTimer.Close();
|
m_restartTimer.Close();
|
||||||
|
|
||||||
|
@ -1141,7 +1135,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
HeartbeatThread
|
HeartbeatThread
|
||||||
= Watchdog.StartThread(
|
= Watchdog.StartThread(
|
||||||
Heartbeat, string.Format("Heartbeat ({0})", RegionInfo.RegionName), ThreadPriority.Normal, false);
|
Heartbeat, string.Format("Heartbeat ({0})", RegionInfo.RegionName), ThreadPriority.Normal, false, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -1179,6 +1173,13 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
m_eventManager.TriggerOnRegionStarted(this);
|
m_eventManager.TriggerOnRegionStarted(this);
|
||||||
|
|
||||||
|
// The first frame can take a very long time due to physics actors being added on startup. Therefore,
|
||||||
|
// don't turn on the watchdog alarm for this thread until the second frame, in order to prevent false
|
||||||
|
// alarms for scenes with many objects.
|
||||||
|
Update();
|
||||||
|
Watchdog.GetCurrentThreadInfo().AlarmIfTimeout = true;
|
||||||
|
|
||||||
while (!shuttingdown)
|
while (!shuttingdown)
|
||||||
Update();
|
Update();
|
||||||
|
|
||||||
|
@ -1207,7 +1208,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
++Frame;
|
++Frame;
|
||||||
|
|
||||||
// m_log.DebugFormat("[SCENE]: Processing frame {0}", Frame);
|
// m_log.DebugFormat("[SCENE]: Processing frame {0} in {1}", Frame, RegionInfo.RegionName);
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
@ -1362,26 +1363,10 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
{
|
{
|
||||||
throw;
|
throw;
|
||||||
}
|
}
|
||||||
catch (AccessViolationException e)
|
|
||||||
{
|
|
||||||
m_log.ErrorFormat(
|
|
||||||
"[REGION]: Failed on region {0} with exception {1}{2}",
|
|
||||||
RegionInfo.RegionName, e.Message, e.StackTrace);
|
|
||||||
}
|
|
||||||
//catch (NullReferenceException e)
|
|
||||||
//{
|
|
||||||
// m_log.Error("[REGION]: Failed with exception " + e.ToString() + " On Region: " + RegionInfo.RegionName);
|
|
||||||
//}
|
|
||||||
catch (InvalidOperationException e)
|
|
||||||
{
|
|
||||||
m_log.ErrorFormat(
|
|
||||||
"[REGION]: Failed on region {0} with exception {1}{2}",
|
|
||||||
RegionInfo.RegionName, e.Message, e.StackTrace);
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
m_log.ErrorFormat(
|
m_log.ErrorFormat(
|
||||||
"[REGION]: Failed on region {0} with exception {1}{2}",
|
"[SCENE]: Failed on region {0} with exception {1}{2}",
|
||||||
RegionInfo.RegionName, e.Message, e.StackTrace);
|
RegionInfo.RegionName, e.Message, e.StackTrace);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1419,7 +1404,6 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
entry.checkAtTargets();
|
entry.checkAtTargets();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Send out simstats data to all clients
|
/// Send out simstats data to all clients
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -2318,7 +2302,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="sog"></param>
|
/// <param name="sog"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public bool IncomingCreateObject(ISceneObject sog)
|
public bool IncomingCreateObject(Vector3 newPosition, ISceneObject sog)
|
||||||
{
|
{
|
||||||
//m_log.DebugFormat(" >>> IncomingCreateObject(sog) <<< {0} deleted? {1} isAttach? {2}", ((SceneObjectGroup)sog).AbsolutePosition,
|
//m_log.DebugFormat(" >>> IncomingCreateObject(sog) <<< {0} deleted? {1} isAttach? {2}", ((SceneObjectGroup)sog).AbsolutePosition,
|
||||||
// ((SceneObjectGroup)sog).IsDeleted, ((SceneObjectGroup)sog).RootPart.IsAttachment);
|
// ((SceneObjectGroup)sog).IsDeleted, ((SceneObjectGroup)sog).RootPart.IsAttachment);
|
||||||
|
@ -2334,6 +2318,9 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (newPosition != Vector3.Zero)
|
||||||
|
newObject.RootPart.GroupPosition = newPosition;
|
||||||
|
|
||||||
if (!AddSceneObject(newObject))
|
if (!AddSceneObject(newObject))
|
||||||
{
|
{
|
||||||
m_log.DebugFormat("[SCENE]: Problem adding scene object {0} in {1} ", sog.UUID, RegionInfo.RegionName);
|
m_log.DebugFormat("[SCENE]: Problem adding scene object {0} in {1} ", sog.UUID, RegionInfo.RegionName);
|
||||||
|
@ -3259,8 +3246,11 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
/// also return a reason.</returns>
|
/// also return a reason.</returns>
|
||||||
public bool NewUserConnection(AgentCircuitData agent, uint teleportFlags, out string reason, bool requirePresenceLookup)
|
public bool NewUserConnection(AgentCircuitData agent, uint teleportFlags, out string reason, bool requirePresenceLookup)
|
||||||
{
|
{
|
||||||
bool vialogin = ((teleportFlags & (uint)Constants.TeleportFlags.ViaLogin) != 0 ||
|
bool vialogin = ((teleportFlags & (uint)TPFlags.ViaLogin) != 0 ||
|
||||||
(teleportFlags & (uint)Constants.TeleportFlags.ViaHGLogin) != 0);
|
(teleportFlags & (uint)TPFlags.ViaHGLogin) != 0);
|
||||||
|
bool viahome = ((teleportFlags & (uint)TPFlags.ViaHome) != 0);
|
||||||
|
bool godlike = ((teleportFlags & (uint)TPFlags.Godlike) != 0);
|
||||||
|
|
||||||
reason = String.Empty;
|
reason = String.Empty;
|
||||||
|
|
||||||
//Teleport flags:
|
//Teleport flags:
|
||||||
|
@ -3272,9 +3262,9 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
// Don't disable this log message - it's too helpful
|
// Don't disable this log message - it's too helpful
|
||||||
m_log.DebugFormat(
|
m_log.DebugFormat(
|
||||||
"[SCENE]: Region {0} told of incoming {1} agent {2} {3} {4} (circuit code {5}, IP {6}, viewer {7}, teleportflags {8}, position {9})",
|
"[SCENE]: Region {0} told of incoming {1} agent {2} {3} {4} (circuit code {5}, IP {6}, viewer {7}, teleportflags ({8}), position {9})",
|
||||||
RegionInfo.RegionName, (agent.child ? "child" : "root"),agent.firstname, agent.lastname,
|
RegionInfo.RegionName, (agent.child ? "child" : "root"),agent.firstname, agent.lastname,
|
||||||
agent.AgentID, agent.circuitcode, agent.IPAddress, agent.Viewer, teleportFlags, agent.startpos);
|
agent.AgentID, agent.circuitcode, agent.IPAddress, agent.Viewer, ((TPFlags)teleportFlags).ToString(), agent.startpos);
|
||||||
|
|
||||||
if (LoginsDisabled)
|
if (LoginsDisabled)
|
||||||
{
|
{
|
||||||
|
@ -3427,6 +3417,29 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
agent.startpos.Z = 720;
|
agent.startpos.Z = 720;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Honor Estate teleport routing via Telehubs excluding ViaHome and GodLike TeleportFlags
|
||||||
|
if (RegionInfo.RegionSettings.TelehubObject != UUID.Zero &&
|
||||||
|
RegionInfo.EstateSettings.AllowDirectTeleport == false &&
|
||||||
|
!viahome && !godlike)
|
||||||
|
{
|
||||||
|
SceneObjectGroup telehub = GetSceneObjectGroup(RegionInfo.RegionSettings.TelehubObject);
|
||||||
|
// Can have multiple SpawnPoints
|
||||||
|
List<SpawnPoint> spawnpoints = RegionInfo.RegionSettings.SpawnPoints();
|
||||||
|
if ( spawnpoints.Count > 1)
|
||||||
|
{
|
||||||
|
// We have multiple SpawnPoints, Route the agent to a random one
|
||||||
|
agent.startpos = spawnpoints[Util.RandomClass.Next(spawnpoints.Count)].GetLocation(telehub.AbsolutePosition, telehub.GroupRotation);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// We have a single SpawnPoint and will route the agent to it
|
||||||
|
agent.startpos = spawnpoints[0].GetLocation(telehub.AbsolutePosition, telehub.GroupRotation);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
// Honor parcel landing type and position.
|
// Honor parcel landing type and position.
|
||||||
if (land != null)
|
if (land != null)
|
||||||
{
|
{
|
||||||
|
@ -4138,16 +4151,11 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
public bool PipeEventsForScript(uint localID)
|
public bool PipeEventsForScript(uint localID)
|
||||||
{
|
{
|
||||||
SceneObjectPart part = GetSceneObjectPart(localID);
|
SceneObjectPart part = GetSceneObjectPart(localID);
|
||||||
|
|
||||||
if (part != null)
|
if (part != null)
|
||||||
{
|
{
|
||||||
// Changed so that child prims of attachments return ScriptDanger for their parent, so that
|
|
||||||
// their scripts will actually run.
|
|
||||||
// -- Leaf, Tue Aug 12 14:17:05 EDT 2008
|
|
||||||
SceneObjectPart parent = part.ParentGroup.RootPart;
|
SceneObjectPart parent = part.ParentGroup.RootPart;
|
||||||
if (part.ParentGroup.IsAttachment)
|
return ScriptDanger(parent, parent.GetWorldPosition());
|
||||||
return ScriptDanger(parent, parent.GetWorldPosition());
|
|
||||||
else
|
|
||||||
return ScriptDanger(part, part.GetWorldPosition());
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -4232,10 +4240,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
/// <param name="action"></param>
|
/// <param name="action"></param>
|
||||||
public void ForEachRootScenePresence(Action<ScenePresence> action)
|
public void ForEachRootScenePresence(Action<ScenePresence> action)
|
||||||
{
|
{
|
||||||
if (m_sceneGraph != null)
|
m_sceneGraph.ForEachAvatar(action);
|
||||||
{
|
|
||||||
m_sceneGraph.ForEachAvatar(action);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -4244,10 +4249,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
/// <param name="action"></param>
|
/// <param name="action"></param>
|
||||||
public void ForEachScenePresence(Action<ScenePresence> action)
|
public void ForEachScenePresence(Action<ScenePresence> action)
|
||||||
{
|
{
|
||||||
if (m_sceneGraph != null)
|
m_sceneGraph.ForEachScenePresence(action);
|
||||||
{
|
|
||||||
m_sceneGraph.ForEachScenePresence(action);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -4677,7 +4679,10 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
Vector3? nearestPoint = GetNearestPointInParcelAlongDirectionFromPoint(avatar.AbsolutePosition, dir, nearestParcel);
|
Vector3? nearestPoint = GetNearestPointInParcelAlongDirectionFromPoint(avatar.AbsolutePosition, dir, nearestParcel);
|
||||||
if (nearestPoint != null)
|
if (nearestPoint != null)
|
||||||
{
|
{
|
||||||
Debug.WriteLine("Found a sane previous position based on velocity, sending them to: " + nearestPoint.ToString());
|
// m_log.DebugFormat(
|
||||||
|
// "[SCENE]: Found a sane previous position based on velocity for {0}, sending them to {1} in {2}",
|
||||||
|
// avatar.Name, nearestPoint, nearestParcel.LandData.Name);
|
||||||
|
|
||||||
return nearestPoint.Value;
|
return nearestPoint.Value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4687,12 +4692,16 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
nearestPoint = GetNearestPointInParcelAlongDirectionFromPoint(avatar.AbsolutePosition, dir, nearestParcel);
|
nearestPoint = GetNearestPointInParcelAlongDirectionFromPoint(avatar.AbsolutePosition, dir, nearestParcel);
|
||||||
if (nearestPoint != null)
|
if (nearestPoint != null)
|
||||||
{
|
{
|
||||||
Debug.WriteLine("They had a zero velocity, sending them to: " + nearestPoint.ToString());
|
// m_log.DebugFormat(
|
||||||
|
// "[SCENE]: {0} had a zero velocity, sending them to {1}", avatar.Name, nearestPoint);
|
||||||
|
|
||||||
return nearestPoint.Value;
|
return nearestPoint.Value;
|
||||||
}
|
}
|
||||||
|
|
||||||
//Ultimate backup if we have no idea where they are
|
//Ultimate backup if we have no idea where they are
|
||||||
Debug.WriteLine("Have no idea where they are, sending them to: " + avatar.lastKnownAllowedPosition.ToString());
|
// m_log.DebugFormat(
|
||||||
|
// "[SCENE]: No idea where {0} is, sending them to {1}", avatar.Name, avatar.lastKnownAllowedPosition);
|
||||||
|
|
||||||
return avatar.lastKnownAllowedPosition;
|
return avatar.lastKnownAllowedPosition;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5098,7 +5107,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
// presence.Name, presence.AbsolutePosition, presence.MoveToPositionTarget);
|
// presence.Name, presence.AbsolutePosition, presence.MoveToPositionTarget);
|
||||||
|
|
||||||
Vector3 agent_control_v3 = new Vector3();
|
Vector3 agent_control_v3 = new Vector3();
|
||||||
presence.HandleMoveToTargetUpdate(ref agent_control_v3);
|
presence.HandleMoveToTargetUpdate(1, ref agent_control_v3);
|
||||||
presence.AddNewMovement(agent_control_v3);
|
presence.AddNewMovement(agent_control_v3);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -472,6 +472,63 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Call this from a region module to add a command to the OpenSim console.
|
/// Call this from a region module to add a command to the OpenSim console.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
/// <param name="mod">
|
||||||
|
/// The use of IRegionModuleBase is a cheap trick to get a different method signature,
|
||||||
|
/// though all new modules should be using interfaces descended from IRegionModuleBase anyway.
|
||||||
|
/// </param>
|
||||||
|
/// <param name="category">
|
||||||
|
/// Category of the command. This is the section under which it will appear when the user asks for help
|
||||||
|
/// </param>
|
||||||
|
/// <param name="command"></param>
|
||||||
|
/// <param name="shorthelp"></param>
|
||||||
|
/// <param name="longhelp"></param>
|
||||||
|
/// <param name="callback"></param>
|
||||||
|
public void AddCommand(
|
||||||
|
string category, object mod, string command, string shorthelp, string longhelp, CommandDelegate callback)
|
||||||
|
{
|
||||||
|
AddCommand(category, mod, command, shorthelp, longhelp, string.Empty, callback);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Call this from a region module to add a command to the OpenSim console.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="mod"></param>
|
||||||
|
/// <param name="command"></param>
|
||||||
|
/// <param name="shorthelp"></param>
|
||||||
|
/// <param name="longhelp"></param>
|
||||||
|
/// <param name="descriptivehelp"></param>
|
||||||
|
/// <param name="callback"></param>
|
||||||
|
public void AddCommand(object mod, string command, string shorthelp, string longhelp, string descriptivehelp, CommandDelegate callback)
|
||||||
|
{
|
||||||
|
string moduleName = "";
|
||||||
|
|
||||||
|
if (mod != null)
|
||||||
|
{
|
||||||
|
if (mod is IRegionModule)
|
||||||
|
{
|
||||||
|
IRegionModule module = (IRegionModule)mod;
|
||||||
|
moduleName = module.Name;
|
||||||
|
}
|
||||||
|
else if (mod is IRegionModuleBase)
|
||||||
|
{
|
||||||
|
IRegionModuleBase module = (IRegionModuleBase)mod;
|
||||||
|
moduleName = module.Name;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw new Exception("AddCommand module parameter must be IRegionModule or IRegionModuleBase");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
AddCommand(moduleName, mod, command, shorthelp, longhelp, descriptivehelp, callback);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Call this from a region module to add a command to the OpenSim console.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="category">
|
||||||
|
/// Category of the command. This is the section under which it will appear when the user asks for help
|
||||||
|
/// </param>
|
||||||
/// <param name="mod"></param>
|
/// <param name="mod"></param>
|
||||||
/// <param name="command"></param>
|
/// <param name="command"></param>
|
||||||
/// <param name="shorthelp"></param>
|
/// <param name="shorthelp"></param>
|
||||||
|
@ -479,12 +536,12 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
/// <param name="descriptivehelp"></param>
|
/// <param name="descriptivehelp"></param>
|
||||||
/// <param name="callback"></param>
|
/// <param name="callback"></param>
|
||||||
public void AddCommand(
|
public void AddCommand(
|
||||||
object mod, string command, string shorthelp, string longhelp, string descriptivehelp, CommandDelegate callback)
|
string category, object mod, string command,
|
||||||
|
string shorthelp, string longhelp, string descriptivehelp, CommandDelegate callback)
|
||||||
{
|
{
|
||||||
if (MainConsole.Instance == null)
|
if (MainConsole.Instance == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
string modulename = String.Empty;
|
|
||||||
bool shared = false;
|
bool shared = false;
|
||||||
|
|
||||||
if (mod != null)
|
if (mod != null)
|
||||||
|
@ -492,20 +549,20 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
if (mod is IRegionModule)
|
if (mod is IRegionModule)
|
||||||
{
|
{
|
||||||
IRegionModule module = (IRegionModule)mod;
|
IRegionModule module = (IRegionModule)mod;
|
||||||
modulename = module.Name;
|
|
||||||
shared = module.IsSharedModule;
|
shared = module.IsSharedModule;
|
||||||
}
|
}
|
||||||
else if (mod is IRegionModuleBase)
|
else if (mod is IRegionModuleBase)
|
||||||
{
|
{
|
||||||
IRegionModuleBase module = (IRegionModuleBase)mod;
|
|
||||||
modulename = module.Name;
|
|
||||||
shared = mod is ISharedRegionModule;
|
shared = mod is ISharedRegionModule;
|
||||||
}
|
}
|
||||||
else throw new Exception("AddCommand module parameter must be IRegionModule or IRegionModuleBase");
|
else
|
||||||
|
{
|
||||||
|
throw new Exception("AddCommand module parameter must be IRegionModule or IRegionModuleBase");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
MainConsole.Instance.Commands.AddCommand(
|
MainConsole.Instance.Commands.AddCommand(
|
||||||
modulename, shared, command, shorthelp, longhelp, descriptivehelp, callback);
|
category, shared, command, shorthelp, longhelp, descriptivehelp, callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual ISceneObject DeserializeObject(string representation)
|
public virtual ISceneObject DeserializeObject(string representation)
|
||||||
|
|
|
@ -156,16 +156,20 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
// that the region position is cached or performance will degrade
|
// that the region position is cached or performance will degrade
|
||||||
Utils.LongToUInts(regionHandle, out x, out y);
|
Utils.LongToUInts(regionHandle, out x, out y);
|
||||||
GridRegion dest = m_scene.GridService.GetRegionByPosition(UUID.Zero, (int)x, (int)y);
|
GridRegion dest = m_scene.GridService.GetRegionByPosition(UUID.Zero, (int)x, (int)y);
|
||||||
if (! simulatorList.Contains(dest.ServerURI))
|
// bool v = true;
|
||||||
|
if (!simulatorList.Contains(dest.ServerURI))
|
||||||
{
|
{
|
||||||
// we havent seen this simulator before, add it to the list
|
// we havent seen this simulator before, add it to the list
|
||||||
// and send it an update
|
// and send it an update
|
||||||
simulatorList.Add(dest.ServerURI);
|
simulatorList.Add(dest.ServerURI);
|
||||||
|
// Let move this to sync. Mono definitely does not like async networking.
|
||||||
|
m_scene.SimulationService.UpdateAgent(dest, cAgentData);
|
||||||
|
|
||||||
SendChildAgentDataUpdateDelegate d = SendChildAgentDataUpdateAsync;
|
// Leaving this here as a reminder that we tried, and it sucks.
|
||||||
d.BeginInvoke(cAgentData, m_regionInfo.ScopeID, dest,
|
//SendChildAgentDataUpdateDelegate d = SendChildAgentDataUpdateAsync;
|
||||||
SendChildAgentDataUpdateCompleted,
|
//d.BeginInvoke(cAgentData, m_regionInfo.ScopeID, dest,
|
||||||
d);
|
// SendChildAgentDataUpdateCompleted,
|
||||||
|
// d);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -215,27 +215,9 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
if (sp.IsChildAgent)
|
if (sp.IsChildAgent)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (sp.ParentID != 0)
|
coarseLocations.Add(sp.AbsolutePosition);
|
||||||
{
|
|
||||||
// sitting avatar
|
avatarUUIDs.Add(sp.UUID);
|
||||||
SceneObjectPart sop = m_parentScene.GetSceneObjectPart(sp.ParentID);
|
|
||||||
if (sop != null)
|
|
||||||
{
|
|
||||||
coarseLocations.Add(sop.AbsolutePosition + sp.OffsetPosition);
|
|
||||||
avatarUUIDs.Add(sp.UUID);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// we can't find the parent.. ! arg!
|
|
||||||
coarseLocations.Add(sp.AbsolutePosition);
|
|
||||||
avatarUUIDs.Add(sp.UUID);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
coarseLocations.Add(sp.AbsolutePosition);
|
|
||||||
avatarUUIDs.Add(sp.UUID);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1592,7 +1574,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
if (group != null)
|
if (group != null)
|
||||||
{
|
{
|
||||||
if (m_parentScene.Permissions.CanEditObject(group.UUID,agentID))
|
if (m_parentScene.Permissions.CanEditObject(group.UUID, agentID))
|
||||||
{
|
{
|
||||||
group.UpdateExtraParam(primLocalID, type, inUse, data);
|
group.UpdateExtraParam(primLocalID, type, inUse, data);
|
||||||
}
|
}
|
||||||
|
@ -1609,7 +1591,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
SceneObjectGroup group = GetGroupByPrim(primLocalID);
|
SceneObjectGroup group = GetGroupByPrim(primLocalID);
|
||||||
if (group != null)
|
if (group != null)
|
||||||
{
|
{
|
||||||
if (m_parentScene.Permissions.CanEditObject(group.GetPartsFullID(primLocalID), agentID))
|
if (m_parentScene.Permissions.CanEditObject(group.UUID, agentID))
|
||||||
{
|
{
|
||||||
ObjectShapePacket.ObjectDataBlock shapeData = new ObjectShapePacket.ObjectDataBlock();
|
ObjectShapePacket.ObjectDataBlock shapeData = new ObjectShapePacket.ObjectDataBlock();
|
||||||
shapeData.ObjectLocalID = shapeBlock.ObjectLocalID;
|
shapeData.ObjectLocalID = shapeBlock.ObjectLocalID;
|
||||||
|
|
|
@ -1330,7 +1330,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
m_log.DebugFormat(
|
m_log.DebugFormat(
|
||||||
"[SCENE OBJECT GROUP]: Returning object {0} due to parcel autoreturn",
|
"[SCENE OBJECT GROUP]: Returning object {0} due to parcel autoreturn",
|
||||||
RootPart.UUID);
|
RootPart.UUID);
|
||||||
m_scene.AddReturn(OwnerID, Name, AbsolutePosition, "parcel autoreturn");
|
m_scene.AddReturn(OwnerID == GroupID ? LastOwnerID : OwnerID, Name, AbsolutePosition, "parcel autoreturn");
|
||||||
m_scene.DeRezObjects(null, new List<uint>() { RootPart.LocalId }, UUID.Zero,
|
m_scene.DeRezObjects(null, new List<uint>() { RootPart.LocalId }, UUID.Zero,
|
||||||
DeRezAction.Return, UUID.Zero);
|
DeRezAction.Return, UUID.Zero);
|
||||||
|
|
||||||
|
|
|
@ -1546,19 +1546,16 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
if (userExposed)
|
if (userExposed)
|
||||||
dupe.UUID = UUID.Random();
|
dupe.UUID = UUID.Random();
|
||||||
|
|
||||||
//memberwiseclone means it also clones the physics actor reference
|
dupe.PhysActor = null;
|
||||||
// This will make physical prim 'bounce' if not set to null.
|
|
||||||
if (!userExposed)
|
|
||||||
dupe.PhysActor = null;
|
|
||||||
|
|
||||||
dupe.OwnerID = AgentID;
|
dupe.OwnerID = AgentID;
|
||||||
dupe.GroupID = GroupID;
|
dupe.GroupID = GroupID;
|
||||||
dupe.GroupPosition = GroupPosition;
|
dupe.GroupPosition = GroupPosition;
|
||||||
dupe.OffsetPosition = OffsetPosition;
|
dupe.OffsetPosition = OffsetPosition;
|
||||||
dupe.RotationOffset = RotationOffset;
|
dupe.RotationOffset = RotationOffset;
|
||||||
dupe.Velocity = new Vector3(0, 0, 0);
|
dupe.Velocity = Velocity;
|
||||||
dupe.Acceleration = new Vector3(0, 0, 0);
|
dupe.Acceleration = Acceleration;
|
||||||
dupe.AngularVelocity = new Vector3(0, 0, 0);
|
dupe.AngularVelocity = AngularVelocity;
|
||||||
dupe.Flags = Flags;
|
dupe.Flags = Flags;
|
||||||
|
|
||||||
dupe.OwnershipCost = OwnershipCost;
|
dupe.OwnershipCost = OwnershipCost;
|
||||||
|
|
|
@ -343,13 +343,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
/// </summary>
|
/// </summary>
|
||||||
protected Vector3 m_lastCameraPosition;
|
protected Vector3 m_lastCameraPosition;
|
||||||
|
|
||||||
protected Vector3 m_CameraPosition;
|
public Vector3 CameraPosition { get; set; }
|
||||||
|
|
||||||
public Vector3 CameraPosition
|
|
||||||
{
|
|
||||||
get { return m_CameraPosition; }
|
|
||||||
private set { m_CameraPosition = value; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public Quaternion CameraRotation
|
public Quaternion CameraRotation
|
||||||
{
|
{
|
||||||
|
@ -359,28 +353,9 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
// Use these three vectors to figure out what the agent is looking at
|
// Use these three vectors to figure out what the agent is looking at
|
||||||
// Convert it to a Matrix and/or Quaternion
|
// Convert it to a Matrix and/or Quaternion
|
||||||
//
|
//
|
||||||
protected Vector3 m_CameraAtAxis;
|
public Vector3 CameraAtAxis { get; set; }
|
||||||
protected Vector3 m_CameraLeftAxis;
|
public Vector3 CameraLeftAxis { get; set; }
|
||||||
protected Vector3 m_CameraUpAxis;
|
public Vector3 CameraUpAxis { get; set; }
|
||||||
|
|
||||||
public Vector3 CameraAtAxis
|
|
||||||
{
|
|
||||||
get { return m_CameraAtAxis; }
|
|
||||||
private set { m_CameraAtAxis = value; }
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public Vector3 CameraLeftAxis
|
|
||||||
{
|
|
||||||
get { return m_CameraLeftAxis; }
|
|
||||||
private set { m_CameraLeftAxis = value; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public Vector3 CameraUpAxis
|
|
||||||
{
|
|
||||||
get { return m_CameraUpAxis; }
|
|
||||||
private set { m_CameraUpAxis = value; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public Vector3 Lookat
|
public Vector3 Lookat
|
||||||
{
|
{
|
||||||
|
@ -396,33 +371,15 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
public readonly string Firstname;
|
public string Firstname { get; private set; }
|
||||||
public readonly string Lastname;
|
public string Lastname { get; private set; }
|
||||||
|
|
||||||
private string m_grouptitle;
|
public string Grouptitle { get; set; }
|
||||||
|
|
||||||
public string Grouptitle
|
|
||||||
{
|
|
||||||
get { return m_grouptitle; }
|
|
||||||
set { m_grouptitle = value; }
|
|
||||||
}
|
|
||||||
|
|
||||||
// Agent's Draw distance.
|
// Agent's Draw distance.
|
||||||
protected float m_DrawDistance;
|
public float DrawDistance { get; set; }
|
||||||
|
|
||||||
public float DrawDistance
|
public bool AllowMovement { get; set; }
|
||||||
{
|
|
||||||
get { return m_DrawDistance; }
|
|
||||||
private set { m_DrawDistance = value; }
|
|
||||||
}
|
|
||||||
|
|
||||||
protected bool m_allowMovement = true;
|
|
||||||
|
|
||||||
public bool AllowMovement
|
|
||||||
{
|
|
||||||
get { return m_allowMovement; }
|
|
||||||
set { m_allowMovement = value; }
|
|
||||||
}
|
|
||||||
|
|
||||||
private bool m_setAlwaysRun;
|
private bool m_setAlwaysRun;
|
||||||
|
|
||||||
|
@ -449,13 +406,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private byte m_state;
|
public byte State { get; set; }
|
||||||
|
|
||||||
public byte State
|
|
||||||
{
|
|
||||||
get { return m_state; }
|
|
||||||
set { m_state = value; }
|
|
||||||
}
|
|
||||||
|
|
||||||
private AgentManager.ControlFlags m_AgentControlFlags;
|
private AgentManager.ControlFlags m_AgentControlFlags;
|
||||||
|
|
||||||
|
@ -465,29 +416,14 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
set { m_AgentControlFlags = (AgentManager.ControlFlags)value; }
|
set { m_AgentControlFlags = (AgentManager.ControlFlags)value; }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
public IClientAPI ControllingClient { get; set; }
|
||||||
/// This works out to be the ClientView object associated with this avatar, or it's client connection manager
|
|
||||||
/// </summary>
|
|
||||||
private IClientAPI m_controllingClient;
|
|
||||||
|
|
||||||
public IClientAPI ControllingClient
|
|
||||||
{
|
|
||||||
get { return m_controllingClient; }
|
|
||||||
private set { m_controllingClient = value; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public IClientCore ClientView
|
public IClientCore ClientView
|
||||||
{
|
{
|
||||||
get { return (IClientCore) m_controllingClient; }
|
get { return (IClientCore)ControllingClient; }
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Vector3 m_parentPosition;
|
public Vector3 ParentPosition { get; set; }
|
||||||
|
|
||||||
public Vector3 ParentPosition
|
|
||||||
{
|
|
||||||
get { return m_parentPosition; }
|
|
||||||
set { m_parentPosition = value; }
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Position of this avatar relative to the region the avatar is in
|
/// Position of this avatar relative to the region the avatar is in
|
||||||
|
@ -496,7 +432,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
if (PhysicsActor != null && m_parentID == 0)
|
if (PhysicsActor != null)
|
||||||
{
|
{
|
||||||
m_pos = PhysicsActor.Position;
|
m_pos = PhysicsActor.Position;
|
||||||
|
|
||||||
|
@ -519,19 +455,12 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
// in the sim unless the avatar is on a sit target. While
|
// in the sim unless the avatar is on a sit target. While
|
||||||
// on a sit target, m_pos will contain the desired offset
|
// on a sit target, m_pos will contain the desired offset
|
||||||
// without the parent rotation applied.
|
// without the parent rotation applied.
|
||||||
if (ParentID != 0)
|
SceneObjectPart sitPart = ParentPart;
|
||||||
{
|
|
||||||
SceneObjectPart part = m_scene.GetSceneObjectPart(ParentID);
|
if (sitPart != null)
|
||||||
if (part != null)
|
return sitPart.AbsolutePosition + (m_pos * sitPart.GetWorldRotation());
|
||||||
{
|
|
||||||
return part.AbsolutePosition + (m_pos * part.GetWorldRotation());
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return ParentPosition + m_pos;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return m_pos;
|
return m_pos;
|
||||||
}
|
}
|
||||||
set
|
set
|
||||||
|
@ -548,7 +477,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Don't update while sitting
|
// Don't update while sitting. The PhysicsActor above is null whilst sitting.
|
||||||
if (ParentID == 0)
|
if (ParentID == 0)
|
||||||
{
|
{
|
||||||
m_pos = value;
|
m_pos = value;
|
||||||
|
@ -575,6 +504,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
// There is no offset position when not seated
|
// There is no offset position when not seated
|
||||||
if (ParentID == 0)
|
if (ParentID == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
m_pos = value;
|
m_pos = value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -633,12 +563,18 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
public bool IsChildAgent { get; set; }
|
public bool IsChildAgent { get; set; }
|
||||||
|
|
||||||
public uint ParentID
|
/// <summary>
|
||||||
{
|
/// If the avatar is sitting, the local ID of the prim that it's sitting on. If not sitting then zero.
|
||||||
get { return m_parentID; }
|
/// </summary>
|
||||||
set { m_parentID = value; }
|
public uint ParentID { get; set; }
|
||||||
}
|
|
||||||
private uint m_parentID;
|
/// <summary>
|
||||||
|
/// If the avatar is sitting, the prim that it's sitting on. If not sitting then null.
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// If you use this property then you must take a reference since another thread could set it to null.
|
||||||
|
/// </remarks>
|
||||||
|
public SceneObjectPart ParentPart { get; set; }
|
||||||
|
|
||||||
public float Health
|
public float Health
|
||||||
{
|
{
|
||||||
|
@ -747,7 +683,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
IClientAPI client, Scene world, AvatarAppearance appearance, PresenceType type)
|
IClientAPI client, Scene world, AvatarAppearance appearance, PresenceType type)
|
||||||
{
|
{
|
||||||
AttachmentsSyncLock = new Object();
|
AttachmentsSyncLock = new Object();
|
||||||
|
AllowMovement = true;
|
||||||
IsChildAgent = true;
|
IsChildAgent = true;
|
||||||
m_sendCourseLocationsMethod = SendCoarseLocationsDefault;
|
m_sendCourseLocationsMethod = SendCoarseLocationsDefault;
|
||||||
Animator = new ScenePresenceAnimator(this);
|
Animator = new ScenePresenceAnimator(this);
|
||||||
|
@ -826,17 +762,17 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
private Vector3[] GetWalkDirectionVectors()
|
private Vector3[] GetWalkDirectionVectors()
|
||||||
{
|
{
|
||||||
Vector3[] vector = new Vector3[11];
|
Vector3[] vector = new Vector3[11];
|
||||||
vector[0] = new Vector3(m_CameraUpAxis.Z, 0f, -m_CameraAtAxis.Z); //FORWARD
|
vector[0] = new Vector3(CameraUpAxis.Z, 0f, -CameraAtAxis.Z); //FORWARD
|
||||||
vector[1] = new Vector3(-m_CameraUpAxis.Z, 0f, m_CameraAtAxis.Z); //BACK
|
vector[1] = new Vector3(-CameraUpAxis.Z, 0f, CameraAtAxis.Z); //BACK
|
||||||
vector[2] = Vector3.UnitY; //LEFT
|
vector[2] = Vector3.UnitY; //LEFT
|
||||||
vector[3] = -Vector3.UnitY; //RIGHT
|
vector[3] = -Vector3.UnitY; //RIGHT
|
||||||
vector[4] = new Vector3(m_CameraAtAxis.Z, 0f, m_CameraUpAxis.Z); //UP
|
vector[4] = new Vector3(CameraAtAxis.Z, 0f, CameraUpAxis.Z); //UP
|
||||||
vector[5] = new Vector3(-m_CameraAtAxis.Z, 0f, -m_CameraUpAxis.Z); //DOWN
|
vector[5] = new Vector3(-CameraAtAxis.Z, 0f, -CameraUpAxis.Z); //DOWN
|
||||||
vector[6] = new Vector3(m_CameraUpAxis.Z, 0f, -m_CameraAtAxis.Z); //FORWARD_NUDGE
|
vector[6] = new Vector3(CameraUpAxis.Z, 0f, -CameraAtAxis.Z); //FORWARD_NUDGE
|
||||||
vector[7] = new Vector3(-m_CameraUpAxis.Z, 0f, m_CameraAtAxis.Z); //BACK_NUDGE
|
vector[7] = new Vector3(-CameraUpAxis.Z, 0f, CameraAtAxis.Z); //BACK_NUDGE
|
||||||
vector[8] = Vector3.UnitY; //LEFT_NUDGE
|
vector[8] = Vector3.UnitY; //LEFT_NUDGE
|
||||||
vector[9] = -Vector3.UnitY; //RIGHT_NUDGE
|
vector[9] = -Vector3.UnitY; //RIGHT_NUDGE
|
||||||
vector[10] = new Vector3(-m_CameraAtAxis.Z, 0f, -m_CameraUpAxis.Z); //DOWN_NUDGE
|
vector[10] = new Vector3(-CameraAtAxis.Z, 0f, -CameraUpAxis.Z); //DOWN_NUDGE
|
||||||
return vector;
|
return vector;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1048,7 +984,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
/// Do not call this directly. Call Scene.RequestTeleportLocation() instead.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="pos"></param>
|
/// <param name="pos"></param>
|
||||||
public void Teleport(Vector3 pos)
|
public void Teleport(Vector3 pos)
|
||||||
|
@ -1219,7 +1155,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
{
|
{
|
||||||
IEntityTransferModule m_agentTransfer = m_scene.RequestModuleInterface<IEntityTransferModule>();
|
IEntityTransferModule m_agentTransfer = m_scene.RequestModuleInterface<IEntityTransferModule>();
|
||||||
if (m_agentTransfer != null)
|
if (m_agentTransfer != null)
|
||||||
m_agentTransfer.EnableChildAgents(this);
|
Util.FireAndForget(delegate { m_agentTransfer.EnableChildAgents(this); });
|
||||||
|
|
||||||
IFriendsModule friendsModule = m_scene.RequestModuleInterface<IFriendsModule>();
|
IFriendsModule friendsModule = m_scene.RequestModuleInterface<IFriendsModule>();
|
||||||
if (friendsModule != null)
|
if (friendsModule != null)
|
||||||
|
@ -1333,7 +1269,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
// Convert it to a Matrix and/or Quaternion
|
// Convert it to a Matrix and/or Quaternion
|
||||||
CameraAtAxis = agentData.CameraAtAxis;
|
CameraAtAxis = agentData.CameraAtAxis;
|
||||||
CameraLeftAxis = agentData.CameraLeftAxis;
|
CameraLeftAxis = agentData.CameraLeftAxis;
|
||||||
m_CameraUpAxis = agentData.CameraUpAxis;
|
CameraUpAxis = agentData.CameraUpAxis;
|
||||||
|
|
||||||
// The Agent's Draw distance setting
|
// The Agent's Draw distance setting
|
||||||
// When we get to the point of re-computing neighbors everytime this
|
// When we get to the point of re-computing neighbors everytime this
|
||||||
|
@ -1345,7 +1281,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
// Check if Client has camera in 'follow cam' or 'build' mode.
|
// Check if Client has camera in 'follow cam' or 'build' mode.
|
||||||
Vector3 camdif = (Vector3.One * Rotation - Vector3.One * CameraRotation);
|
Vector3 camdif = (Vector3.One * Rotation - Vector3.One * CameraRotation);
|
||||||
|
|
||||||
m_followCamAuto = ((m_CameraUpAxis.Z > 0.959f && m_CameraUpAxis.Z < 0.98f)
|
m_followCamAuto = ((CameraUpAxis.Z > 0.959f && CameraUpAxis.Z < 0.98f)
|
||||||
&& (Math.Abs(camdif.X) < 0.4f && Math.Abs(camdif.Y) < 0.4f)) ? true : false;
|
&& (Math.Abs(camdif.X) < 0.4f && Math.Abs(camdif.Y) < 0.4f)) ? true : false;
|
||||||
|
|
||||||
m_mouseLook = (flags & AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK) != 0;
|
m_mouseLook = (flags & AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK) != 0;
|
||||||
|
@ -1522,7 +1458,10 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
}
|
}
|
||||||
else if (bAllowUpdateMoveToPosition)
|
else if (bAllowUpdateMoveToPosition)
|
||||||
{
|
{
|
||||||
if (HandleMoveToTargetUpdate(ref agent_control_v3))
|
// The UseClientAgentPosition is set if parcel ban is forcing the avatar to move to a
|
||||||
|
// certain position. It's only check for tolerance on returning to that position is 0.2
|
||||||
|
// rather than 1, at which point it removes its force target.
|
||||||
|
if (HandleMoveToTargetUpdate(agentData.UseClientAgentPosition ? 0.2 : 1, ref agent_control_v3))
|
||||||
update_movementflag = true;
|
update_movementflag = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1584,7 +1523,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
/// <param value="agent_control_v3">Cumulative agent movement that this method will update.</param>
|
/// <param value="agent_control_v3">Cumulative agent movement that this method will update.</param>
|
||||||
/// <returns>True if movement has been updated in some way. False otherwise.</returns>
|
/// <returns>True if movement has been updated in some way. False otherwise.</returns>
|
||||||
public bool HandleMoveToTargetUpdate(ref Vector3 agent_control_v3)
|
public bool HandleMoveToTargetUpdate(double tolerance, ref Vector3 agent_control_v3)
|
||||||
{
|
{
|
||||||
// m_log.DebugFormat("[SCENE PRESENCE]: Called HandleMoveToTargetUpdate() for {0}", Name);
|
// m_log.DebugFormat("[SCENE PRESENCE]: Called HandleMoveToTargetUpdate() for {0}", Name);
|
||||||
|
|
||||||
|
@ -1601,7 +1540,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
// Name, AbsolutePosition, MoveToPositionTarget, distanceToTarget);
|
// Name, AbsolutePosition, MoveToPositionTarget, distanceToTarget);
|
||||||
|
|
||||||
// Check the error term of the current position in relation to the target position
|
// Check the error term of the current position in relation to the target position
|
||||||
if (distanceToTarget <= 1)
|
if (distanceToTarget <= tolerance)
|
||||||
{
|
{
|
||||||
// We are close enough to the target
|
// We are close enough to the target
|
||||||
AbsolutePosition = MoveToPositionTarget;
|
AbsolutePosition = MoveToPositionTarget;
|
||||||
|
@ -1777,7 +1716,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
// m_log.DebugFormat("[SCENE PRESENCE]: Body rot for {0} set to {1}", Name, Rotation);
|
// m_log.DebugFormat("[SCENE PRESENCE]: Body rot for {0} set to {1}", Name, Rotation);
|
||||||
|
|
||||||
Vector3 agent_control_v3 = new Vector3();
|
Vector3 agent_control_v3 = new Vector3();
|
||||||
HandleMoveToTargetUpdate(ref agent_control_v3);
|
HandleMoveToTargetUpdate(1, ref agent_control_v3);
|
||||||
AddNewMovement(agent_control_v3);
|
AddNewMovement(agent_control_v3);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1812,36 +1751,34 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
if (ParentID != 0)
|
if (ParentID != 0)
|
||||||
{
|
{
|
||||||
SceneObjectPart part = m_scene.GetSceneObjectPart(ParentID);
|
SceneObjectPart part = ParentPart;
|
||||||
if (part != null)
|
TaskInventoryDictionary taskIDict = part.TaskInventory;
|
||||||
|
if (taskIDict != null)
|
||||||
{
|
{
|
||||||
TaskInventoryDictionary taskIDict = part.TaskInventory;
|
lock (taskIDict)
|
||||||
if (taskIDict != null)
|
|
||||||
{
|
{
|
||||||
lock (taskIDict)
|
foreach (UUID taskID in taskIDict.Keys)
|
||||||
{
|
{
|
||||||
foreach (UUID taskID in taskIDict.Keys)
|
UnRegisterControlEventsToScript(LocalId, taskID);
|
||||||
{
|
taskIDict[taskID].PermsMask &= ~(
|
||||||
UnRegisterControlEventsToScript(LocalId, taskID);
|
2048 | //PERMISSION_CONTROL_CAMERA
|
||||||
taskIDict[taskID].PermsMask &= ~(
|
4); // PERMISSION_TAKE_CONTROLS
|
||||||
2048 | //PERMISSION_CONTROL_CAMERA
|
|
||||||
4); // PERMISSION_TAKE_CONTROLS
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Reset sit target.
|
|
||||||
if (part.SitTargetAvatar == UUID)
|
|
||||||
part.SitTargetAvatar = UUID.Zero;
|
|
||||||
|
|
||||||
ParentPosition = part.GetWorldPosition();
|
|
||||||
ControllingClient.SendClearFollowCamProperties(part.ParentUUID);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Reset sit target.
|
||||||
|
if (part.SitTargetAvatar == UUID)
|
||||||
|
part.SitTargetAvatar = UUID.Zero;
|
||||||
|
|
||||||
|
ParentPosition = part.GetWorldPosition();
|
||||||
|
ControllingClient.SendClearFollowCamProperties(part.ParentUUID);
|
||||||
|
|
||||||
m_pos += ParentPosition + new Vector3(0.0f, 0.0f, 2.0f * m_sitAvatarHeight);
|
m_pos += ParentPosition + new Vector3(0.0f, 0.0f, 2.0f * m_sitAvatarHeight);
|
||||||
ParentPosition = Vector3.Zero;
|
ParentPosition = Vector3.Zero;
|
||||||
|
|
||||||
ParentID = 0;
|
ParentID = 0;
|
||||||
|
ParentPart = null;
|
||||||
SendAvatarDataToAllAgents();
|
SendAvatarDataToAllAgents();
|
||||||
m_requestedSitTargetID = 0;
|
m_requestedSitTargetID = 0;
|
||||||
|
|
||||||
|
@ -2267,19 +2204,16 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
// "[SCENE PRESENCE]: Sitting {0} at position {1} ({2} + {3}) on part {4} {5} without sit target",
|
// "[SCENE PRESENCE]: Sitting {0} at position {1} ({2} + {3}) on part {4} {5} without sit target",
|
||||||
// Name, part.AbsolutePosition, m_pos, ParentPosition, part.Name, part.LocalId);
|
// Name, part.AbsolutePosition, m_pos, ParentPosition, part.Name, part.LocalId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ParentPart = m_scene.GetSceneObjectPart(m_requestedSitTargetID);
|
||||||
|
ParentID = m_requestedSitTargetID;
|
||||||
|
|
||||||
|
Velocity = Vector3.Zero;
|
||||||
|
RemoveFromPhysicalScene();
|
||||||
|
|
||||||
|
Animator.TrySetMovementAnimation(sitAnimation);
|
||||||
|
SendAvatarDataToAllAgents();
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
ParentID = m_requestedSitTargetID;
|
|
||||||
|
|
||||||
Velocity = Vector3.Zero;
|
|
||||||
RemoveFromPhysicalScene();
|
|
||||||
|
|
||||||
Animator.TrySetMovementAnimation(sitAnimation);
|
|
||||||
SendAvatarDataToAllAgents();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void HandleAgentSitOnGround()
|
public void HandleAgentSitOnGround()
|
||||||
|
@ -2738,7 +2672,8 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
AgentPosition agentpos = new AgentPosition();
|
AgentPosition agentpos = new AgentPosition();
|
||||||
agentpos.CopyFrom(cadu);
|
agentpos.CopyFrom(cadu);
|
||||||
|
|
||||||
m_scene.SendOutChildAgentUpdates(agentpos, this);
|
// Let's get this out of the update loop
|
||||||
|
Util.FireAndForget(delegate { m_scene.SendOutChildAgentUpdates(agentpos, this); });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3074,7 +3009,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
cAgent.Center = CameraPosition;
|
cAgent.Center = CameraPosition;
|
||||||
cAgent.AtAxis = CameraAtAxis;
|
cAgent.AtAxis = CameraAtAxis;
|
||||||
cAgent.LeftAxis = CameraLeftAxis;
|
cAgent.LeftAxis = CameraLeftAxis;
|
||||||
cAgent.UpAxis = m_CameraUpAxis;
|
cAgent.UpAxis = CameraUpAxis;
|
||||||
|
|
||||||
cAgent.Far = DrawDistance;
|
cAgent.Far = DrawDistance;
|
||||||
|
|
||||||
|
@ -3160,7 +3095,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
CameraPosition = cAgent.Center;
|
CameraPosition = cAgent.Center;
|
||||||
CameraAtAxis = cAgent.AtAxis;
|
CameraAtAxis = cAgent.AtAxis;
|
||||||
CameraLeftAxis = cAgent.LeftAxis;
|
CameraLeftAxis = cAgent.LeftAxis;
|
||||||
m_CameraUpAxis = cAgent.UpAxis;
|
CameraUpAxis = cAgent.UpAxis;
|
||||||
|
|
||||||
// When we get to the point of re-computing neighbors everytime this
|
// When we get to the point of re-computing neighbors everytime this
|
||||||
// changes, then start using the agent's drawdistance rather than the
|
// changes, then start using the agent's drawdistance rather than the
|
||||||
|
@ -3222,7 +3157,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
((SceneObjectGroup)so).LocalId = 0;
|
((SceneObjectGroup)so).LocalId = 0;
|
||||||
((SceneObjectGroup)so).RootPart.ClearUpdateSchedule();
|
((SceneObjectGroup)so).RootPart.ClearUpdateSchedule();
|
||||||
so.SetState(cAgent.AttachmentObjectStates[i++], m_scene);
|
so.SetState(cAgent.AttachmentObjectStates[i++], m_scene);
|
||||||
m_scene.IncomingCreateObject(so);
|
m_scene.IncomingCreateObject(Vector3.Zero, so);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,6 +29,7 @@ using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Xml;
|
using System.Xml;
|
||||||
using log4net;
|
using log4net;
|
||||||
|
@ -570,13 +571,15 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
|
||||||
|
|
||||||
private static void ProcessShape(SceneObjectPart obj, XmlTextReader reader)
|
private static void ProcessShape(SceneObjectPart obj, XmlTextReader reader)
|
||||||
{
|
{
|
||||||
bool errors = false;
|
List<string> errorNodeNames;
|
||||||
obj.Shape = ReadShape(reader, "Shape", out errors);
|
obj.Shape = ReadShape(reader, "Shape", out errorNodeNames);
|
||||||
|
|
||||||
if (errors)
|
if (errorNodeNames != null)
|
||||||
|
{
|
||||||
m_log.DebugFormat(
|
m_log.DebugFormat(
|
||||||
"[SceneObjectSerializer]: Parsing PrimitiveBaseShape for object part {0} {1} encountered errors. Please see earlier log entries.",
|
"[SceneObjectSerializer]: Parsing PrimitiveBaseShape for object part {0} {1} encountered errors in properties {2}.",
|
||||||
obj.Name, obj.UUID);
|
obj.Name, obj.UUID, string.Join(", ", errorNodeNames.ToArray()));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void ProcessScale(SceneObjectPart obj, XmlTextReader reader)
|
private static void ProcessScale(SceneObjectPart obj, XmlTextReader reader)
|
||||||
|
@ -1519,37 +1522,44 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="reader"></param>
|
/// <param name="reader"></param>
|
||||||
/// <param name="name">The name of the xml element containing the shape</param>
|
/// <param name="name">The name of the xml element containing the shape</param>
|
||||||
/// <param name="errors">true if any errors were encountered during parsing, false otherwise</param>
|
/// <param name="errors">a list containing the failing node names. If no failures then null.</param>
|
||||||
/// <returns>The shape parsed</returns>
|
/// <returns>The shape parsed</returns>
|
||||||
public static PrimitiveBaseShape ReadShape(XmlTextReader reader, string name, out bool errors)
|
public static PrimitiveBaseShape ReadShape(XmlTextReader reader, string name, out List<string> errorNodeNames)
|
||||||
{
|
{
|
||||||
errors = false;
|
List<string> internalErrorNodeNames = null;
|
||||||
|
|
||||||
PrimitiveBaseShape shape = new PrimitiveBaseShape();
|
PrimitiveBaseShape shape = new PrimitiveBaseShape();
|
||||||
|
|
||||||
if (reader.IsEmptyElement)
|
if (reader.IsEmptyElement)
|
||||||
{
|
{
|
||||||
reader.Read();
|
reader.Read();
|
||||||
|
errorNodeNames = null;
|
||||||
return shape;
|
return shape;
|
||||||
}
|
}
|
||||||
|
|
||||||
reader.ReadStartElement(name, String.Empty); // Shape
|
reader.ReadStartElement(name, String.Empty); // Shape
|
||||||
|
|
||||||
errors = ExternalRepresentationUtils.ExecuteReadProcessors(
|
ExternalRepresentationUtils.ExecuteReadProcessors(
|
||||||
shape,
|
shape,
|
||||||
m_ShapeXmlProcessors,
|
m_ShapeXmlProcessors,
|
||||||
reader,
|
reader,
|
||||||
(o, nodeName, e)
|
(o, nodeName, e)
|
||||||
=>
|
=>
|
||||||
{
|
{
|
||||||
m_log.DebugFormat(
|
// m_log.DebugFormat(
|
||||||
"[SceneObjectSerializer]: Exception while parsing Shape property {0}: {1}{2}",
|
// "[SceneObjectSerializer]: Exception while parsing Shape property {0}: {1}{2}",
|
||||||
nodeName, e.Message, e.StackTrace);
|
// nodeName, e.Message, e.StackTrace);
|
||||||
|
if (internalErrorNodeNames == null)
|
||||||
|
internalErrorNodeNames = new List<string>();
|
||||||
|
|
||||||
|
internalErrorNodeNames.Add(nodeName);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
reader.ReadEndElement(); // Shape
|
reader.ReadEndElement(); // Shape
|
||||||
|
|
||||||
|
errorNodeNames = internalErrorNodeNames;
|
||||||
|
|
||||||
return shape;
|
return shape;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -178,13 +178,19 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
m_objectCapacity = scene.RegionInfo.ObjectCapacity;
|
m_objectCapacity = scene.RegionInfo.ObjectCapacity;
|
||||||
m_report.AutoReset = true;
|
m_report.AutoReset = true;
|
||||||
m_report.Interval = statsUpdatesEveryMS;
|
m_report.Interval = statsUpdatesEveryMS;
|
||||||
m_report.Elapsed += new ElapsedEventHandler(statsHeartBeat);
|
m_report.Elapsed += statsHeartBeat;
|
||||||
m_report.Enabled = true;
|
m_report.Enabled = true;
|
||||||
|
|
||||||
if (StatsManager.SimExtraStats != null)
|
if (StatsManager.SimExtraStats != null)
|
||||||
OnSendStatsResult += StatsManager.SimExtraStats.ReceiveClassicSimStatsPacket;
|
OnSendStatsResult += StatsManager.SimExtraStats.ReceiveClassicSimStatsPacket;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void Close()
|
||||||
|
{
|
||||||
|
m_report.Elapsed -= statsHeartBeat;
|
||||||
|
m_report.Close();
|
||||||
|
}
|
||||||
|
|
||||||
public void SetUpdateMS(int ms)
|
public void SetUpdateMS(int ms)
|
||||||
{
|
{
|
||||||
statsUpdatesEveryMS = ms;
|
statsUpdatesEveryMS = ms;
|
||||||
|
|
|
@ -65,8 +65,7 @@ namespace OpenSim.Region.Framework.Tests
|
||||||
|
|
||||||
// Create an object embedded inside the first
|
// Create an object embedded inside the first
|
||||||
UUID taskSceneObjectItemId = UUID.Parse("00000000-0000-0000-0000-100000000000");
|
UUID taskSceneObjectItemId = UUID.Parse("00000000-0000-0000-0000-100000000000");
|
||||||
TaskInventoryItem taskSceneObjectItem
|
TaskInventoryHelpers.AddSceneObject(scene, sop1, "tso", taskSceneObjectItemId, user1.PrincipalID);
|
||||||
= TaskInventoryHelpers.AddSceneObject(scene, sop1, "tso", taskSceneObjectItemId, user1.PrincipalID);
|
|
||||||
|
|
||||||
TaskInventoryItem addedItem = sop1.Inventory.GetInventoryItem(taskSceneObjectItemId);
|
TaskInventoryItem addedItem = sop1.Inventory.GetInventoryItem(taskSceneObjectItemId);
|
||||||
Assert.That(addedItem.ItemID, Is.EqualTo(taskSceneObjectItemId));
|
Assert.That(addedItem.ItemID, Is.EqualTo(taskSceneObjectItemId));
|
||||||
|
|
|
@ -70,7 +70,7 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server
|
||||||
m_client = client;
|
m_client = client;
|
||||||
m_scene = scene;
|
m_scene = scene;
|
||||||
|
|
||||||
Watchdog.StartThread(InternalLoop, "IRCClientView", ThreadPriority.Normal, false);
|
Watchdog.StartThread(InternalLoop, "IRCClientView", ThreadPriority.Normal, false, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SendServerCommand(string command)
|
private void SendServerCommand(string command)
|
||||||
|
|
|
@ -57,7 +57,7 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server
|
||||||
|
|
||||||
m_listener.Start(50);
|
m_listener.Start(50);
|
||||||
|
|
||||||
Watchdog.StartThread(ListenLoop, "IRCServer", ThreadPriority.Normal, false);
|
Watchdog.StartThread(ListenLoop, "IRCServer", ThreadPriority.Normal, false, true);
|
||||||
m_baseScene = baseScene;
|
m_baseScene = baseScene;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -92,7 +92,7 @@ namespace OpenSim.Region.OptionalModules.Agent.TextureSender
|
||||||
m_scene = scene;
|
m_scene = scene;
|
||||||
|
|
||||||
MainConsole.Instance.Commands.AddCommand(
|
MainConsole.Instance.Commands.AddCommand(
|
||||||
"j2k",
|
"Assets",
|
||||||
false,
|
false,
|
||||||
"j2k decode",
|
"j2k decode",
|
||||||
"j2k decode <ID>",
|
"j2k decode <ID>",
|
||||||
|
|
|
@ -82,19 +82,19 @@ namespace OpenSim.Region.CoreModules.UDP.Linden
|
||||||
m_scenes[scene.RegionInfo.RegionID] = scene;
|
m_scenes[scene.RegionInfo.RegionID] = scene;
|
||||||
|
|
||||||
scene.AddCommand(
|
scene.AddCommand(
|
||||||
this, "image queues clear",
|
"Comms", this, "image queues clear",
|
||||||
"image queues clear <first-name> <last-name>",
|
"image queues clear <first-name> <last-name>",
|
||||||
"Clear the image queues (textures downloaded via UDP) for a particular client.",
|
"Clear the image queues (textures downloaded via UDP) for a particular client.",
|
||||||
(mod, cmd) => MainConsole.Instance.Output(HandleImageQueuesClear(cmd)));
|
(mod, cmd) => MainConsole.Instance.Output(HandleImageQueuesClear(cmd)));
|
||||||
|
|
||||||
scene.AddCommand(
|
scene.AddCommand(
|
||||||
this, "image queues show",
|
"Comms", this, "image queues show",
|
||||||
"image queues show <first-name> <last-name>",
|
"image queues show <first-name> <last-name>",
|
||||||
"Show the image queues (textures downloaded via UDP) for a particular client.",
|
"Show the image queues (textures downloaded via UDP) for a particular client.",
|
||||||
(mod, cmd) => MainConsole.Instance.Output(GetImageQueuesReport(cmd)));
|
(mod, cmd) => MainConsole.Instance.Output(GetImageQueuesReport(cmd)));
|
||||||
|
|
||||||
scene.AddCommand(
|
scene.AddCommand(
|
||||||
this, "show pqueues",
|
"Comms", this, "show pqueues",
|
||||||
"show pqueues [full]",
|
"show pqueues [full]",
|
||||||
"Show priority queue data for each client",
|
"Show priority queue data for each client",
|
||||||
"Without the 'full' option, only root agents are shown."
|
"Without the 'full' option, only root agents are shown."
|
||||||
|
@ -102,7 +102,7 @@ namespace OpenSim.Region.CoreModules.UDP.Linden
|
||||||
(mod, cmd) => MainConsole.Instance.Output(GetPQueuesReport(cmd)));
|
(mod, cmd) => MainConsole.Instance.Output(GetPQueuesReport(cmd)));
|
||||||
|
|
||||||
scene.AddCommand(
|
scene.AddCommand(
|
||||||
this, "show queues",
|
"Comms", this, "show queues",
|
||||||
"show queues [full]",
|
"show queues [full]",
|
||||||
"Show queue data for each client",
|
"Show queue data for each client",
|
||||||
"Without the 'full' option, only root agents are shown."
|
"Without the 'full' option, only root agents are shown."
|
||||||
|
@ -110,13 +110,13 @@ namespace OpenSim.Region.CoreModules.UDP.Linden
|
||||||
(mod, cmd) => MainConsole.Instance.Output(GetQueuesReport(cmd)));
|
(mod, cmd) => MainConsole.Instance.Output(GetQueuesReport(cmd)));
|
||||||
|
|
||||||
scene.AddCommand(
|
scene.AddCommand(
|
||||||
this, "show image queues",
|
"Comms", this, "show image queues",
|
||||||
"show image queues <first-name> <last-name>",
|
"show image queues <first-name> <last-name>",
|
||||||
"Show the image queues (textures downloaded via UDP) for a particular client.",
|
"Show the image queues (textures downloaded via UDP) for a particular client.",
|
||||||
(mod, cmd) => MainConsole.Instance.Output(GetImageQueuesReport(cmd)));
|
(mod, cmd) => MainConsole.Instance.Output(GetImageQueuesReport(cmd)));
|
||||||
|
|
||||||
scene.AddCommand(
|
scene.AddCommand(
|
||||||
this, "show throttles",
|
"Comms", this, "show throttles",
|
||||||
"show throttles [full]",
|
"show throttles [full]",
|
||||||
"Show throttle settings for each client and for the server overall",
|
"Show throttle settings for each client and for the server overall",
|
||||||
"Without the 'full' option, only root agents are shown."
|
"Without the 'full' option, only root agents are shown."
|
||||||
|
@ -124,7 +124,7 @@ namespace OpenSim.Region.CoreModules.UDP.Linden
|
||||||
(mod, cmd) => MainConsole.Instance.Output(GetThrottlesReport(cmd)));
|
(mod, cmd) => MainConsole.Instance.Output(GetThrottlesReport(cmd)));
|
||||||
|
|
||||||
scene.AddCommand(
|
scene.AddCommand(
|
||||||
this, "emergency-monitoring",
|
"Comms", this, "emergency-monitoring",
|
||||||
"emergency-monitoring",
|
"emergency-monitoring",
|
||||||
"Go on/off emergency monitoring mode",
|
"Go on/off emergency monitoring mode",
|
||||||
"Go on/off emergency monitoring mode",
|
"Go on/off emergency monitoring mode",
|
||||||
|
|
|
@ -88,7 +88,7 @@ namespace OpenSim.Region.OptionalModules.Asset
|
||||||
m_scene = scene;
|
m_scene = scene;
|
||||||
|
|
||||||
MainConsole.Instance.Commands.AddCommand(
|
MainConsole.Instance.Commands.AddCommand(
|
||||||
"asset",
|
"Assets",
|
||||||
false,
|
false,
|
||||||
"show asset",
|
"show asset",
|
||||||
"show asset <ID>",
|
"show asset <ID>",
|
||||||
|
@ -96,7 +96,7 @@ namespace OpenSim.Region.OptionalModules.Asset
|
||||||
HandleShowAsset);
|
HandleShowAsset);
|
||||||
|
|
||||||
MainConsole.Instance.Commands.AddCommand(
|
MainConsole.Instance.Commands.AddCommand(
|
||||||
"asset", false, "dump asset",
|
"Assets", false, "dump asset",
|
||||||
"dump asset <id>",
|
"dump asset <id>",
|
||||||
"Dump an asset",
|
"Dump an asset",
|
||||||
HandleDumpAsset);
|
HandleDumpAsset);
|
||||||
|
|
|
@ -94,13 +94,13 @@ namespace OpenSim.Region.OptionalModules.Avatar.Appearance
|
||||||
m_scenes[scene.RegionInfo.RegionID] = scene;
|
m_scenes[scene.RegionInfo.RegionID] = scene;
|
||||||
|
|
||||||
scene.AddCommand(
|
scene.AddCommand(
|
||||||
this, "show appearance",
|
"Users", this, "show appearance",
|
||||||
"show appearance [<first-name> <last-name>]",
|
"show appearance [<first-name> <last-name>]",
|
||||||
"Synonym for 'appearance show'",
|
"Synonym for 'appearance show'",
|
||||||
HandleShowAppearanceCommand);
|
HandleShowAppearanceCommand);
|
||||||
|
|
||||||
scene.AddCommand(
|
scene.AddCommand(
|
||||||
this, "appearance show",
|
"Users", this, "appearance show",
|
||||||
"appearance show [<first-name> <last-name>]",
|
"appearance show [<first-name> <last-name>]",
|
||||||
"Show appearance information for each avatar in the simulator.",
|
"Show appearance information for each avatar in the simulator.",
|
||||||
"This command checks whether the simulator has all the baked textures required to display an avatar to other viewers. "
|
"This command checks whether the simulator has all the baked textures required to display an avatar to other viewers. "
|
||||||
|
@ -110,14 +110,14 @@ namespace OpenSim.Region.OptionalModules.Avatar.Appearance
|
||||||
HandleShowAppearanceCommand);
|
HandleShowAppearanceCommand);
|
||||||
|
|
||||||
scene.AddCommand(
|
scene.AddCommand(
|
||||||
this, "appearance send",
|
"Users", this, "appearance send",
|
||||||
"appearance send [<first-name> <last-name>]",
|
"appearance send [<first-name> <last-name>]",
|
||||||
"Send appearance data for each avatar in the simulator to other viewers.",
|
"Send appearance data for each avatar in the simulator to other viewers.",
|
||||||
"Optionally, you can specify that only a particular avatar's appearance data is sent.",
|
"Optionally, you can specify that only a particular avatar's appearance data is sent.",
|
||||||
HandleSendAppearanceCommand);
|
HandleSendAppearanceCommand);
|
||||||
|
|
||||||
scene.AddCommand(
|
scene.AddCommand(
|
||||||
this, "appearance rebake",
|
"Users", this, "appearance rebake",
|
||||||
"appearance rebake <first-name> <last-name>",
|
"appearance rebake <first-name> <last-name>",
|
||||||
"Send a request to the user's viewer for it to rebake and reupload its appearance textures.",
|
"Send a request to the user's viewer for it to rebake and reupload its appearance textures.",
|
||||||
"This is currently done for all baked texture references previously received, whether the simulator can find the asset or not."
|
"This is currently done for all baked texture references previously received, whether the simulator can find the asset or not."
|
||||||
|
@ -127,7 +127,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.Appearance
|
||||||
HandleRebakeAppearanceCommand);
|
HandleRebakeAppearanceCommand);
|
||||||
|
|
||||||
scene.AddCommand(
|
scene.AddCommand(
|
||||||
this, "appearance find",
|
"Users", this, "appearance find",
|
||||||
"appearance find <uuid-or-start-of-uuid>",
|
"appearance find <uuid-or-start-of-uuid>",
|
||||||
"Find out which avatar uses the given asset as a baked texture, if any.",
|
"Find out which avatar uses the given asset as a baked texture, if any.",
|
||||||
"You can specify just the beginning of the uuid, e.g. 2008a8d. A longer UUID must be in dashed format.",
|
"You can specify just the beginning of the uuid, e.g. 2008a8d. A longer UUID must be in dashed format.",
|
||||||
|
|
|
@ -100,22 +100,22 @@ namespace OpenSim.Region.OptionalModules.PhysicsParameters
|
||||||
{
|
{
|
||||||
if (!m_commandsLoaded)
|
if (!m_commandsLoaded)
|
||||||
{
|
{
|
||||||
MainConsole.Instance.Commands.AddCommand("Physics", false, "physics set",
|
MainConsole.Instance.Commands.AddCommand(
|
||||||
"physics set",
|
"Regions", false, "physics set",
|
||||||
"Set physics parameter from currently selected region" + Environment.NewLine
|
setInvocation,
|
||||||
+ "Invocation: " + setInvocation,
|
"Set physics parameter from currently selected region",
|
||||||
ProcessPhysicsSet);
|
ProcessPhysicsSet);
|
||||||
|
|
||||||
MainConsole.Instance.Commands.AddCommand("Physics", false, "physics get",
|
MainConsole.Instance.Commands.AddCommand(
|
||||||
"physics get",
|
"Regions", false, "physics get",
|
||||||
"Get physics parameter from currently selected region" + Environment.NewLine
|
getInvocation,
|
||||||
+ "Invocation: " + getInvocation,
|
"Get physics parameter from currently selected region",
|
||||||
ProcessPhysicsGet);
|
ProcessPhysicsGet);
|
||||||
|
|
||||||
MainConsole.Instance.Commands.AddCommand("Physics", false, "physics list",
|
MainConsole.Instance.Commands.AddCommand(
|
||||||
"physics list",
|
"Regions", false, "physics list",
|
||||||
"List settable physics parameters" + Environment.NewLine
|
listInvocation,
|
||||||
+ "Invocation: " + listInvocation,
|
"List settable physics parameters",
|
||||||
ProcessPhysicsList);
|
ProcessPhysicsList);
|
||||||
|
|
||||||
m_commandsLoaded = true;
|
m_commandsLoaded = true;
|
||||||
|
|
|
@ -34,6 +34,9 @@ using OpenSim.Framework;
|
||||||
using OpenSim.Region.Framework.Interfaces;
|
using OpenSim.Region.Framework.Interfaces;
|
||||||
using OpenSim.Region.Framework.Scenes;
|
using OpenSim.Region.Framework.Scenes;
|
||||||
using OpenSim.Region.CoreModules.World.Estate;
|
using OpenSim.Region.CoreModules.World.Estate;
|
||||||
|
using log4net;
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Xml;
|
||||||
|
|
||||||
namespace OpenSim.Region.OptionalModules.World.NPC
|
namespace OpenSim.Region.OptionalModules.World.NPC
|
||||||
{
|
{
|
||||||
|
@ -132,7 +135,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC
|
||||||
|
|
||||||
public UUID GetDefaultAnimation(string name)
|
public UUID GetDefaultAnimation(string name)
|
||||||
{
|
{
|
||||||
return UUID.Zero;
|
return SLUtil.GetDefaultAvatarAnimation(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Vector3 Position
|
public Vector3 Position
|
||||||
|
|
|
@ -88,22 +88,26 @@ namespace OpenSim.Region.OptionalModules.World.NPC
|
||||||
|
|
||||||
public bool SetNPCAppearance(UUID agentId, AvatarAppearance appearance, Scene scene)
|
public bool SetNPCAppearance(UUID agentId, AvatarAppearance appearance, Scene scene)
|
||||||
{
|
{
|
||||||
ScenePresence sp = scene.GetScenePresence(agentId);
|
ScenePresence npc = scene.GetScenePresence(agentId);
|
||||||
if (sp == null || sp.IsChildAgent)
|
if (npc == null || npc.IsChildAgent)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
lock (m_avatars)
|
lock (m_avatars)
|
||||||
if (!m_avatars.ContainsKey(agentId))
|
if (!m_avatars.ContainsKey(agentId))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// Delete existing sp attachments
|
// Delete existing npc attachments
|
||||||
scene.AttachmentsModule.DeleteAttachmentsFromScene(sp, false);
|
scene.AttachmentsModule.DeleteAttachmentsFromScene(npc, false);
|
||||||
|
|
||||||
// Set new sp appearance. Also sends to clients.
|
// XXX: We can't just use IAvatarFactoryModule.SetAppearance() yet since it doesn't transfer attachments
|
||||||
scene.RequestModuleInterface<IAvatarFactoryModule>().SetAppearance(sp, new AvatarAppearance(appearance, true));
|
AvatarAppearance npcAppearance = new AvatarAppearance(appearance, true);
|
||||||
|
npc.Appearance = npcAppearance;
|
||||||
|
|
||||||
// Rez needed sp attachments
|
// Rez needed npc attachments
|
||||||
scene.AttachmentsModule.RezAttachments(sp);
|
scene.AttachmentsModule.RezAttachments(npc);
|
||||||
|
|
||||||
|
IAvatarFactoryModule module = scene.RequestModuleInterface<IAvatarFactoryModule>();
|
||||||
|
module.SendAppearance(npc.UUID);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -50,10 +50,11 @@ namespace OpenSim.Region.OptionalModules.World.NPC.Tests
|
||||||
[TestFixture]
|
[TestFixture]
|
||||||
public class NPCModuleTests
|
public class NPCModuleTests
|
||||||
{
|
{
|
||||||
private TestScene scene;
|
private TestScene m_scene;
|
||||||
private AvatarFactoryModule afm;
|
private AvatarFactoryModule m_afMod;
|
||||||
private UserManagementModule umm;
|
private UserManagementModule m_umMod;
|
||||||
private AttachmentsModule am;
|
private AttachmentsModule m_attMod;
|
||||||
|
private NPCModule m_npcMod;
|
||||||
|
|
||||||
[TestFixtureSetUp]
|
[TestFixtureSetUp]
|
||||||
public void FixtureInit()
|
public void FixtureInit()
|
||||||
|
@ -79,12 +80,13 @@ namespace OpenSim.Region.OptionalModules.World.NPC.Tests
|
||||||
config.AddConfig("Modules");
|
config.AddConfig("Modules");
|
||||||
config.Configs["Modules"].Set("InventoryAccessModule", "BasicInventoryAccessModule");
|
config.Configs["Modules"].Set("InventoryAccessModule", "BasicInventoryAccessModule");
|
||||||
|
|
||||||
afm = new AvatarFactoryModule();
|
m_afMod = new AvatarFactoryModule();
|
||||||
umm = new UserManagementModule();
|
m_umMod = new UserManagementModule();
|
||||||
am = new AttachmentsModule();
|
m_attMod = new AttachmentsModule();
|
||||||
|
m_npcMod = new NPCModule();
|
||||||
|
|
||||||
scene = SceneHelpers.SetupScene();
|
m_scene = SceneHelpers.SetupScene();
|
||||||
SceneHelpers.SetupSceneModules(scene, config, afm, umm, am, new BasicInventoryAccessModule(), new NPCModule());
|
SceneHelpers.SetupSceneModules(m_scene, config, m_afMod, m_umMod, m_attMod, m_npcMod, new BasicInventoryAccessModule());
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
|
@ -93,7 +95,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC.Tests
|
||||||
TestHelpers.InMethod();
|
TestHelpers.InMethod();
|
||||||
// log4net.Config.XmlConfigurator.Configure();
|
// log4net.Config.XmlConfigurator.Configure();
|
||||||
|
|
||||||
ScenePresence sp = SceneHelpers.AddScenePresence(scene, TestHelpers.ParseTail(0x1));
|
ScenePresence sp = SceneHelpers.AddScenePresence(m_scene, TestHelpers.ParseTail(0x1));
|
||||||
// ScenePresence originalAvatar = scene.GetScenePresence(originalClient.AgentId);
|
// ScenePresence originalAvatar = scene.GetScenePresence(originalClient.AgentId);
|
||||||
|
|
||||||
// 8 is the index of the first baked texture in AvatarAppearance
|
// 8 is the index of the first baked texture in AvatarAppearance
|
||||||
|
@ -104,18 +106,17 @@ namespace OpenSim.Region.OptionalModules.World.NPC.Tests
|
||||||
|
|
||||||
// We also need to add the texture to the asset service, otherwise the AvatarFactoryModule will tell
|
// We also need to add the texture to the asset service, otherwise the AvatarFactoryModule will tell
|
||||||
// ScenePresence.SendInitialData() to reset our entire appearance.
|
// ScenePresence.SendInitialData() to reset our entire appearance.
|
||||||
scene.AssetService.Store(AssetHelpers.CreateNotecardAsset(originalFace8TextureId));
|
m_scene.AssetService.Store(AssetHelpers.CreateNotecardAsset(originalFace8TextureId));
|
||||||
|
|
||||||
afm.SetAppearance(sp, originalTe, null);
|
m_afMod.SetAppearance(sp, originalTe, null);
|
||||||
|
|
||||||
INPCModule npcModule = scene.RequestModuleInterface<INPCModule>();
|
UUID npcId = m_npcMod.CreateNPC("John", "Smith", new Vector3(128, 128, 30), UUID.Zero, true, m_scene, sp.Appearance);
|
||||||
UUID npcId = npcModule.CreateNPC("John", "Smith", new Vector3(128, 128, 30), UUID.Zero, true, scene, sp.Appearance);
|
|
||||||
|
|
||||||
ScenePresence npc = scene.GetScenePresence(npcId);
|
ScenePresence npc = m_scene.GetScenePresence(npcId);
|
||||||
|
|
||||||
Assert.That(npc, Is.Not.Null);
|
Assert.That(npc, Is.Not.Null);
|
||||||
Assert.That(npc.Appearance.Texture.FaceTextures[8].TextureID, Is.EqualTo(originalFace8TextureId));
|
Assert.That(npc.Appearance.Texture.FaceTextures[8].TextureID, Is.EqualTo(originalFace8TextureId));
|
||||||
Assert.That(umm.GetUserName(npc.UUID), Is.EqualTo(string.Format("{0} {1}", npc.Firstname, npc.Lastname)));
|
Assert.That(m_umMod.GetUserName(npc.UUID), Is.EqualTo(string.Format("{0} {1}", npc.Firstname, npc.Lastname)));
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
|
@ -124,42 +125,83 @@ namespace OpenSim.Region.OptionalModules.World.NPC.Tests
|
||||||
TestHelpers.InMethod();
|
TestHelpers.InMethod();
|
||||||
// log4net.Config.XmlConfigurator.Configure();
|
// log4net.Config.XmlConfigurator.Configure();
|
||||||
|
|
||||||
ScenePresence sp = SceneHelpers.AddScenePresence(scene, TestHelpers.ParseTail(0x1));
|
ScenePresence sp = SceneHelpers.AddScenePresence(m_scene, TestHelpers.ParseTail(0x1));
|
||||||
// ScenePresence originalAvatar = scene.GetScenePresence(originalClient.AgentId);
|
// ScenePresence originalAvatar = scene.GetScenePresence(originalClient.AgentId);
|
||||||
|
|
||||||
Vector3 startPos = new Vector3(128, 128, 30);
|
Vector3 startPos = new Vector3(128, 128, 30);
|
||||||
INPCModule npcModule = scene.RequestModuleInterface<INPCModule>();
|
UUID npcId = m_npcMod.CreateNPC("John", "Smith", startPos, UUID.Zero, true, m_scene, sp.Appearance);
|
||||||
UUID npcId = npcModule.CreateNPC("John", "Smith", startPos, UUID.Zero, true, scene, sp.Appearance);
|
|
||||||
|
|
||||||
npcModule.DeleteNPC(npcId, scene);
|
m_npcMod.DeleteNPC(npcId, m_scene);
|
||||||
|
|
||||||
ScenePresence deletedNpc = scene.GetScenePresence(npcId);
|
ScenePresence deletedNpc = m_scene.GetScenePresence(npcId);
|
||||||
|
|
||||||
Assert.That(deletedNpc, Is.Null);
|
Assert.That(deletedNpc, Is.Null);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void TestAttachments()
|
public void TestCreateWithAttachments()
|
||||||
{
|
{
|
||||||
TestHelpers.InMethod();
|
TestHelpers.InMethod();
|
||||||
// log4net.Config.XmlConfigurator.Configure();
|
// log4net.Config.XmlConfigurator.Configure();
|
||||||
|
|
||||||
UUID userId = TestHelpers.ParseTail(0x1);
|
UUID userId = TestHelpers.ParseTail(0x1);
|
||||||
UserAccountHelpers.CreateUserWithInventory(scene, userId);
|
UserAccountHelpers.CreateUserWithInventory(m_scene, userId);
|
||||||
ScenePresence sp = SceneHelpers.AddScenePresence(scene, userId);
|
ScenePresence sp = SceneHelpers.AddScenePresence(m_scene, userId);
|
||||||
|
|
||||||
UUID attItemId = TestHelpers.ParseTail(0x2);
|
UUID attItemId = TestHelpers.ParseTail(0x2);
|
||||||
UUID attAssetId = TestHelpers.ParseTail(0x3);
|
UUID attAssetId = TestHelpers.ParseTail(0x3);
|
||||||
string attName = "att";
|
string attName = "att";
|
||||||
|
|
||||||
UserInventoryHelpers.CreateInventoryItem(scene, attName, attItemId, attAssetId, sp.UUID, InventoryType.Object);
|
UserInventoryHelpers.CreateInventoryItem(m_scene, attName, attItemId, attAssetId, sp.UUID, InventoryType.Object);
|
||||||
|
|
||||||
am.RezSingleAttachmentFromInventory(sp, attItemId, (uint)AttachmentPoint.Chest);
|
m_attMod.RezSingleAttachmentFromInventory(sp, attItemId, (uint)AttachmentPoint.Chest);
|
||||||
|
|
||||||
INPCModule npcModule = scene.RequestModuleInterface<INPCModule>();
|
UUID npcId = m_npcMod.CreateNPC("John", "Smith", new Vector3(128, 128, 30), UUID.Zero, true, m_scene, sp.Appearance);
|
||||||
UUID npcId = npcModule.CreateNPC("John", "Smith", new Vector3(128, 128, 30), UUID.Zero, true, scene, sp.Appearance);
|
|
||||||
|
|
||||||
ScenePresence npc = scene.GetScenePresence(npcId);
|
ScenePresence npc = m_scene.GetScenePresence(npcId);
|
||||||
|
|
||||||
|
// Check scene presence status
|
||||||
|
Assert.That(npc.HasAttachments(), Is.True);
|
||||||
|
List<SceneObjectGroup> attachments = npc.GetAttachments();
|
||||||
|
Assert.That(attachments.Count, Is.EqualTo(1));
|
||||||
|
SceneObjectGroup attSo = attachments[0];
|
||||||
|
|
||||||
|
// Just for now, we won't test the name since this is (wrongly) the asset part name rather than the item
|
||||||
|
// name. TODO: Do need to fix ultimately since the item may be renamed before being passed on to an NPC.
|
||||||
|
// Assert.That(attSo.Name, Is.EqualTo(attName));
|
||||||
|
|
||||||
|
Assert.That(attSo.AttachmentPoint, Is.EqualTo((byte)AttachmentPoint.Chest));
|
||||||
|
Assert.That(attSo.IsAttachment);
|
||||||
|
Assert.That(attSo.UsesPhysics, Is.False);
|
||||||
|
Assert.That(attSo.IsTemporary, Is.False);
|
||||||
|
Assert.That(attSo.OwnerID, Is.EqualTo(npc.UUID));
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestLoadAppearance()
|
||||||
|
{
|
||||||
|
TestHelpers.InMethod();
|
||||||
|
// log4net.Config.XmlConfigurator.Configure();
|
||||||
|
|
||||||
|
UUID userId = TestHelpers.ParseTail(0x1);
|
||||||
|
UserAccountHelpers.CreateUserWithInventory(m_scene, userId);
|
||||||
|
ScenePresence sp = SceneHelpers.AddScenePresence(m_scene, userId);
|
||||||
|
|
||||||
|
UUID npcId = m_npcMod.CreateNPC("John", "Smith", new Vector3(128, 128, 30), UUID.Zero, true, m_scene, sp.Appearance);
|
||||||
|
|
||||||
|
// Now add the attachment to the original avatar and use that to load a new appearance
|
||||||
|
// TODO: Could also run tests loading from a notecard though this isn't much different for our purposes here
|
||||||
|
UUID attItemId = TestHelpers.ParseTail(0x2);
|
||||||
|
UUID attAssetId = TestHelpers.ParseTail(0x3);
|
||||||
|
string attName = "att";
|
||||||
|
|
||||||
|
UserInventoryHelpers.CreateInventoryItem(m_scene, attName, attItemId, attAssetId, sp.UUID, InventoryType.Object);
|
||||||
|
|
||||||
|
m_attMod.RezSingleAttachmentFromInventory(sp, attItemId, (uint)AttachmentPoint.Chest);
|
||||||
|
|
||||||
|
m_npcMod.SetNPCAppearance(npcId, sp.Appearance, m_scene);
|
||||||
|
|
||||||
|
ScenePresence npc = m_scene.GetScenePresence(npcId);
|
||||||
|
|
||||||
// Check scene presence status
|
// Check scene presence status
|
||||||
Assert.That(npc.HasAttachments(), Is.True);
|
Assert.That(npc.HasAttachments(), Is.True);
|
||||||
|
@ -184,31 +226,30 @@ namespace OpenSim.Region.OptionalModules.World.NPC.Tests
|
||||||
TestHelpers.InMethod();
|
TestHelpers.InMethod();
|
||||||
// log4net.Config.XmlConfigurator.Configure();
|
// log4net.Config.XmlConfigurator.Configure();
|
||||||
|
|
||||||
ScenePresence sp = SceneHelpers.AddScenePresence(scene, TestHelpers.ParseTail(0x1));
|
ScenePresence sp = SceneHelpers.AddScenePresence(m_scene, TestHelpers.ParseTail(0x1));
|
||||||
// ScenePresence originalAvatar = scene.GetScenePresence(originalClient.AgentId);
|
// ScenePresence originalAvatar = scene.GetScenePresence(originalClient.AgentId);
|
||||||
|
|
||||||
Vector3 startPos = new Vector3(128, 128, 30);
|
Vector3 startPos = new Vector3(128, 128, 30);
|
||||||
INPCModule npcModule = scene.RequestModuleInterface<INPCModule>();
|
UUID npcId = m_npcMod.CreateNPC("John", "Smith", startPos, UUID.Zero, true, m_scene, sp.Appearance);
|
||||||
UUID npcId = npcModule.CreateNPC("John", "Smith", startPos, UUID.Zero, true, scene, sp.Appearance);
|
|
||||||
|
|
||||||
ScenePresence npc = scene.GetScenePresence(npcId);
|
ScenePresence npc = m_scene.GetScenePresence(npcId);
|
||||||
Assert.That(npc.AbsolutePosition, Is.EqualTo(startPos));
|
Assert.That(npc.AbsolutePosition, Is.EqualTo(startPos));
|
||||||
|
|
||||||
// For now, we'll make the scene presence fly to simplify this test, but this needs to change.
|
// For now, we'll make the scene presence fly to simplify this test, but this needs to change.
|
||||||
npc.Flying = true;
|
npc.Flying = true;
|
||||||
|
|
||||||
scene.Update();
|
m_scene.Update();
|
||||||
Assert.That(npc.AbsolutePosition, Is.EqualTo(startPos));
|
Assert.That(npc.AbsolutePosition, Is.EqualTo(startPos));
|
||||||
|
|
||||||
Vector3 targetPos = startPos + new Vector3(0, 10, 0);
|
Vector3 targetPos = startPos + new Vector3(0, 10, 0);
|
||||||
npcModule.MoveToTarget(npc.UUID, scene, targetPos, false, false);
|
m_npcMod.MoveToTarget(npc.UUID, m_scene, targetPos, false, false);
|
||||||
|
|
||||||
Assert.That(npc.AbsolutePosition, Is.EqualTo(startPos));
|
Assert.That(npc.AbsolutePosition, Is.EqualTo(startPos));
|
||||||
//Assert.That(npc.Rotation, Is.EqualTo(new Quaternion(0, 0, 0.7071068f, 0.7071068f)));
|
//Assert.That(npc.Rotation, Is.EqualTo(new Quaternion(0, 0, 0.7071068f, 0.7071068f)));
|
||||||
Assert.That(
|
Assert.That(
|
||||||
npc.Rotation, new QuaternionToleranceConstraint(new Quaternion(0, 0, 0.7071068f, 0.7071068f), 0.000001));
|
npc.Rotation, new QuaternionToleranceConstraint(new Quaternion(0, 0, 0.7071068f, 0.7071068f), 0.000001));
|
||||||
|
|
||||||
scene.Update();
|
m_scene.Update();
|
||||||
|
|
||||||
// We should really check the exact figure.
|
// We should really check the exact figure.
|
||||||
Assert.That(npc.AbsolutePosition.X, Is.EqualTo(startPos.X));
|
Assert.That(npc.AbsolutePosition.X, Is.EqualTo(startPos.X));
|
||||||
|
@ -217,7 +258,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC.Tests
|
||||||
Assert.That(npc.AbsolutePosition.Z, Is.LessThan(targetPos.X));
|
Assert.That(npc.AbsolutePosition.Z, Is.LessThan(targetPos.X));
|
||||||
|
|
||||||
for (int i = 0; i < 10; i++)
|
for (int i = 0; i < 10; i++)
|
||||||
scene.Update();
|
m_scene.Update();
|
||||||
|
|
||||||
double distanceToTarget = Util.GetDistanceTo(npc.AbsolutePosition, targetPos);
|
double distanceToTarget = Util.GetDistanceTo(npc.AbsolutePosition, targetPos);
|
||||||
Assert.That(distanceToTarget, Is.LessThan(1), "NPC not within 1 unit of target position on first move");
|
Assert.That(distanceToTarget, Is.LessThan(1), "NPC not within 1 unit of target position on first move");
|
||||||
|
@ -227,14 +268,14 @@ namespace OpenSim.Region.OptionalModules.World.NPC.Tests
|
||||||
// Try a second movement
|
// Try a second movement
|
||||||
startPos = npc.AbsolutePosition;
|
startPos = npc.AbsolutePosition;
|
||||||
targetPos = startPos + new Vector3(10, 0, 0);
|
targetPos = startPos + new Vector3(10, 0, 0);
|
||||||
npcModule.MoveToTarget(npc.UUID, scene, targetPos, false, false);
|
m_npcMod.MoveToTarget(npc.UUID, m_scene, targetPos, false, false);
|
||||||
|
|
||||||
Assert.That(npc.AbsolutePosition, Is.EqualTo(startPos));
|
Assert.That(npc.AbsolutePosition, Is.EqualTo(startPos));
|
||||||
// Assert.That(npc.Rotation, Is.EqualTo(new Quaternion(0, 0, 0, 1)));
|
// Assert.That(npc.Rotation, Is.EqualTo(new Quaternion(0, 0, 0, 1)));
|
||||||
Assert.That(
|
Assert.That(
|
||||||
npc.Rotation, new QuaternionToleranceConstraint(new Quaternion(0, 0, 0, 1), 0.000001));
|
npc.Rotation, new QuaternionToleranceConstraint(new Quaternion(0, 0, 0, 1), 0.000001));
|
||||||
|
|
||||||
scene.Update();
|
m_scene.Update();
|
||||||
|
|
||||||
// We should really check the exact figure.
|
// We should really check the exact figure.
|
||||||
Assert.That(npc.AbsolutePosition.X, Is.GreaterThan(startPos.X));
|
Assert.That(npc.AbsolutePosition.X, Is.GreaterThan(startPos.X));
|
||||||
|
@ -243,7 +284,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC.Tests
|
||||||
Assert.That(npc.AbsolutePosition.Z, Is.EqualTo(startPos.Z));
|
Assert.That(npc.AbsolutePosition.Z, Is.EqualTo(startPos.Z));
|
||||||
|
|
||||||
for (int i = 0; i < 10; i++)
|
for (int i = 0; i < 10; i++)
|
||||||
scene.Update();
|
m_scene.Update();
|
||||||
|
|
||||||
distanceToTarget = Util.GetDistanceTo(npc.AbsolutePosition, targetPos);
|
distanceToTarget = Util.GetDistanceTo(npc.AbsolutePosition, targetPos);
|
||||||
Assert.That(distanceToTarget, Is.LessThan(1), "NPC not within 1 unit of target position on second move");
|
Assert.That(distanceToTarget, Is.LessThan(1), "NPC not within 1 unit of target position on second move");
|
||||||
|
@ -256,17 +297,16 @@ namespace OpenSim.Region.OptionalModules.World.NPC.Tests
|
||||||
TestHelpers.InMethod();
|
TestHelpers.InMethod();
|
||||||
// log4net.Config.XmlConfigurator.Configure();
|
// log4net.Config.XmlConfigurator.Configure();
|
||||||
|
|
||||||
ScenePresence sp = SceneHelpers.AddScenePresence(scene, TestHelpers.ParseTail(0x1));
|
ScenePresence sp = SceneHelpers.AddScenePresence(m_scene, TestHelpers.ParseTail(0x1));
|
||||||
|
|
||||||
Vector3 startPos = new Vector3(128, 128, 30);
|
Vector3 startPos = new Vector3(128, 128, 30);
|
||||||
INPCModule npcModule = scene.RequestModuleInterface<INPCModule>();
|
UUID npcId = m_npcMod.CreateNPC("John", "Smith", startPos, UUID.Zero, true, m_scene, sp.Appearance);
|
||||||
UUID npcId = npcModule.CreateNPC("John", "Smith", startPos, UUID.Zero, true, scene, sp.Appearance);
|
|
||||||
|
|
||||||
ScenePresence npc = scene.GetScenePresence(npcId);
|
ScenePresence npc = m_scene.GetScenePresence(npcId);
|
||||||
SceneObjectPart part = SceneHelpers.AddSceneObject(scene);
|
SceneObjectPart part = SceneHelpers.AddSceneObject(m_scene);
|
||||||
|
|
||||||
part.SitTargetPosition = new Vector3(0, 0, 1);
|
part.SitTargetPosition = new Vector3(0, 0, 1);
|
||||||
npcModule.Sit(npc.UUID, part.UUID, scene);
|
m_npcMod.Sit(npc.UUID, part.UUID, m_scene);
|
||||||
|
|
||||||
Assert.That(part.SitTargetAvatar, Is.EqualTo(npcId));
|
Assert.That(part.SitTargetAvatar, Is.EqualTo(npcId));
|
||||||
Assert.That(npc.ParentID, Is.EqualTo(part.LocalId));
|
Assert.That(npc.ParentID, Is.EqualTo(part.LocalId));
|
||||||
|
@ -274,7 +314,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC.Tests
|
||||||
npc.AbsolutePosition,
|
npc.AbsolutePosition,
|
||||||
Is.EqualTo(part.AbsolutePosition + part.SitTargetPosition + ScenePresence.SIT_TARGET_ADJUSTMENT));
|
Is.EqualTo(part.AbsolutePosition + part.SitTargetPosition + ScenePresence.SIT_TARGET_ADJUSTMENT));
|
||||||
|
|
||||||
npcModule.Stand(npc.UUID, scene);
|
m_npcMod.Stand(npc.UUID, m_scene);
|
||||||
|
|
||||||
Assert.That(part.SitTargetAvatar, Is.EqualTo(UUID.Zero));
|
Assert.That(part.SitTargetAvatar, Is.EqualTo(UUID.Zero));
|
||||||
Assert.That(npc.ParentID, Is.EqualTo(0));
|
Assert.That(npc.ParentID, Is.EqualTo(0));
|
||||||
|
@ -286,19 +326,18 @@ namespace OpenSim.Region.OptionalModules.World.NPC.Tests
|
||||||
TestHelpers.InMethod();
|
TestHelpers.InMethod();
|
||||||
// log4net.Config.XmlConfigurator.Configure();
|
// log4net.Config.XmlConfigurator.Configure();
|
||||||
|
|
||||||
ScenePresence sp = SceneHelpers.AddScenePresence(scene, TestHelpers.ParseTail(0x1));
|
ScenePresence sp = SceneHelpers.AddScenePresence(m_scene, TestHelpers.ParseTail(0x1));
|
||||||
|
|
||||||
// FIXME: To get this to work for now, we are going to place the npc right next to the target so that
|
// FIXME: To get this to work for now, we are going to place the npc right next to the target so that
|
||||||
// the autopilot doesn't trigger
|
// the autopilot doesn't trigger
|
||||||
Vector3 startPos = new Vector3(1, 1, 1);
|
Vector3 startPos = new Vector3(1, 1, 1);
|
||||||
|
|
||||||
INPCModule npcModule = scene.RequestModuleInterface<INPCModule>();
|
UUID npcId = m_npcMod.CreateNPC("John", "Smith", startPos, UUID.Zero, true, m_scene, sp.Appearance);
|
||||||
UUID npcId = npcModule.CreateNPC("John", "Smith", startPos, UUID.Zero, true, scene, sp.Appearance);
|
|
||||||
|
|
||||||
ScenePresence npc = scene.GetScenePresence(npcId);
|
ScenePresence npc = m_scene.GetScenePresence(npcId);
|
||||||
SceneObjectPart part = SceneHelpers.AddSceneObject(scene);
|
SceneObjectPart part = SceneHelpers.AddSceneObject(m_scene);
|
||||||
|
|
||||||
npcModule.Sit(npc.UUID, part.UUID, scene);
|
m_npcMod.Sit(npc.UUID, part.UUID, m_scene);
|
||||||
|
|
||||||
Assert.That(part.SitTargetAvatar, Is.EqualTo(UUID.Zero));
|
Assert.That(part.SitTargetAvatar, Is.EqualTo(UUID.Zero));
|
||||||
Assert.That(npc.ParentID, Is.EqualTo(part.LocalId));
|
Assert.That(npc.ParentID, Is.EqualTo(part.LocalId));
|
||||||
|
@ -311,7 +350,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC.Tests
|
||||||
npc.AbsolutePosition,
|
npc.AbsolutePosition,
|
||||||
Is.EqualTo(part.AbsolutePosition + new Vector3(0, 0, 0.845499337f)));
|
Is.EqualTo(part.AbsolutePosition + new Vector3(0, 0, 0.845499337f)));
|
||||||
|
|
||||||
npcModule.Stand(npc.UUID, scene);
|
m_npcMod.Stand(npc.UUID, m_scene);
|
||||||
|
|
||||||
Assert.That(part.SitTargetAvatar, Is.EqualTo(UUID.Zero));
|
Assert.That(part.SitTargetAvatar, Is.EqualTo(UUID.Zero));
|
||||||
Assert.That(npc.ParentID, Is.EqualTo(0));
|
Assert.That(npc.ParentID, Is.EqualTo(0));
|
||||||
|
|
|
@ -51,6 +51,9 @@ public class BSPlugin : IPhysicsPlugin
|
||||||
{
|
{
|
||||||
if (_mScene == null)
|
if (_mScene == null)
|
||||||
{
|
{
|
||||||
|
if (Util.IsWindows())
|
||||||
|
Util.LoadArchSpecificWindowsDll("BulletSim.dll");
|
||||||
|
|
||||||
_mScene = new BSScene(sceneIdentifier);
|
_mScene = new BSScene(sceneIdentifier);
|
||||||
}
|
}
|
||||||
return (_mScene);
|
return (_mScene);
|
||||||
|
|
|
@ -30,7 +30,8 @@ using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using Nini.Config;
|
using Nini.Config;
|
||||||
using log4net;
|
using log4net;
|
||||||
|
using OpenSim.Framework;
|
||||||
|
|
||||||
namespace OpenSim.Region.Physics.Manager
|
namespace OpenSim.Region.Physics.Manager
|
||||||
{
|
{
|
||||||
|
|
|
@ -1474,6 +1474,8 @@ Console.WriteLine("CreateGeom:");
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private void changeadd()
|
private void changeadd()
|
||||||
{
|
{
|
||||||
|
// m_log.DebugFormat("[ODE PRIM]: Adding prim {0}", Name);
|
||||||
|
|
||||||
int[] iprimspaceArrItem = _parent_scene.calculateSpaceArrayItemFromPos(_position);
|
int[] iprimspaceArrItem = _parent_scene.calculateSpaceArrayItemFromPos(_position);
|
||||||
IntPtr targetspace = _parent_scene.calculateSpaceForGeom(_position);
|
IntPtr targetspace = _parent_scene.calculateSpaceForGeom(_position);
|
||||||
|
|
||||||
|
|
|
@ -46,7 +46,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class OdePlugin : IPhysicsPlugin
|
public class OdePlugin : IPhysicsPlugin
|
||||||
{
|
{
|
||||||
//private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
|
private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
|
||||||
|
|
||||||
private OdeScene m_scene;
|
private OdeScene m_scene;
|
||||||
|
|
||||||
|
@ -59,13 +59,23 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
{
|
{
|
||||||
if (m_scene == null)
|
if (m_scene == null)
|
||||||
{
|
{
|
||||||
|
// We do this so that OpenSimulator on Windows loads the correct native ODE library depending on whether
|
||||||
|
// it's running as a 32-bit process or a 64-bit one. By invoking LoadLibary here, later DLLImports
|
||||||
|
// will find it already loaded later on.
|
||||||
|
//
|
||||||
|
// This isn't necessary for other platforms (e.g. Mac OSX and Linux) since the DLL used can be
|
||||||
|
// controlled in Ode.NET.dll.config
|
||||||
|
if (Util.IsWindows())
|
||||||
|
Util.LoadArchSpecificWindowsDll("ode.dll");
|
||||||
|
|
||||||
// Initializing ODE only when a scene is created allows alternative ODE plugins to co-habit (according to
|
// Initializing ODE only when a scene is created allows alternative ODE plugins to co-habit (according to
|
||||||
// http://opensimulator.org/mantis/view.php?id=2750).
|
// http://opensimulator.org/mantis/view.php?id=2750).
|
||||||
d.InitODE();
|
d.InitODE();
|
||||||
|
|
||||||
m_scene = new OdeScene(sceneIdentifier);
|
m_scene = new OdeScene(sceneIdentifier);
|
||||||
}
|
}
|
||||||
return (m_scene);
|
|
||||||
|
return m_scene;
|
||||||
}
|
}
|
||||||
|
|
||||||
public string GetName()
|
public string GetName()
|
||||||
|
|
|
@ -1,58 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) Contributors, http://opensimulator.org/
|
|
||||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions are met:
|
|
||||||
* * Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* * Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
* * Neither the name of the OpenSimulator Project nor the
|
|
||||||
* names of its contributors may be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
|
|
||||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
||||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
||||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
|
||||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
using System.Reflection;
|
|
||||||
using System.Runtime.InteropServices;
|
|
||||||
|
|
||||||
// Information about this assembly is defined by the following
|
|
||||||
// attributes.
|
|
||||||
//
|
|
||||||
// change them to the information which is associated with the assembly
|
|
||||||
// you compile.
|
|
||||||
|
|
||||||
[assembly : AssemblyTitle("RealPhysXplugin")]
|
|
||||||
[assembly : AssemblyDescription("")]
|
|
||||||
[assembly : AssemblyConfiguration("")]
|
|
||||||
[assembly : AssemblyCompany("http://opensimulator.org")]
|
|
||||||
[assembly : AssemblyProduct("RealPhysXplugin")]
|
|
||||||
[assembly : AssemblyCopyright("Copyright (c) OpenSimulator.org Developers 2007-2009")]
|
|
||||||
[assembly : AssemblyTrademark("")]
|
|
||||||
[assembly : AssemblyCulture("")]
|
|
||||||
|
|
||||||
// This sets the default COM visibility of types in the assembly to invisible.
|
|
||||||
// If you need to expose a type to COM, use [ComVisible(true)] on that type.
|
|
||||||
|
|
||||||
[assembly : ComVisible(false)]
|
|
||||||
|
|
||||||
// The assembly version has following format :
|
|
||||||
//
|
|
||||||
// Major.Minor.Build.Revision
|
|
||||||
//
|
|
||||||
// You can specify all values by your own or you can build default build and revision
|
|
||||||
// numbers with the '*' character (the default):
|
|
||||||
|
|
||||||
[assembly : AssemblyVersion("0.6.5.*")]
|
|
|
@ -1,349 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) Contributors, http://opensimulator.org/
|
|
||||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions are met:
|
|
||||||
* * Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* * Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
* * Neither the name of the OpenSimulator Project nor the
|
|
||||||
* names of its contributors may be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
|
|
||||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
||||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
||||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
|
||||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using Nini.Config;
|
|
||||||
using OpenSim.Framework;
|
|
||||||
using OpenSim.Region.Physics.Manager;
|
|
||||||
using PhysXWrapper;
|
|
||||||
using Quaternion=OpenMetaverse.Quaternion;
|
|
||||||
using System.Reflection;
|
|
||||||
using log4net;
|
|
||||||
using OpenMetaverse;
|
|
||||||
|
|
||||||
namespace OpenSim.Region.Physics.PhysXPlugin
|
|
||||||
{
|
|
||||||
public class PhysXCharacter : PhysicsActor
|
|
||||||
{
|
|
||||||
private Vector3 _position;
|
|
||||||
private Vector3 _velocity;
|
|
||||||
private Vector3 m_rotationalVelocity = Vector3.Zero;
|
|
||||||
private Vector3 _acceleration;
|
|
||||||
private NxCharacter _character;
|
|
||||||
private bool flying;
|
|
||||||
private bool iscolliding = false;
|
|
||||||
private float gravityAccel;
|
|
||||||
|
|
||||||
public PhysXCharacter(NxCharacter character)
|
|
||||||
{
|
|
||||||
_character = character;
|
|
||||||
}
|
|
||||||
|
|
||||||
public override int PhysicsActorType
|
|
||||||
{
|
|
||||||
get { return (int) ActorTypes.Agent; }
|
|
||||||
set { return; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public override bool SetAlwaysRun
|
|
||||||
{
|
|
||||||
get { return false; }
|
|
||||||
set { return; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public override uint LocalID
|
|
||||||
{
|
|
||||||
set { return; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public override bool Grabbed
|
|
||||||
{
|
|
||||||
set { return; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public override bool Selected
|
|
||||||
{
|
|
||||||
set { return; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public override float Buoyancy
|
|
||||||
{
|
|
||||||
get { return 0f; }
|
|
||||||
set { return; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public override bool FloatOnWater
|
|
||||||
{
|
|
||||||
set { return; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public override bool IsPhysical
|
|
||||||
{
|
|
||||||
get { return false; }
|
|
||||||
set { return; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public override bool ThrottleUpdates
|
|
||||||
{
|
|
||||||
get { return false; }
|
|
||||||
set { return; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public override bool Flying
|
|
||||||
{
|
|
||||||
get { return flying; }
|
|
||||||
set { flying = value; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public override bool IsColliding
|
|
||||||
{
|
|
||||||
get { return iscolliding; }
|
|
||||||
set { iscolliding = value; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public override bool CollidingGround
|
|
||||||
{
|
|
||||||
get { return false; }
|
|
||||||
set { return; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public override bool CollidingObj
|
|
||||||
{
|
|
||||||
get { return false; }
|
|
||||||
set { return; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public override Vector3 RotationalVelocity
|
|
||||||
{
|
|
||||||
get { return m_rotationalVelocity; }
|
|
||||||
set { m_rotationalVelocity = value; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public override bool Stopped
|
|
||||||
{
|
|
||||||
get { return false; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public override Vector3 Position
|
|
||||||
{
|
|
||||||
get { return _position; }
|
|
||||||
set
|
|
||||||
{
|
|
||||||
_position = value;
|
|
||||||
Vec3 ps = new Vec3();
|
|
||||||
ps.X = value.X;
|
|
||||||
ps.Y = value.Y;
|
|
||||||
ps.Z = value.Z;
|
|
||||||
_character.Position = ps;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public override Vector3 Size
|
|
||||||
{
|
|
||||||
get { return Vector3.Zero; }
|
|
||||||
set { }
|
|
||||||
}
|
|
||||||
|
|
||||||
public override float Mass
|
|
||||||
{
|
|
||||||
get { return 0f; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public override Vector3 Force
|
|
||||||
{
|
|
||||||
get { return Vector3.Zero; }
|
|
||||||
set { return; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public override int VehicleType
|
|
||||||
{
|
|
||||||
get { return 0; }
|
|
||||||
set { return; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void VehicleFloatParam(int param, float value)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void VehicleVectorParam(int param, Vector3 value)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void VehicleRotationParam(int param, Quaternion rotation)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void VehicleFlags(int param, bool remove)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void SetVolumeDetect(int param)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public override Vector3 CenterOfMass
|
|
||||||
{
|
|
||||||
get { return Vector3.Zero; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public override Vector3 GeometricCenter
|
|
||||||
{
|
|
||||||
get { return Vector3.Zero; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public override Vector3 Velocity
|
|
||||||
{
|
|
||||||
get { return _velocity; }
|
|
||||||
set { _velocity = value; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public override float CollisionScore
|
|
||||||
{
|
|
||||||
get { return 0f; }
|
|
||||||
set { }
|
|
||||||
}
|
|
||||||
|
|
||||||
public override bool Kinematic
|
|
||||||
{
|
|
||||||
get { return false; }
|
|
||||||
set { }
|
|
||||||
}
|
|
||||||
|
|
||||||
public override Quaternion Orientation
|
|
||||||
{
|
|
||||||
get { return Quaternion.Identity; }
|
|
||||||
set { }
|
|
||||||
}
|
|
||||||
|
|
||||||
public override Vector3 Acceleration
|
|
||||||
{
|
|
||||||
get { return _acceleration; }
|
|
||||||
set { _acceleration = value; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void AddForce(Vector3 force, bool pushforce)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public override Vector3 Torque
|
|
||||||
{
|
|
||||||
get { return Vector3.Zero; }
|
|
||||||
set { return; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void AddAngularForce(Vector3 force, bool pushforce)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void link(PhysicsActor obj)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void delink()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void LockAngularMotion(Vector3 axis)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void SetMomentum(Vector3 momentum)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Move(float timeStep)
|
|
||||||
{
|
|
||||||
Vec3 vec = new Vec3();
|
|
||||||
vec.X = _velocity.X*timeStep;
|
|
||||||
vec.Y = _velocity.Y*timeStep;
|
|
||||||
if (flying)
|
|
||||||
{
|
|
||||||
vec.Z = (_velocity.Z)*timeStep;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
gravityAccel += -9.8f;
|
|
||||||
vec.Z = (gravityAccel + _velocity.Z)*timeStep;
|
|
||||||
}
|
|
||||||
int res = _character.Move(vec);
|
|
||||||
if (res == 1)
|
|
||||||
{
|
|
||||||
gravityAccel = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public override PrimitiveBaseShape Shape
|
|
||||||
{
|
|
||||||
set { return; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public void UpdatePosition()
|
|
||||||
{
|
|
||||||
Vec3 vec = _character.Position;
|
|
||||||
_position.X = vec.X;
|
|
||||||
_position.Y = vec.Y;
|
|
||||||
_position.Z = vec.Z;
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void CrossingFailure()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public override Vector3 PIDTarget { set { return; } }
|
|
||||||
public override bool PIDActive { set { return; } }
|
|
||||||
public override float PIDTau { set { return; } }
|
|
||||||
|
|
||||||
public override float PIDHoverHeight { set { return; } }
|
|
||||||
public override bool PIDHoverActive { set { return; } }
|
|
||||||
public override PIDHoverType PIDHoverType { set { return; } }
|
|
||||||
public override float PIDHoverTau { set { return; } }
|
|
||||||
|
|
||||||
public override Quaternion APIDTarget
|
|
||||||
{
|
|
||||||
set { return; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public override bool APIDActive
|
|
||||||
{
|
|
||||||
set { return; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public override float APIDStrength
|
|
||||||
{
|
|
||||||
set { return; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public override float APIDDamping
|
|
||||||
{
|
|
||||||
set { return; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void SubscribeEvents(int ms)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
public override void UnSubscribeEvents()
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
public override bool SubscribedEvents()
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue