Merge branch 'bigmerge' of ssh://3dhosting.de/var/git/careminster into bigmerge
commit
1c2b5d99c9
|
@ -8,6 +8,7 @@
|
|||
<target name="distbin">
|
||||
<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/FlotsamCache.ini.example" tofile="bin/config-include/FlotsamCache.ini"/>
|
||||
<delete dir="${distbindir}"/>
|
||||
<copy todir="${distbindir}">
|
||||
<fileset>
|
||||
|
|
|
@ -5,7 +5,7 @@ for your effort!)
|
|||
These folks represent the current core team for OpenSim, and are the
|
||||
people that make the day to day of OpenSim happen.
|
||||
|
||||
* justincc
|
||||
* justincc (OSVW Consulting, justincc.org)
|
||||
* chi11ken (Genkii)
|
||||
* dahlia
|
||||
* Melanie Thielker
|
||||
|
@ -15,6 +15,7 @@ people that make the day to day of OpenSim happen.
|
|||
* Mic Bowman (Intel)
|
||||
* BlueWall (James Hughes)
|
||||
* Snoopy Pfeffer
|
||||
* Richard Adams (Intel)
|
||||
|
||||
= Core Developers Following the White Rabbit =
|
||||
Core developers who have temporarily (we hope) gone chasing the white rabbit.
|
||||
|
@ -119,6 +120,7 @@ what it is today.
|
|||
* openlifegrid.com
|
||||
* Oren Hurvitz (Kitely)
|
||||
* otakup0pe
|
||||
* Pixel Tomsen
|
||||
* ralphos
|
||||
* RemedyTomm
|
||||
* Revolution
|
||||
|
|
|
@ -186,35 +186,5 @@ namespace OpenSim.ApplicationPlugins.LoadRegions
|
|||
|
||||
return true;
|
||||
}
|
||||
|
||||
public void LoadRegionFromConfig(OpenSimBase openSim, ulong regionhandle)
|
||||
{
|
||||
m_log.Info("[LOADREGIONS]: Load Regions addin being initialised");
|
||||
|
||||
IRegionLoader regionLoader;
|
||||
if (openSim.ConfigSource.Source.Configs["Startup"].GetString("region_info_source", "filesystem") == "filesystem")
|
||||
{
|
||||
m_log.Info("[LOADREGIONS]: Loading Region Info from filesystem");
|
||||
regionLoader = new RegionLoaderFileSystem();
|
||||
}
|
||||
else
|
||||
{
|
||||
m_log.Info("[LOADREGIONS]: Loading Region Info from web");
|
||||
regionLoader = new RegionLoaderWebServer();
|
||||
}
|
||||
|
||||
regionLoader.SetIniConfigSource(openSim.ConfigSource.Source);
|
||||
RegionInfo[] regionsToLoad = regionLoader.LoadRegions();
|
||||
for (int i = 0; i < regionsToLoad.Length; i++)
|
||||
{
|
||||
if (regionhandle == regionsToLoad[i].RegionHandle)
|
||||
{
|
||||
IScene scene;
|
||||
m_log.Debug("[LOADREGIONS]: Creating Region: " + regionsToLoad[i].RegionName + " (ThreadID: " +
|
||||
Thread.CurrentThread.ManagedThreadId.ToString() + ")");
|
||||
openSim.CreateRegion(regionsToLoad[i], true, out scene);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -844,21 +844,30 @@ namespace OpenSim.ApplicationPlugins.RemoteController
|
|||
}
|
||||
|
||||
// Create a new estate with the name provided
|
||||
region.EstateSettings = m_application.EstateDataService.LoadEstateSettings(region.RegionID, true);
|
||||
region.EstateSettings = m_application.EstateDataService.CreateNewEstate();
|
||||
|
||||
region.EstateSettings.EstateName = (string) requestData["estate_name"];
|
||||
region.EstateSettings.EstateOwner = userID;
|
||||
// Persistence does not seem to effect the need to save a new estate
|
||||
region.EstateSettings.Save();
|
||||
|
||||
if (!m_application.EstateDataService.LinkRegion(region.RegionID, (int) region.EstateSettings.EstateID))
|
||||
throw new Exception("Failed to join estate.");
|
||||
}
|
||||
else
|
||||
{
|
||||
int estateID = estateIDs[0];
|
||||
|
||||
region.EstateSettings = m_application.EstateDataService.LoadEstateSettings(estateID);
|
||||
region.EstateSettings = m_application.EstateDataService.LoadEstateSettings(region.RegionID, false);
|
||||
|
||||
if (!m_application.EstateDataService.LinkRegion(region.RegionID, estateID))
|
||||
throw new Exception("Failed to join estate.");
|
||||
if (region.EstateSettings.EstateID != estateID)
|
||||
{
|
||||
// The region is already part of an estate, but not the one we want.
|
||||
region.EstateSettings = m_application.EstateDataService.LoadEstateSettings(estateID);
|
||||
|
||||
if (!m_application.EstateDataService.LinkRegion(region.RegionID, estateID))
|
||||
throw new Exception("Failed to join estate.");
|
||||
}
|
||||
}
|
||||
|
||||
// Create the region and perform any initial initialization
|
||||
|
@ -2434,10 +2443,12 @@ namespace OpenSim.ApplicationPlugins.RemoteController
|
|||
/// <description>UUID of the region</description></item>
|
||||
/// <item><term>region_name</term>
|
||||
/// <description>region name</description></item>
|
||||
/// <item><term>profile</term>
|
||||
/// <item><term>profile</term>
|
||||
/// <description>profile url</description></item>
|
||||
/// <item><term>noassets</term>
|
||||
/// <description>true if no assets should be saved</description></item>
|
||||
/// <item><term>perm</term>
|
||||
/// <description>C and/or T</description></item>
|
||||
/// </list>
|
||||
///
|
||||
/// <code>region_uuid</code> takes precedence over
|
||||
|
@ -2512,6 +2523,11 @@ namespace OpenSim.ApplicationPlugins.RemoteController
|
|||
options["noassets"] = (string)requestData["noassets"] ;
|
||||
}
|
||||
|
||||
if (requestData.Contains("perm"))
|
||||
{
|
||||
options["checkPermissions"] = (string)requestData["perm"];
|
||||
}
|
||||
|
||||
IRegionArchiverModule archiver = scene.RequestModuleInterface<IRegionArchiverModule>();
|
||||
|
||||
if (archiver != null)
|
||||
|
|
|
@ -169,7 +169,7 @@ namespace OpenSim.ApplicationPlugins.Rest.Inventory.Tests
|
|||
float y = Convert.ToSingle(rdata.Parameters[PARM_MOVE_Y]);
|
||||
float z = Convert.ToSingle(rdata.Parameters[PARM_MOVE_Z]);
|
||||
Vector3 vector = new Vector3(x, y, z);
|
||||
presence.MoveToTarget(vector, false);
|
||||
presence.MoveToTarget(vector, false, false);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
|
|
|
@ -148,55 +148,10 @@ namespace OpenSim.Data.MSSQL
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
if (insertEstate && create)
|
||||
{
|
||||
List<string> names = new List<string>(FieldList);
|
||||
|
||||
names.Remove("EstateID");
|
||||
|
||||
sql = string.Format("insert into estate_settings ({0}) values ( @{1})", String.Join(",", names.ToArray()), String.Join(", @", names.ToArray()));
|
||||
|
||||
//_Log.Debug("[DB ESTATE]: SQL: " + sql);
|
||||
using (SqlConnection conn = new SqlConnection(m_connectionString))
|
||||
using (SqlCommand insertCommand = new SqlCommand(sql, conn))
|
||||
{
|
||||
insertCommand.CommandText = sql + " SET @ID = SCOPE_IDENTITY()";
|
||||
|
||||
foreach (string name in names)
|
||||
{
|
||||
insertCommand.Parameters.Add(_Database.CreateParameter("@" + name, _FieldMap[name].GetValue(es)));
|
||||
}
|
||||
SqlParameter idParameter = new SqlParameter("@ID", SqlDbType.Int);
|
||||
idParameter.Direction = ParameterDirection.Output;
|
||||
insertCommand.Parameters.Add(idParameter);
|
||||
conn.Open();
|
||||
insertCommand.ExecuteNonQuery();
|
||||
|
||||
es.EstateID = Convert.ToUInt32(idParameter.Value);
|
||||
}
|
||||
|
||||
sql = "INSERT INTO [estate_map] ([RegionID] ,[EstateID]) VALUES (@RegionID, @EstateID)";
|
||||
using (SqlConnection conn = new SqlConnection(m_connectionString))
|
||||
using (SqlCommand cmd = new SqlCommand(sql, conn))
|
||||
{
|
||||
|
||||
cmd.Parameters.Add(_Database.CreateParameter("@RegionID", regionID));
|
||||
cmd.Parameters.Add(_Database.CreateParameter("@EstateID", es.EstateID));
|
||||
// This will throw on dupe key
|
||||
try
|
||||
{
|
||||
conn.Open();
|
||||
cmd.ExecuteNonQuery();
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
m_log.DebugFormat("[ESTATE DB]: Error inserting regionID and EstateID in estate_map: {0}", e);
|
||||
}
|
||||
}
|
||||
|
||||
//TODO check if this is needed??
|
||||
es.Save();
|
||||
DoCreate(es);
|
||||
LinkRegion(regionID, (int)es.EstateID);
|
||||
}
|
||||
|
||||
LoadBanList(es);
|
||||
|
@ -210,6 +165,53 @@ namespace OpenSim.Data.MSSQL
|
|||
return es;
|
||||
}
|
||||
|
||||
public EstateSettings CreateNewEstate()
|
||||
{
|
||||
EstateSettings es = new EstateSettings();
|
||||
es.OnSave += StoreEstateSettings;
|
||||
|
||||
DoCreate(es);
|
||||
|
||||
LoadBanList(es);
|
||||
|
||||
es.EstateManagers = LoadUUIDList(es.EstateID, "estate_managers");
|
||||
es.EstateAccess = LoadUUIDList(es.EstateID, "estate_users");
|
||||
es.EstateGroups = LoadUUIDList(es.EstateID, "estate_groups");
|
||||
|
||||
return es;
|
||||
}
|
||||
|
||||
private void DoCreate(EstateSettings es)
|
||||
{
|
||||
List<string> names = new List<string>(FieldList);
|
||||
|
||||
names.Remove("EstateID");
|
||||
|
||||
string sql = string.Format("insert into estate_settings ({0}) values ( @{1})", String.Join(",", names.ToArray()), String.Join(", @", names.ToArray()));
|
||||
|
||||
//_Log.Debug("[DB ESTATE]: SQL: " + sql);
|
||||
using (SqlConnection conn = new SqlConnection(m_connectionString))
|
||||
using (SqlCommand insertCommand = new SqlCommand(sql, conn))
|
||||
{
|
||||
insertCommand.CommandText = sql + " SET @ID = SCOPE_IDENTITY()";
|
||||
|
||||
foreach (string name in names)
|
||||
{
|
||||
insertCommand.Parameters.Add(_Database.CreateParameter("@" + name, _FieldMap[name].GetValue(es)));
|
||||
}
|
||||
SqlParameter idParameter = new SqlParameter("@ID", SqlDbType.Int);
|
||||
idParameter.Direction = ParameterDirection.Output;
|
||||
insertCommand.Parameters.Add(idParameter);
|
||||
conn.Open();
|
||||
insertCommand.ExecuteNonQuery();
|
||||
|
||||
es.EstateID = Convert.ToUInt32(idParameter.Value);
|
||||
}
|
||||
|
||||
//TODO check if this is needed??
|
||||
es.Save();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Stores the estate settings.
|
||||
/// </summary>
|
||||
|
@ -498,24 +500,43 @@ namespace OpenSim.Data.MSSQL
|
|||
|
||||
public bool LinkRegion(UUID regionID, int estateID)
|
||||
{
|
||||
string sql = "insert into estate_map values (@RegionID, @EstateID)";
|
||||
string deleteSQL = "delete from estate_map where RegionID = @RegionID";
|
||||
string insertSQL = "insert into estate_map values (@RegionID, @EstateID)";
|
||||
using (SqlConnection conn = new SqlConnection(m_connectionString))
|
||||
{
|
||||
conn.Open();
|
||||
SqlTransaction transaction = conn.BeginTransaction();
|
||||
|
||||
try
|
||||
{
|
||||
using (SqlCommand cmd = new SqlCommand(sql, conn))
|
||||
using (SqlCommand cmd = new SqlCommand(deleteSQL, conn))
|
||||
{
|
||||
cmd.Parameters.AddWithValue("@RegionID", regionID);
|
||||
cmd.Transaction = transaction;
|
||||
cmd.Parameters.AddWithValue("@RegionID", regionID.Guid);
|
||||
|
||||
cmd.ExecuteNonQuery();
|
||||
}
|
||||
|
||||
using (SqlCommand cmd = new SqlCommand(insertSQL, conn))
|
||||
{
|
||||
cmd.Transaction = transaction;
|
||||
cmd.Parameters.AddWithValue("@RegionID", regionID.Guid);
|
||||
cmd.Parameters.AddWithValue("@EstateID", estateID);
|
||||
|
||||
int ret = cmd.ExecuteNonQuery();
|
||||
|
||||
if (ret != 0)
|
||||
transaction.Commit();
|
||||
else
|
||||
transaction.Rollback();
|
||||
|
||||
return (ret != 0);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
m_log.Error("[REGION DB]: LinkRegion failed: " + ex.Message);
|
||||
transaction.Rollback();
|
||||
}
|
||||
}
|
||||
return false;
|
||||
|
|
|
@ -218,23 +218,27 @@ namespace OpenSim.Data.MSSQL
|
|||
if (words.Length > 2)
|
||||
return new UserAccountData[0];
|
||||
|
||||
string sql = "";
|
||||
|
||||
using (SqlConnection conn = new SqlConnection(m_ConnectionString))
|
||||
using (SqlCommand cmd = new SqlCommand())
|
||||
{
|
||||
if (words.Length == 1)
|
||||
{
|
||||
cmd.CommandText = String.Format("select * from {0} where ([ScopeID]=@ScopeID or [ScopeID]='00000000-0000-0000-0000-000000000000') and ([FirstName] like @search or [LastName] like @search)", m_Realm);
|
||||
sql = String.Format("select * from {0} where ([ScopeID]=@ScopeID or [ScopeID]='00000000-0000-0000-0000-000000000000') and ([FirstName] like @search or [LastName] like @search)", m_Realm);
|
||||
cmd.Parameters.Add(m_database.CreateParameter("@scopeID", scopeID));
|
||||
cmd.Parameters.Add(m_database.CreateParameter("@search", "%" + words[0] + "%"));
|
||||
cmd.Parameters.Add(m_database.CreateParameter("@search", "%" + words[0] + "%"));
|
||||
}
|
||||
else
|
||||
{
|
||||
cmd.CommandText = String.Format("select * from {0} where ([ScopeID]=@ScopeID or [ScopeID]='00000000-0000-0000-0000-000000000000') and ([FirstName] like @searchFirst or [LastName] like @searchLast)", m_Realm);
|
||||
cmd.Parameters.Add(m_database.CreateParameter("@searchFirst", "%" + words[0] + "%"));
|
||||
cmd.Parameters.Add(m_database.CreateParameter("@searchLast", "%" + words[1] + "%"));
|
||||
cmd.Parameters.Add(m_database.CreateParameter("@ScopeID", scopeID.ToString()));
|
||||
sql = String.Format("select * from {0} where ([ScopeID]=@ScopeID or [ScopeID]='00000000-0000-0000-0000-000000000000') and ([FirstName] like @searchFirst or [LastName] like @searchLast)", m_Realm);
|
||||
cmd.Parameters.Add(m_database.CreateParameter("@searchFirst", "%" + words[0] + "%"));
|
||||
cmd.Parameters.Add(m_database.CreateParameter("@searchLast", "%" + words[1] + "%"));
|
||||
cmd.Parameters.Add(m_database.CreateParameter("@ScopeID", scopeID.ToString()));
|
||||
}
|
||||
|
||||
cmd.Connection = conn;
|
||||
cmd.CommandText = sql;
|
||||
conn.Open();
|
||||
return DoQuery(cmd);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -20,3 +20,31 @@ INSERT INTO Friends (PrincipalID, Friend, Flags, Offered)
|
|||
SELECT [ownerID], [friendID], [friendPerms], 0 FROM userfriends;
|
||||
|
||||
COMMIT
|
||||
|
||||
:VERSION 3
|
||||
|
||||
BEGIN TRANSACTION
|
||||
|
||||
CREATE TABLE [Tmp_Friends]
|
||||
([PrincipalID] varchar(255) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000',
|
||||
[Friend] varchar(255) NOT NULL,
|
||||
[Flags] char(16) NOT NULL DEFAULT '0',
|
||||
[Offered] varchar(32) NOT NULL DEFAULT 0)
|
||||
ON [PRIMARY]
|
||||
|
||||
|
||||
IF EXISTS(SELECT * FROM dbo.Friends)
|
||||
EXEC('INSERT INTO dbo.Tmp_Friends (PrincipalID, Friend, Flags, Offered)
|
||||
SELECT CONVERT(varchar(255),PrincipalID), Friend, Flags, Offered FROM dbo.Friends WITH (HOLDLOCK TABLOCKX)')
|
||||
|
||||
DROP TABLE dbo.Friends
|
||||
|
||||
EXECUTE sp_rename N'dbo.Tmp_Friends', N'Friends', 'OBJECT'
|
||||
|
||||
ALTER TABLE dbo.Friends ADD
|
||||
PRIMARY KEY CLUSTERED
|
||||
(
|
||||
[PrincipalID] ASC, [Friend] ASC
|
||||
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
|
||||
|
||||
COMMIT
|
|
@ -245,3 +245,35 @@ ADD CONSTRAINT DF_inventoryitems_creatorID
|
|||
DEFAULT '00000000-0000-0000-0000-000000000000' FOR creatorID
|
||||
|
||||
:GO
|
||||
|
||||
:VERSION 9
|
||||
|
||||
BEGIN TRANSACTION
|
||||
|
||||
# CreatorID goes up to VARCHAR(255)
|
||||
|
||||
exec sp_rename 'inventoryitems.CreatorID', 'cr_old', 'COLUMN'
|
||||
|
||||
:GO
|
||||
|
||||
alter table inventoryitems
|
||||
add creatorID varchar(255) NULL
|
||||
|
||||
:GO
|
||||
|
||||
update inventoryitems set creatorID = cr_old
|
||||
|
||||
alter table inventoryitems
|
||||
drop CONSTRAINT DF_inventoryitems_creatorID
|
||||
:GO
|
||||
|
||||
alter table inventoryitems
|
||||
drop column cr_old
|
||||
:GO
|
||||
COMMIT
|
||||
|
||||
ALTER TABLE inventoryitems
|
||||
ADD CONSTRAINT DF_inventoryitems_creatorID
|
||||
DEFAULT '00000000-0000-0000-0000-000000000000' FOR creatorID
|
||||
|
||||
:GO
|
|
@ -1,23 +0,0 @@
|
|||
<Addin id="OpenSim.Data.MSSQL" version="0.1">
|
||||
<Runtime>
|
||||
<Import assembly="OpenSim.Data.MSSQL.dll"/>
|
||||
</Runtime>
|
||||
<Dependencies>
|
||||
<Addin id="OpenSim.Data" version="0.5" />
|
||||
</Dependencies>
|
||||
<Extension path = "/OpenSim/GridData">
|
||||
<Plugin id="MSSQLGridData" provider="OpenSim.Data.MSSQL.dll" type="OpenSim.Data.MSSQL.MSSQLGridData" />
|
||||
</Extension>
|
||||
<Extension path = "/OpenSim/LogData">
|
||||
<Plugin id="MSSQLLogData" provider="OpenSim.Data.MSSQL.dll" type="OpenSim.Data.MSSQL.MSSQLLogData" />
|
||||
</Extension>
|
||||
<Extension path = "/OpenSim/AssetData">
|
||||
<Plugin id="MSSQLAssetData" provider="OpenSim.Data.MSSQL.dll" type="OpenSim.Data.MSSQL.MSSQLAssetData" />
|
||||
</Extension>
|
||||
<Extension path = "/OpenSim/InventoryData">
|
||||
<Plugin id="MSSQLInventoryData" provider="OpenSim.Data.MSSQL.dll" type="OpenSim.Data.MSSQL.MSSQLInventoryData" />
|
||||
</Extension>
|
||||
<Extension path = "/OpenSim/UserData">
|
||||
<Plugin id="MSSQLUserData" provider="OpenSim.Data.MSSQL.dll" type="OpenSim.Data.MSSQL.MSSQLUserData" />
|
||||
</Extension>
|
||||
</Addin>
|
|
@ -149,6 +149,22 @@ namespace OpenSim.Data.MySQL
|
|||
}
|
||||
}
|
||||
|
||||
public EstateSettings CreateNewEstate()
|
||||
{
|
||||
EstateSettings es = new EstateSettings();
|
||||
es.OnSave += StoreEstateSettings;
|
||||
|
||||
DoCreate(es);
|
||||
|
||||
LoadBanList(es);
|
||||
|
||||
es.EstateManagers = LoadUUIDList(es.EstateID, "estate_managers");
|
||||
es.EstateAccess = LoadUUIDList(es.EstateID, "estate_users");
|
||||
es.EstateGroups = LoadUUIDList(es.EstateID, "estate_groups");
|
||||
|
||||
return es;
|
||||
}
|
||||
|
||||
private EstateSettings DoLoad(MySqlCommand cmd, UUID regionID, bool create)
|
||||
{
|
||||
EstateSettings es = new EstateSettings();
|
||||
|
@ -188,54 +204,8 @@ namespace OpenSim.Data.MySQL
|
|||
|
||||
if (!found && create)
|
||||
{
|
||||
// Migration case
|
||||
List<string> names = new List<string>(FieldList);
|
||||
|
||||
names.Remove("EstateID");
|
||||
|
||||
string sql = "insert into estate_settings (" + String.Join(",", names.ToArray()) + ") values ( ?" + String.Join(", ?", names.ToArray()) + ")";
|
||||
|
||||
using (MySqlCommand cmd2 = dbcon.CreateCommand())
|
||||
{
|
||||
cmd2.CommandText = sql;
|
||||
cmd2.Parameters.Clear();
|
||||
|
||||
foreach (string name in FieldList)
|
||||
{
|
||||
if (m_FieldMap[name].GetValue(es) is bool)
|
||||
{
|
||||
if ((bool)m_FieldMap[name].GetValue(es))
|
||||
cmd2.Parameters.AddWithValue("?" + name, "1");
|
||||
else
|
||||
cmd2.Parameters.AddWithValue("?" + name, "0");
|
||||
}
|
||||
else
|
||||
{
|
||||
cmd2.Parameters.AddWithValue("?" + name, m_FieldMap[name].GetValue(es).ToString());
|
||||
}
|
||||
}
|
||||
|
||||
cmd2.ExecuteNonQuery();
|
||||
|
||||
cmd2.CommandText = "select LAST_INSERT_ID() as id";
|
||||
cmd2.Parameters.Clear();
|
||||
|
||||
using (IDataReader r = cmd2.ExecuteReader())
|
||||
{
|
||||
r.Read();
|
||||
es.EstateID = Convert.ToUInt32(r["id"]);
|
||||
}
|
||||
|
||||
cmd2.CommandText = "insert into estate_map values (?RegionID, ?EstateID)";
|
||||
cmd2.Parameters.AddWithValue("?RegionID", regionID.ToString());
|
||||
cmd2.Parameters.AddWithValue("?EstateID", es.EstateID.ToString());
|
||||
|
||||
// This will throw on dupe key
|
||||
try { cmd2.ExecuteNonQuery(); }
|
||||
catch (Exception) { }
|
||||
|
||||
es.Save();
|
||||
}
|
||||
DoCreate(es);
|
||||
LinkRegion(regionID, (int)es.EstateID);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -247,6 +217,54 @@ namespace OpenSim.Data.MySQL
|
|||
return es;
|
||||
}
|
||||
|
||||
private void DoCreate(EstateSettings es)
|
||||
{
|
||||
// Migration case
|
||||
List<string> names = new List<string>(FieldList);
|
||||
|
||||
names.Remove("EstateID");
|
||||
|
||||
string sql = "insert into estate_settings (" + String.Join(",", names.ToArray()) + ") values ( ?" + String.Join(", ?", names.ToArray()) + ")";
|
||||
|
||||
using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
|
||||
{
|
||||
dbcon.Open();
|
||||
using (MySqlCommand cmd2 = dbcon.CreateCommand())
|
||||
{
|
||||
cmd2.CommandText = sql;
|
||||
cmd2.Parameters.Clear();
|
||||
|
||||
foreach (string name in FieldList)
|
||||
{
|
||||
if (m_FieldMap[name].GetValue(es) is bool)
|
||||
{
|
||||
if ((bool)m_FieldMap[name].GetValue(es))
|
||||
cmd2.Parameters.AddWithValue("?" + name, "1");
|
||||
else
|
||||
cmd2.Parameters.AddWithValue("?" + name, "0");
|
||||
}
|
||||
else
|
||||
{
|
||||
cmd2.Parameters.AddWithValue("?" + name, m_FieldMap[name].GetValue(es).ToString());
|
||||
}
|
||||
}
|
||||
|
||||
cmd2.ExecuteNonQuery();
|
||||
|
||||
cmd2.CommandText = "select LAST_INSERT_ID() as id";
|
||||
cmd2.Parameters.Clear();
|
||||
|
||||
using (IDataReader r = cmd2.ExecuteReader())
|
||||
{
|
||||
r.Read();
|
||||
es.EstateID = Convert.ToUInt32(r["id"]);
|
||||
}
|
||||
|
||||
es.Save();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void StoreEstateSettings(EstateSettings es)
|
||||
{
|
||||
string sql = "replace into estate_settings (" + String.Join(",", FieldList) + ") values ( ?" + String.Join(", ?", FieldList) + ")";
|
||||
|
@ -477,7 +495,6 @@ namespace OpenSim.Data.MySQL
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
dbcon.Close();
|
||||
}
|
||||
|
||||
|
@ -507,7 +524,6 @@ namespace OpenSim.Data.MySQL
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
dbcon.Close();
|
||||
}
|
||||
|
||||
|
@ -519,16 +535,34 @@ namespace OpenSim.Data.MySQL
|
|||
using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
|
||||
{
|
||||
dbcon.Open();
|
||||
MySqlTransaction transaction = dbcon.BeginTransaction();
|
||||
|
||||
try
|
||||
{
|
||||
// Delete any existing association of this region with an estate.
|
||||
using (MySqlCommand cmd = dbcon.CreateCommand())
|
||||
{
|
||||
cmd.Transaction = transaction;
|
||||
cmd.CommandText = "delete from estate_map where RegionID = ?RegionID";
|
||||
cmd.Parameters.AddWithValue("?RegionID", regionID);
|
||||
|
||||
cmd.ExecuteNonQuery();
|
||||
}
|
||||
|
||||
using (MySqlCommand cmd = dbcon.CreateCommand())
|
||||
{
|
||||
cmd.Transaction = transaction;
|
||||
cmd.CommandText = "insert into estate_map values (?RegionID, ?EstateID)";
|
||||
cmd.Parameters.AddWithValue("?RegionID", regionID);
|
||||
cmd.Parameters.AddWithValue("?EstateID", estateID);
|
||||
|
||||
int ret = cmd.ExecuteNonQuery();
|
||||
|
||||
if (ret != 0)
|
||||
transaction.Commit();
|
||||
else
|
||||
transaction.Rollback();
|
||||
|
||||
dbcon.Close();
|
||||
|
||||
return (ret != 0);
|
||||
|
@ -537,6 +571,7 @@ namespace OpenSim.Data.MySQL
|
|||
catch (MySqlException ex)
|
||||
{
|
||||
m_log.Error("[REGION DB]: LinkRegion failed: " + ex.Message);
|
||||
transaction.Rollback();
|
||||
}
|
||||
|
||||
dbcon.Close();
|
||||
|
|
|
@ -1,23 +0,0 @@
|
|||
<Addin id="OpenSim.Data.MySQL" version="0.1">
|
||||
<Runtime>
|
||||
<Import assembly="OpenSim.Data.MySQL.dll"/>
|
||||
</Runtime>
|
||||
<Dependencies>
|
||||
<Addin id="OpenSim.Data" version="0.5" />
|
||||
</Dependencies>
|
||||
<Extension path = "/OpenSim/GridData">
|
||||
<Plugin id="MySQLGridData" provider="OpenSim.Data.MySQL.dll" type="OpenSim.Data.MySQL.MySQLGridData" />
|
||||
</Extension>
|
||||
<Extension path = "/OpenSim/LogData">
|
||||
<Plugin id="MySQLLogData" provider="OpenSim.Data.MySQL.dll" type="OpenSim.Data.MySQL.MySQLLogData" />
|
||||
</Extension>
|
||||
<Extension path = "/OpenSim/AssetData">
|
||||
<Plugin id="MySQLAssetData" provider="OpenSim.Data.MySQL.dll" type="OpenSim.Data.MySQL.MySQLAssetData" />
|
||||
</Extension>
|
||||
<Extension path = "/OpenSim/InventoryData">
|
||||
<Plugin id="MySQLInventoryData" provider="OpenSim.Data.MySQL.dll" type="OpenSim.Data.MySQL.MySQLInventoryData" />
|
||||
</Extension>
|
||||
<Extension path = "/OpenSim/UserData">
|
||||
<Plugin id="MySQLUserData" provider="OpenSim.Data.MySQL.dll" type="OpenSim.Data.MySQL.MySQLUserData" />
|
||||
</Extension>
|
||||
</Addin>
|
|
@ -85,6 +85,11 @@ namespace OpenSim.Data.Null
|
|||
return new EstateSettings();
|
||||
}
|
||||
|
||||
public EstateSettings CreateNewEstate()
|
||||
{
|
||||
return new EstateSettings();
|
||||
}
|
||||
|
||||
public List<EstateSettings> LoadEstateSettingsAll()
|
||||
{
|
||||
List<EstateSettings> allEstateSettings = new List<EstateSettings>();
|
||||
|
|
|
@ -78,7 +78,9 @@ namespace OpenSim.Data.Null
|
|||
|
||||
public RegionSettings LoadRegionSettings(UUID regionUUID)
|
||||
{
|
||||
return null;
|
||||
RegionSettings rs = new RegionSettings();
|
||||
rs.RegionUUID = regionUUID;
|
||||
return rs;
|
||||
}
|
||||
|
||||
public void StoreObject(SceneObjectGroup obj, UUID regionUUID)
|
||||
|
|
|
@ -1,20 +0,0 @@
|
|||
<Addin id="OpenSim.Data.SQLite" version="0.1">
|
||||
<Runtime>
|
||||
<Import assembly="OpenSim.Data.SQLite.dll"/>
|
||||
</Runtime>
|
||||
<Dependencies>
|
||||
<Addin id="OpenSim.Data" version="0.5" />
|
||||
</Dependencies>
|
||||
<Extension path = "/OpenSim/GridData">
|
||||
<Plugin id="SQLiteGridData" provider="OpenSim.Data.SQLite.dll" type="OpenSim.Data.SQLite.SQLiteGridData" />
|
||||
</Extension>
|
||||
<Extension path = "/OpenSim/AssetData">
|
||||
<Plugin id="SQLiteAssetData" provider="OpenSim.Data.SQLite.dll" type="OpenSim.Data.SQLite.SQLiteAssetData" />
|
||||
</Extension>
|
||||
<Extension path = "/OpenSim/InventoryData">
|
||||
<Plugin id="SQLiteInventoryData" provider="OpenSim.Data.SQLite.dll" type="OpenSim.Data.SQLite.SQLiteInventoryStore" />
|
||||
</Extension>
|
||||
<Extension path = "/OpenSim/UserData">
|
||||
<Plugin id="SQLiteUserData" provider="OpenSim.Data.SQLite.dll" type="OpenSim.Data.SQLite.SQLiteUserData" />
|
||||
</Extension>
|
||||
</Addin>
|
|
@ -151,59 +151,8 @@ namespace OpenSim.Data.SQLite
|
|||
}
|
||||
else if (create)
|
||||
{
|
||||
r.Close();
|
||||
|
||||
List<string> names = new List<string>(FieldList);
|
||||
|
||||
names.Remove("EstateID");
|
||||
|
||||
string sql = "insert into estate_settings ("+String.Join(",", names.ToArray())+") values ( :"+String.Join(", :", names.ToArray())+")";
|
||||
|
||||
cmd.CommandText = sql;
|
||||
cmd.Parameters.Clear();
|
||||
|
||||
foreach (string name in FieldList)
|
||||
{
|
||||
if (m_FieldMap[name].GetValue(es) is bool)
|
||||
{
|
||||
if ((bool)m_FieldMap[name].GetValue(es))
|
||||
cmd.Parameters.AddWithValue(":"+name, "1");
|
||||
else
|
||||
cmd.Parameters.AddWithValue(":"+name, "0");
|
||||
}
|
||||
else
|
||||
{
|
||||
cmd.Parameters.AddWithValue(":"+name, m_FieldMap[name].GetValue(es).ToString());
|
||||
}
|
||||
}
|
||||
|
||||
cmd.ExecuteNonQuery();
|
||||
|
||||
cmd.CommandText = "select LAST_INSERT_ROWID() as id";
|
||||
cmd.Parameters.Clear();
|
||||
|
||||
r = cmd.ExecuteReader();
|
||||
|
||||
r.Read();
|
||||
|
||||
es.EstateID = Convert.ToUInt32(r["id"]);
|
||||
|
||||
r.Close();
|
||||
|
||||
cmd.CommandText = "insert into estate_map values (:RegionID, :EstateID)";
|
||||
cmd.Parameters.AddWithValue(":RegionID", regionID.ToString());
|
||||
cmd.Parameters.AddWithValue(":EstateID", es.EstateID.ToString());
|
||||
|
||||
// This will throw on dupe key
|
||||
try
|
||||
{
|
||||
cmd.ExecuteNonQuery();
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
}
|
||||
|
||||
es.Save();
|
||||
DoCreate(es);
|
||||
LinkRegion(regionID, (int)es.EstateID);
|
||||
}
|
||||
|
||||
LoadBanList(es);
|
||||
|
@ -214,6 +163,67 @@ namespace OpenSim.Data.SQLite
|
|||
return es;
|
||||
}
|
||||
|
||||
public EstateSettings CreateNewEstate()
|
||||
{
|
||||
EstateSettings es = new EstateSettings();
|
||||
es.OnSave += StoreEstateSettings;
|
||||
|
||||
DoCreate(es);
|
||||
|
||||
LoadBanList(es);
|
||||
|
||||
es.EstateManagers = LoadUUIDList(es.EstateID, "estate_managers");
|
||||
es.EstateAccess = LoadUUIDList(es.EstateID, "estate_users");
|
||||
es.EstateGroups = LoadUUIDList(es.EstateID, "estate_groups");
|
||||
|
||||
return es;
|
||||
}
|
||||
|
||||
private void DoCreate(EstateSettings es)
|
||||
{
|
||||
List<string> names = new List<string>(FieldList);
|
||||
|
||||
SqliteCommand cmd = (SqliteCommand)m_connection.CreateCommand();
|
||||
IDataReader r = null;
|
||||
|
||||
names.Remove("EstateID");
|
||||
|
||||
string sql = "insert into estate_settings ("+String.Join(",", names.ToArray())+") values ( :"+String.Join(", :", names.ToArray())+")";
|
||||
|
||||
cmd.CommandText = sql;
|
||||
cmd.Parameters.Clear();
|
||||
|
||||
foreach (string name in FieldList)
|
||||
{
|
||||
if (m_FieldMap[name].GetValue(es) is bool)
|
||||
{
|
||||
if ((bool)m_FieldMap[name].GetValue(es))
|
||||
cmd.Parameters.AddWithValue(":"+name, "1");
|
||||
else
|
||||
cmd.Parameters.AddWithValue(":"+name, "0");
|
||||
}
|
||||
else
|
||||
{
|
||||
cmd.Parameters.AddWithValue(":"+name, m_FieldMap[name].GetValue(es).ToString());
|
||||
}
|
||||
}
|
||||
|
||||
cmd.ExecuteNonQuery();
|
||||
|
||||
cmd.CommandText = "select LAST_INSERT_ROWID() as id";
|
||||
cmd.Parameters.Clear();
|
||||
|
||||
r = cmd.ExecuteReader();
|
||||
|
||||
r.Read();
|
||||
|
||||
es.EstateID = Convert.ToUInt32(r["id"]);
|
||||
|
||||
r.Close();
|
||||
|
||||
es.Save();
|
||||
}
|
||||
|
||||
public void StoreEstateSettings(EstateSettings es)
|
||||
{
|
||||
List<string> fields = new List<string>(FieldList);
|
||||
|
@ -440,16 +450,36 @@ namespace OpenSim.Data.SQLite
|
|||
|
||||
public bool LinkRegion(UUID regionID, int estateID)
|
||||
{
|
||||
SqliteCommand cmd = (SqliteCommand)m_connection.CreateCommand();
|
||||
SqliteTransaction transaction = m_connection.BeginTransaction();
|
||||
|
||||
cmd.CommandText = "insert into estate_map values (:RegionID, :EstateID)";
|
||||
cmd.Parameters.AddWithValue(":RegionID", regionID.ToString());
|
||||
cmd.Parameters.AddWithValue(":EstateID", estateID.ToString());
|
||||
// Delete any existing estate mapping for this region.
|
||||
using(SqliteCommand cmd = (SqliteCommand)m_connection.CreateCommand())
|
||||
{
|
||||
cmd.CommandText = "delete from estate_map where RegionID = :RegionID";
|
||||
cmd.Transaction = transaction;
|
||||
cmd.Parameters.AddWithValue(":RegionID", regionID.ToString());
|
||||
|
||||
if (cmd.ExecuteNonQuery() == 0)
|
||||
return false;
|
||||
cmd.ExecuteNonQuery();
|
||||
}
|
||||
|
||||
return true;
|
||||
using(SqliteCommand cmd = (SqliteCommand)m_connection.CreateCommand())
|
||||
{
|
||||
cmd.CommandText = "insert into estate_map values (:RegionID, :EstateID)";
|
||||
cmd.Transaction = transaction;
|
||||
cmd.Parameters.AddWithValue(":RegionID", regionID.ToString());
|
||||
cmd.Parameters.AddWithValue(":EstateID", estateID.ToString());
|
||||
|
||||
if (cmd.ExecuteNonQuery() == 0)
|
||||
{
|
||||
transaction.Rollback();
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
transaction.Commit();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public List<UUID> GetRegions(int estateID)
|
||||
|
|
|
@ -169,6 +169,7 @@ namespace OpenSim.Framework
|
|||
get { return m_metadata.FullID; }
|
||||
set { m_metadata.FullID = value; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Asset MetaData ID (transferring from UUID to string ID)
|
||||
/// </summary>
|
||||
|
|
|
@ -225,6 +225,8 @@ namespace OpenSim.Framework
|
|||
/// </summary>
|
||||
public virtual void ResetAppearance()
|
||||
{
|
||||
// m_log.WarnFormat("[AVATAR APPEARANCE]: Reset appearance");
|
||||
|
||||
m_serial = 0;
|
||||
|
||||
SetDefaultTexture();
|
||||
|
|
|
@ -46,12 +46,11 @@ namespace OpenSim.Framework.Console
|
|||
// private readonly object m_syncRoot = new object();
|
||||
private const string LOGLEVEL_NONE = "(none)";
|
||||
|
||||
private int y = -1;
|
||||
private int cp = 0;
|
||||
private int h = 1;
|
||||
private StringBuilder cmdline = new StringBuilder();
|
||||
private bool echo = true;
|
||||
private List<string> history = new List<string>();
|
||||
private int m_cursorYPosition = -1;
|
||||
private int m_cursorXPosition = 0;
|
||||
private StringBuilder m_commandLine = new StringBuilder();
|
||||
private bool m_echo = true;
|
||||
private List<string> m_history = new List<string>();
|
||||
|
||||
private static readonly ConsoleColor[] Colors = {
|
||||
// the dark colors don't seem to be visible on some black background terminals like putty :(
|
||||
|
@ -81,10 +80,10 @@ namespace OpenSim.Framework.Console
|
|||
|
||||
private void AddToHistory(string text)
|
||||
{
|
||||
while (history.Count >= 100)
|
||||
history.RemoveAt(0);
|
||||
while (m_history.Count >= 100)
|
||||
m_history.RemoveAt(0);
|
||||
|
||||
history.Add(text);
|
||||
m_history.Add(text);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -111,11 +110,11 @@ namespace OpenSim.Framework.Console
|
|||
}
|
||||
else
|
||||
{
|
||||
int bw = System.Console.BufferWidth;
|
||||
int bufferWidth = System.Console.BufferWidth;
|
||||
|
||||
// On Mono 2.4.2.3 (and possibly above), the buffer value is sometimes erroneously zero (Mantis 4657)
|
||||
if (bw > 0 && left >= bw)
|
||||
System.Console.CursorLeft = bw - 1;
|
||||
if (bufferWidth > 0 && left >= bufferWidth)
|
||||
System.Console.CursorLeft = bufferWidth - 1;
|
||||
}
|
||||
|
||||
if (top < 0)
|
||||
|
@ -124,11 +123,11 @@ namespace OpenSim.Framework.Console
|
|||
}
|
||||
else
|
||||
{
|
||||
int bh = System.Console.BufferHeight;
|
||||
int bufferHeight = System.Console.BufferHeight;
|
||||
|
||||
// On Mono 2.4.2.3 (and possibly above), the buffer value is sometimes erroneously zero (Mantis 4657)
|
||||
if (bh > 0 && top >= bh)
|
||||
top = bh - 1;
|
||||
if (bufferHeight > 0 && top >= bufferHeight)
|
||||
top = bufferHeight - 1;
|
||||
}
|
||||
|
||||
System.Console.CursorTop = top;
|
||||
|
@ -160,10 +159,10 @@ namespace OpenSim.Framework.Console
|
|||
}
|
||||
else
|
||||
{
|
||||
int bh = System.Console.BufferHeight;
|
||||
int bufferHeight = System.Console.BufferHeight;
|
||||
// On Mono 2.4.2.3 (and possibly above), the buffer value is sometimes erroneously zero (Mantis 4657)
|
||||
if (bh > 0 && top >= bh)
|
||||
System.Console.CursorTop = bh - 1;
|
||||
if (bufferHeight > 0 && top >= bufferHeight)
|
||||
System.Console.CursorTop = bufferHeight - 1;
|
||||
}
|
||||
|
||||
if (left < 0)
|
||||
|
@ -172,11 +171,11 @@ namespace OpenSim.Framework.Console
|
|||
}
|
||||
else
|
||||
{
|
||||
int bw = System.Console.BufferWidth;
|
||||
int bufferWidth = System.Console.BufferWidth;
|
||||
|
||||
// On Mono 2.4.2.3 (and possibly above), the buffer value is sometimes erroneously zero (Mantis 4657)
|
||||
if (bw > 0 && left >= bw)
|
||||
left = bw - 1;
|
||||
if (bufferWidth > 0 && left >= bufferWidth)
|
||||
left = bufferWidth - 1;
|
||||
}
|
||||
|
||||
System.Console.CursorLeft = left;
|
||||
|
@ -186,31 +185,30 @@ namespace OpenSim.Framework.Console
|
|||
|
||||
private void Show()
|
||||
{
|
||||
lock (cmdline)
|
||||
lock (m_commandLine)
|
||||
{
|
||||
if (y == -1 || System.Console.BufferWidth == 0)
|
||||
if (m_cursorYPosition == -1 || System.Console.BufferWidth == 0)
|
||||
return;
|
||||
|
||||
int xc = prompt.Length + cp;
|
||||
int xc = prompt.Length + m_cursorXPosition;
|
||||
int new_x = xc % System.Console.BufferWidth;
|
||||
int new_y = y + xc / System.Console.BufferWidth;
|
||||
int end_y = y + (cmdline.Length + prompt.Length) / System.Console.BufferWidth;
|
||||
if (end_y / System.Console.BufferWidth >= h)
|
||||
h++;
|
||||
int new_y = m_cursorYPosition + xc / System.Console.BufferWidth;
|
||||
int end_y = m_cursorYPosition + (m_commandLine.Length + prompt.Length) / System.Console.BufferWidth;
|
||||
|
||||
if (end_y >= System.Console.BufferHeight) // wrap
|
||||
{
|
||||
y--;
|
||||
m_cursorYPosition--;
|
||||
new_y--;
|
||||
SetCursorLeft(0);
|
||||
SetCursorTop(System.Console.BufferHeight - 1);
|
||||
System.Console.WriteLine(" ");
|
||||
}
|
||||
|
||||
y = SetCursorTop(y);
|
||||
m_cursorYPosition = SetCursorTop(m_cursorYPosition);
|
||||
SetCursorLeft(0);
|
||||
|
||||
if (echo)
|
||||
System.Console.Write("{0}{1}", prompt, cmdline);
|
||||
if (m_echo)
|
||||
System.Console.Write("{0}{1}", prompt, m_commandLine);
|
||||
else
|
||||
System.Console.Write("{0}", prompt);
|
||||
|
||||
|
@ -221,20 +219,20 @@ namespace OpenSim.Framework.Console
|
|||
|
||||
public override void LockOutput()
|
||||
{
|
||||
Monitor.Enter(cmdline);
|
||||
Monitor.Enter(m_commandLine);
|
||||
try
|
||||
{
|
||||
if (y != -1)
|
||||
if (m_cursorYPosition != -1)
|
||||
{
|
||||
y = SetCursorTop(y);
|
||||
m_cursorYPosition = SetCursorTop(m_cursorYPosition);
|
||||
System.Console.CursorLeft = 0;
|
||||
|
||||
int count = cmdline.Length + prompt.Length;
|
||||
int count = m_commandLine.Length + prompt.Length;
|
||||
|
||||
while (count-- > 0)
|
||||
System.Console.Write(" ");
|
||||
|
||||
y = SetCursorTop(y);
|
||||
m_cursorYPosition = SetCursorTop(m_cursorYPosition);
|
||||
SetCursorLeft(0);
|
||||
}
|
||||
}
|
||||
|
@ -245,12 +243,12 @@ namespace OpenSim.Framework.Console
|
|||
|
||||
public override void UnlockOutput()
|
||||
{
|
||||
if (y != -1)
|
||||
if (m_cursorYPosition != -1)
|
||||
{
|
||||
y = System.Console.CursorTop;
|
||||
m_cursorYPosition = System.Console.CursorTop;
|
||||
Show();
|
||||
}
|
||||
Monitor.Exit(cmdline);
|
||||
Monitor.Exit(m_commandLine);
|
||||
}
|
||||
|
||||
private void WriteColorText(ConsoleColor color, string sender)
|
||||
|
@ -317,29 +315,29 @@ namespace OpenSim.Framework.Console
|
|||
|
||||
public override void Output(string text, string level)
|
||||
{
|
||||
lock (cmdline)
|
||||
lock (m_commandLine)
|
||||
{
|
||||
if (y == -1)
|
||||
if (m_cursorYPosition == -1)
|
||||
{
|
||||
WriteLocalText(text, level);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
y = SetCursorTop(y);
|
||||
m_cursorYPosition = SetCursorTop(m_cursorYPosition);
|
||||
SetCursorLeft(0);
|
||||
|
||||
int count = cmdline.Length + prompt.Length;
|
||||
int count = m_commandLine.Length + prompt.Length;
|
||||
|
||||
while (count-- > 0)
|
||||
System.Console.Write(" ");
|
||||
|
||||
y = SetCursorTop(y);
|
||||
m_cursorYPosition = SetCursorTop(m_cursorYPosition);
|
||||
SetCursorLeft(0);
|
||||
|
||||
WriteLocalText(text, level);
|
||||
|
||||
y = System.Console.CursorTop;
|
||||
m_cursorYPosition = System.Console.CursorTop;
|
||||
|
||||
Show();
|
||||
}
|
||||
|
@ -347,9 +345,9 @@ namespace OpenSim.Framework.Console
|
|||
|
||||
private bool ContextHelp()
|
||||
{
|
||||
string[] words = Parser.Parse(cmdline.ToString());
|
||||
string[] words = Parser.Parse(m_commandLine.ToString());
|
||||
|
||||
bool trailingSpace = cmdline.ToString().EndsWith(" ");
|
||||
bool trailingSpace = m_commandLine.ToString().EndsWith(" ");
|
||||
|
||||
// Allow ? through while typing a URI
|
||||
//
|
||||
|
@ -368,19 +366,18 @@ namespace OpenSim.Framework.Console
|
|||
|
||||
public override string ReadLine(string p, bool isCommand, bool e)
|
||||
{
|
||||
h = 1;
|
||||
cp = 0;
|
||||
m_cursorXPosition = 0;
|
||||
prompt = p;
|
||||
echo = e;
|
||||
int historyLine = history.Count;
|
||||
m_echo = e;
|
||||
int historyLine = m_history.Count;
|
||||
|
||||
SetCursorLeft(0); // Needed for mono
|
||||
System.Console.Write(" "); // Needed for mono
|
||||
|
||||
lock (cmdline)
|
||||
lock (m_commandLine)
|
||||
{
|
||||
y = System.Console.CursorTop;
|
||||
cmdline.Remove(0, cmdline.Length);
|
||||
m_cursorYPosition = System.Console.CursorTop;
|
||||
m_commandLine.Remove(0, m_commandLine.Length);
|
||||
}
|
||||
|
||||
while (true)
|
||||
|
@ -388,92 +385,95 @@ namespace OpenSim.Framework.Console
|
|||
Show();
|
||||
|
||||
ConsoleKeyInfo key = System.Console.ReadKey(true);
|
||||
char c = key.KeyChar;
|
||||
char enteredChar = key.KeyChar;
|
||||
|
||||
if (!Char.IsControl(c))
|
||||
if (!Char.IsControl(enteredChar))
|
||||
{
|
||||
if (cp >= 318)
|
||||
if (m_cursorXPosition >= 318)
|
||||
continue;
|
||||
|
||||
if (c == '?' && isCommand)
|
||||
if (enteredChar == '?' && isCommand)
|
||||
{
|
||||
if (ContextHelp())
|
||||
continue;
|
||||
}
|
||||
|
||||
cmdline.Insert(cp, c);
|
||||
cp++;
|
||||
m_commandLine.Insert(m_cursorXPosition, enteredChar);
|
||||
m_cursorXPosition++;
|
||||
}
|
||||
else
|
||||
{
|
||||
switch (key.Key)
|
||||
{
|
||||
case ConsoleKey.Backspace:
|
||||
if (cp == 0)
|
||||
if (m_cursorXPosition == 0)
|
||||
break;
|
||||
cmdline.Remove(cp-1, 1);
|
||||
cp--;
|
||||
m_commandLine.Remove(m_cursorXPosition-1, 1);
|
||||
m_cursorXPosition--;
|
||||
|
||||
SetCursorLeft(0);
|
||||
y = SetCursorTop(y);
|
||||
m_cursorYPosition = SetCursorTop(m_cursorYPosition);
|
||||
|
||||
System.Console.Write("{0}{1} ", prompt, cmdline);
|
||||
if (m_echo)
|
||||
System.Console.Write("{0}{1} ", prompt, m_commandLine);
|
||||
else
|
||||
System.Console.Write("{0}", prompt);
|
||||
|
||||
break;
|
||||
case ConsoleKey.End:
|
||||
cp = cmdline.Length;
|
||||
m_cursorXPosition = m_commandLine.Length;
|
||||
break;
|
||||
case ConsoleKey.Home:
|
||||
cp = 0;
|
||||
m_cursorXPosition = 0;
|
||||
break;
|
||||
case ConsoleKey.UpArrow:
|
||||
if (historyLine < 1)
|
||||
break;
|
||||
historyLine--;
|
||||
LockOutput();
|
||||
cmdline.Remove(0, cmdline.Length);
|
||||
cmdline.Append(history[historyLine]);
|
||||
cp = cmdline.Length;
|
||||
m_commandLine.Remove(0, m_commandLine.Length);
|
||||
m_commandLine.Append(m_history[historyLine]);
|
||||
m_cursorXPosition = m_commandLine.Length;
|
||||
UnlockOutput();
|
||||
break;
|
||||
case ConsoleKey.DownArrow:
|
||||
if (historyLine >= history.Count)
|
||||
if (historyLine >= m_history.Count)
|
||||
break;
|
||||
historyLine++;
|
||||
LockOutput();
|
||||
if (historyLine == history.Count)
|
||||
if (historyLine == m_history.Count)
|
||||
{
|
||||
cmdline.Remove(0, cmdline.Length);
|
||||
m_commandLine.Remove(0, m_commandLine.Length);
|
||||
}
|
||||
else
|
||||
{
|
||||
cmdline.Remove(0, cmdline.Length);
|
||||
cmdline.Append(history[historyLine]);
|
||||
m_commandLine.Remove(0, m_commandLine.Length);
|
||||
m_commandLine.Append(m_history[historyLine]);
|
||||
}
|
||||
cp = cmdline.Length;
|
||||
m_cursorXPosition = m_commandLine.Length;
|
||||
UnlockOutput();
|
||||
break;
|
||||
case ConsoleKey.LeftArrow:
|
||||
if (cp > 0)
|
||||
cp--;
|
||||
if (m_cursorXPosition > 0)
|
||||
m_cursorXPosition--;
|
||||
break;
|
||||
case ConsoleKey.RightArrow:
|
||||
if (cp < cmdline.Length)
|
||||
cp++;
|
||||
if (m_cursorXPosition < m_commandLine.Length)
|
||||
m_cursorXPosition++;
|
||||
break;
|
||||
case ConsoleKey.Enter:
|
||||
SetCursorLeft(0);
|
||||
y = SetCursorTop(y);
|
||||
m_cursorYPosition = SetCursorTop(m_cursorYPosition);
|
||||
|
||||
System.Console.WriteLine();
|
||||
//Show();
|
||||
|
||||
lock (cmdline)
|
||||
lock (m_commandLine)
|
||||
{
|
||||
y = -1;
|
||||
m_cursorYPosition = -1;
|
||||
}
|
||||
|
||||
string commandLine = cmdline.ToString();
|
||||
string commandLine = m_commandLine.ToString();
|
||||
|
||||
if (isCommand)
|
||||
{
|
||||
|
@ -481,12 +481,12 @@ namespace OpenSim.Framework.Console
|
|||
|
||||
if (cmd.Length != 0)
|
||||
{
|
||||
int i;
|
||||
int index;
|
||||
|
||||
for (i=0 ; i < cmd.Length ; i++)
|
||||
for (index=0 ; index < cmd.Length ; index++)
|
||||
{
|
||||
if (cmd[i].Contains(" "))
|
||||
cmd[i] = "\"" + cmd[i] + "\"";
|
||||
if (cmd[index].Contains(" "))
|
||||
cmd[index] = "\"" + cmd[index] + "\"";
|
||||
}
|
||||
AddToHistory(String.Join(" ", cmd));
|
||||
return String.Empty;
|
||||
|
@ -494,7 +494,7 @@ namespace OpenSim.Framework.Console
|
|||
}
|
||||
|
||||
// If we're not echoing to screen (e.g. a password) then we probably don't want it in history
|
||||
if (echo && commandLine != "")
|
||||
if (m_echo && commandLine != "")
|
||||
AddToHistory(commandLine);
|
||||
|
||||
return commandLine;
|
||||
|
|
|
@ -53,8 +53,7 @@ namespace OpenSim.Framework
|
|||
|
||||
public delegate ISceneEntity RezSingleAttachmentFromInv(IClientAPI remoteClient, UUID itemID, uint AttachmentPt);
|
||||
|
||||
public delegate void RezMultipleAttachmentsFromInv(IClientAPI remoteClient, RezMultipleAttachmentsFromInvPacket.HeaderDataBlock header,
|
||||
RezMultipleAttachmentsFromInvPacket.ObjectDataBlock[] objects);
|
||||
public delegate void RezMultipleAttachmentsFromInv(IClientAPI remoteClient, List<KeyValuePair<UUID, uint>> rezlist );
|
||||
|
||||
public delegate void ObjectAttach(
|
||||
IClientAPI remoteClient, uint objectLocalID, uint AttachmentPt, bool silent);
|
||||
|
@ -940,7 +939,7 @@ namespace OpenSim.Framework
|
|||
event ScriptReset OnScriptReset;
|
||||
event GetScriptRunning OnGetScriptRunning;
|
||||
event SetScriptRunning OnSetScriptRunning;
|
||||
event Action<Vector3, bool> OnAutoPilotGo;
|
||||
event Action<Vector3, bool, bool> OnAutoPilotGo;
|
||||
|
||||
event TerrainUnacked OnUnackedTerrain;
|
||||
event ActivateGesture OnActivateGesture;
|
||||
|
|
|
@ -33,15 +33,12 @@ namespace OpenSim.Framework
|
|||
{
|
||||
public delegate void restart(RegionInfo thisRegion);
|
||||
|
||||
//public delegate void regionup (RegionInfo thisRegion);
|
||||
|
||||
public enum RegionStatus : int
|
||||
{
|
||||
Down = 0,
|
||||
Up = 1,
|
||||
Crashed = 2,
|
||||
Starting = 3,
|
||||
SlaveScene = 4
|
||||
};
|
||||
|
||||
/// <value>
|
||||
|
|
|
@ -48,11 +48,13 @@ namespace OpenSim.Framework.RegionLoader.Filesystem
|
|||
public RegionInfo[] LoadRegions()
|
||||
{
|
||||
string regionConfigPath = Path.Combine(Util.configDir(), "Regions");
|
||||
bool allowRegionless = false;
|
||||
|
||||
try
|
||||
{
|
||||
IConfig startupConfig = (IConfig)m_configSource.Configs["Startup"];
|
||||
regionConfigPath = startupConfig.GetString("regionload_regionsdir", regionConfigPath).Trim();
|
||||
allowRegionless = startupConfig.GetBoolean("allow_regionless", false);
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
|
@ -68,7 +70,7 @@ namespace OpenSim.Framework.RegionLoader.Filesystem
|
|||
string[] iniFiles = Directory.GetFiles(regionConfigPath, "*.ini");
|
||||
|
||||
// Create an empty Regions.ini if there are no existing config files.
|
||||
if (configFiles.Length == 0 && iniFiles.Length == 0)
|
||||
if (!allowRegionless && configFiles.Length == 0 && iniFiles.Length == 0)
|
||||
{
|
||||
new RegionInfo("DEFAULT REGION CONFIG", Path.Combine(regionConfigPath, "Regions.ini"), false, m_configSource);
|
||||
iniFiles = Directory.GetFiles(regionConfigPath, "*.ini");
|
||||
|
|
|
@ -60,6 +60,8 @@ namespace OpenSim.Framework.RegionLoader.Web
|
|||
{
|
||||
IConfig startupConfig = (IConfig) m_configSource.Configs["Startup"];
|
||||
string url = startupConfig.GetString("regionload_webserver_url", String.Empty).Trim();
|
||||
bool allowRegionless = startupConfig.GetBoolean("allow_regionless", false);
|
||||
|
||||
if (url == String.Empty)
|
||||
{
|
||||
m_log.Error("[WEBLOADER]: Unable to load webserver URL - URL was empty.");
|
||||
|
@ -67,39 +69,60 @@ namespace OpenSim.Framework.RegionLoader.Web
|
|||
}
|
||||
else
|
||||
{
|
||||
while (tries > 0)
|
||||
{
|
||||
HttpWebRequest webRequest = (HttpWebRequest) WebRequest.Create(url);
|
||||
webRequest.Timeout = 30000; //30 Second Timeout
|
||||
m_log.Debug("[WEBLOADER]: Sending Download Request...");
|
||||
HttpWebResponse webResponse = (HttpWebResponse) webRequest.GetResponse();
|
||||
m_log.Debug("[WEBLOADER]: Downloading Region Information From Remote Server...");
|
||||
StreamReader reader = new StreamReader(webResponse.GetResponseStream());
|
||||
string xmlSource = String.Empty;
|
||||
string tempStr = reader.ReadLine();
|
||||
while (tempStr != null)
|
||||
{
|
||||
xmlSource = xmlSource + tempStr;
|
||||
tempStr = reader.ReadLine();
|
||||
}
|
||||
m_log.Debug("[WEBLOADER]: Done downloading region information from server. Total Bytes: " +
|
||||
xmlSource.Length);
|
||||
XmlDocument xmlDoc = new XmlDocument();
|
||||
xmlDoc.LoadXml(xmlSource);
|
||||
if (xmlDoc.FirstChild.Name == "Regions")
|
||||
{
|
||||
RegionInfo[] regionInfos = new RegionInfo[xmlDoc.FirstChild.ChildNodes.Count];
|
||||
int i;
|
||||
for (i = 0; i < xmlDoc.FirstChild.ChildNodes.Count; i++)
|
||||
{
|
||||
m_log.Debug(xmlDoc.FirstChild.ChildNodes[i].OuterXml);
|
||||
regionInfos[i] =
|
||||
new RegionInfo("REGION CONFIG #" + (i + 1), xmlDoc.FirstChild.ChildNodes[i],false,m_configSource);
|
||||
}
|
||||
while(tries > 0)
|
||||
{
|
||||
RegionInfo[] regionInfos = new RegionInfo[] {};
|
||||
int regionCount = 0;
|
||||
HttpWebRequest webRequest = (HttpWebRequest) WebRequest.Create(url);
|
||||
webRequest.Timeout = 30000; //30 Second Timeout
|
||||
m_log.DebugFormat("[WEBLOADER]: Sending download request to {0}", url);
|
||||
|
||||
if (i > 0)
|
||||
return regionInfos;
|
||||
}
|
||||
try
|
||||
{
|
||||
HttpWebResponse webResponse = (HttpWebResponse) webRequest.GetResponse();
|
||||
m_log.Debug("[WEBLOADER]: Downloading region information...");
|
||||
StreamReader reader = new StreamReader(webResponse.GetResponseStream());
|
||||
string xmlSource = String.Empty;
|
||||
string tempStr = reader.ReadLine();
|
||||
while (tempStr != null)
|
||||
{
|
||||
xmlSource = xmlSource + tempStr;
|
||||
tempStr = reader.ReadLine();
|
||||
}
|
||||
m_log.Debug("[WEBLOADER]: Done downloading region information from server. Total Bytes: " +
|
||||
xmlSource.Length);
|
||||
XmlDocument xmlDoc = new XmlDocument();
|
||||
xmlDoc.LoadXml(xmlSource);
|
||||
if (xmlDoc.FirstChild.Name == "Regions")
|
||||
{
|
||||
regionCount = xmlDoc.FirstChild.ChildNodes.Count;
|
||||
|
||||
if (regionCount > 0)
|
||||
{
|
||||
regionInfos = new RegionInfo[regionCount];
|
||||
int i;
|
||||
for (i = 0; i < xmlDoc.FirstChild.ChildNodes.Count; i++)
|
||||
{
|
||||
m_log.Debug(xmlDoc.FirstChild.ChildNodes[i].OuterXml);
|
||||
regionInfos[i] =
|
||||
new RegionInfo("REGION CONFIG #" + (i + 1), xmlDoc.FirstChild.ChildNodes[i],false,m_configSource);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (WebException ex)
|
||||
{
|
||||
if (((HttpWebResponse)ex.Response).StatusCode == HttpStatusCode.NotFound)
|
||||
{
|
||||
if (!allowRegionless)
|
||||
throw ex;
|
||||
}
|
||||
else
|
||||
throw ex;
|
||||
}
|
||||
|
||||
if (regionCount > 0 | allowRegionless)
|
||||
return regionInfos;
|
||||
|
||||
m_log.Debug("[WEBLOADER]: Request yielded no regions.");
|
||||
tries--;
|
||||
|
@ -108,8 +131,10 @@ namespace OpenSim.Framework.RegionLoader.Web
|
|||
m_log.Debug("[WEBLOADER]: Retrying");
|
||||
System.Threading.Thread.Sleep(wait);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
m_log.Error("[WEBLOADER]: No region configs were available.");
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -442,7 +442,7 @@ namespace OpenSim.Framework.Servers.HttpServer
|
|||
string path = request.RawUrl;
|
||||
string handlerKey = GetHandlerKey(request.HttpMethod, path);
|
||||
|
||||
//m_log.DebugFormat("[BASE HTTP SERVER]: Handling {0} request for {1}", request.HttpMethod, path);
|
||||
// m_log.DebugFormat("[BASE HTTP SERVER]: Handling {0} request for {1}", request.HttpMethod, path);
|
||||
|
||||
if (TryGetStreamHandler(handlerKey, out requestHandler))
|
||||
{
|
||||
|
|
|
@ -210,10 +210,6 @@ namespace OpenSim
|
|||
/// </summary>
|
||||
private void RegisterConsoleCommands()
|
||||
{
|
||||
m_console.Commands.AddCommand("region", false, "clear assets",
|
||||
"clear assets",
|
||||
"Clear the asset cache", HandleClearAssets);
|
||||
|
||||
m_console.Commands.AddCommand("region", false, "force update",
|
||||
"force update",
|
||||
"Force the update of all objects on clients",
|
||||
|
@ -509,11 +505,6 @@ namespace OpenSim
|
|||
}
|
||||
}
|
||||
|
||||
private void HandleClearAssets(string module, string[] args)
|
||||
{
|
||||
MainConsole.Instance.Output("Not implemented.");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Force resending of all updates to all clients in active region(s)
|
||||
/// </summary>
|
||||
|
|
|
@ -41,11 +41,15 @@ using OpenSim.Framework.Servers;
|
|||
using OpenSim.Framework.Servers.HttpServer;
|
||||
using OpenSim.Framework.Statistics;
|
||||
using OpenSim.Region.ClientStack;
|
||||
using OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts;
|
||||
using OpenSim.Region.Framework;
|
||||
using OpenSim.Region.Framework.Interfaces;
|
||||
using OpenSim.Region.Framework.Scenes;
|
||||
using OpenSim.Region.Physics.Manager;
|
||||
using OpenSim.Server.Base;
|
||||
using OpenSim.Services.Base;
|
||||
using OpenSim.Services.Interfaces;
|
||||
using OpenSim.Services.UserAccountService;
|
||||
|
||||
namespace OpenSim
|
||||
{
|
||||
|
@ -411,6 +415,9 @@ namespace OpenSim
|
|||
scene.SnmpService.BootInfo("Loading prins", scene);
|
||||
}
|
||||
|
||||
while (regionInfo.EstateSettings.EstateOwner == UUID.Zero && MainConsole.Instance != null)
|
||||
SetUpEstateOwner(scene);
|
||||
|
||||
// Prims have to be loaded after module configuration since some modules may be invoked during the load
|
||||
scene.LoadPrimsFromStorage(regionInfo.originRegionID);
|
||||
|
||||
|
@ -494,6 +501,64 @@ namespace OpenSim
|
|||
return clientServer;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Try to set up the estate owner for the given scene.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// The involves asking the user for information about the user on the console. If the user does not already
|
||||
/// exist then it is created.
|
||||
/// </remarks>
|
||||
/// <param name="scene"></param>
|
||||
private void SetUpEstateOwner(Scene scene)
|
||||
{
|
||||
RegionInfo regionInfo = scene.RegionInfo;
|
||||
|
||||
MainConsole.Instance.OutputFormat("Estate {0} has no owner set.", regionInfo.EstateSettings.EstateName);
|
||||
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 (account == null)
|
||||
{
|
||||
|
||||
// XXX: The LocalUserAccountServicesConnector is currently registering its inner service rather than
|
||||
// itself!
|
||||
// if (scene.UserAccountService is LocalUserAccountServicesConnector)
|
||||
// {
|
||||
// IUserAccountService innerUas
|
||||
// = ((LocalUserAccountServicesConnector)scene.UserAccountService).UserAccountService;
|
||||
//
|
||||
// m_log.DebugFormat("B {0}", innerUas.GetType());
|
||||
//
|
||||
// if (innerUas is UserAccountService)
|
||||
// {
|
||||
|
||||
if (scene.UserAccountService is UserAccountService)
|
||||
{
|
||||
string password = MainConsole.Instance.PasswdPrompt("Password");
|
||||
string email = MainConsole.Instance.CmdPrompt("Email", "");
|
||||
|
||||
account
|
||||
= ((UserAccountService)scene.UserAccountService).CreateUser(
|
||||
regionInfo.ScopeID, first, last, password, email);
|
||||
}
|
||||
// }
|
||||
}
|
||||
|
||||
if (account == null)
|
||||
{
|
||||
m_log.ErrorFormat(
|
||||
"[OPENSIM]: Unable to store account. If this simulator is connected to a grid, you must create the estate owner account first.");
|
||||
}
|
||||
else
|
||||
{
|
||||
regionInfo.EstateSettings.EstateOwner = account.PrincipalID;
|
||||
regionInfo.EstateSettings.Save();
|
||||
}
|
||||
}
|
||||
|
||||
private void ShutdownRegion(Scene scene)
|
||||
{
|
||||
m_log.DebugFormat("[SHUTDOWN]: Shutting down region {0}", scene.RegionInfo.RegionName);
|
||||
|
|
|
@ -179,9 +179,10 @@ namespace OpenSim.Region.ClientStack.Linden
|
|||
{
|
||||
Queue<OSD> queue = GetQueue(avatarID);
|
||||
if (queue != null)
|
||||
queue.Enqueue(ev);
|
||||
lock (queue)
|
||||
queue.Enqueue(ev);
|
||||
}
|
||||
catch(NullReferenceException e)
|
||||
catch (NullReferenceException e)
|
||||
{
|
||||
m_log.Error("[EVENTQUEUE] Caught exception: " + e);
|
||||
return false;
|
||||
|
@ -338,12 +339,8 @@ namespace OpenSim.Region.ClientStack.Linden
|
|||
Queue<OSD> queue = GetQueue(agentID);
|
||||
if (queue != null)
|
||||
lock (queue)
|
||||
{
|
||||
if (queue.Count > 0)
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
return queue.Count > 0;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -358,8 +355,6 @@ namespace OpenSim.Region.ClientStack.Linden
|
|||
element = queue.Dequeue(); // 15s timeout
|
||||
}
|
||||
|
||||
|
||||
|
||||
int thisID = 0;
|
||||
lock (m_ids)
|
||||
thisID = m_ids[pAgentId];
|
||||
|
@ -431,7 +426,10 @@ namespace OpenSim.Region.ClientStack.Linden
|
|||
// }
|
||||
|
||||
Queue<OSD> queue = TryGetQueue(agentID);
|
||||
OSD element = queue.Dequeue(); // 15s timeout
|
||||
OSD element;
|
||||
|
||||
lock (queue)
|
||||
element = queue.Dequeue(); // 15s timeout
|
||||
|
||||
Hashtable responsedata = new Hashtable();
|
||||
|
||||
|
@ -470,10 +468,14 @@ namespace OpenSim.Region.ClientStack.Linden
|
|||
else
|
||||
{
|
||||
array.Add(element);
|
||||
while (queue.Count > 0)
|
||||
|
||||
lock (queue)
|
||||
{
|
||||
array.Add(queue.Dequeue());
|
||||
thisID++;
|
||||
while (queue.Count > 0)
|
||||
{
|
||||
array.Add(queue.Dequeue());
|
||||
thisID++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -520,6 +522,7 @@ namespace OpenSim.Region.ClientStack.Linden
|
|||
AvatarID = m_QueueUUIDAvatarMapping[capUUID];
|
||||
}
|
||||
}
|
||||
|
||||
if (AvatarID != UUID.Zero)
|
||||
{
|
||||
return ProcessQueue(request, AvatarID, m_scene.CapsModule.GetCapsForUser(AvatarID));
|
||||
|
|
|
@ -232,7 +232,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
|||
public event ScriptReset OnScriptReset;
|
||||
public event GetScriptRunning OnGetScriptRunning;
|
||||
public event SetScriptRunning OnSetScriptRunning;
|
||||
public event Action<Vector3, bool> OnAutoPilotGo;
|
||||
public event Action<Vector3, bool, bool> OnAutoPilotGo;
|
||||
public event TerrainUnacked OnUnackedTerrain;
|
||||
public event ActivateGesture OnActivateGesture;
|
||||
public event DeactivateGesture OnDeactivateGesture;
|
||||
|
@ -4173,8 +4173,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
|||
while (updatesThisCall < m_maxUpdates)
|
||||
{
|
||||
lock (m_entityProps.SyncRoot)
|
||||
if (!m_entityProps.TryDequeue(out iupdate, out timeinqueue))
|
||||
break;
|
||||
if (!m_entityProps.TryDequeue(out iupdate, out timeinqueue))
|
||||
break;
|
||||
|
||||
ObjectPropertyUpdate update = (ObjectPropertyUpdate)iupdate;
|
||||
if (update.SendFamilyProps)
|
||||
|
@ -6145,9 +6145,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
|||
RezMultipleAttachmentsFromInv handlerRezMultipleAttachments = OnRezMultipleAttachmentsFromInv;
|
||||
if (handlerRezMultipleAttachments != null)
|
||||
{
|
||||
RezMultipleAttachmentsFromInvPacket rez = (RezMultipleAttachmentsFromInvPacket)Pack;
|
||||
handlerRezMultipleAttachments(this, rez.HeaderData,
|
||||
rez.ObjectData);
|
||||
List<KeyValuePair<UUID, uint>> rezlist = new List<KeyValuePair<UUID, uint>>();
|
||||
foreach (RezMultipleAttachmentsFromInvPacket.ObjectDataBlock obj in ((RezMultipleAttachmentsFromInvPacket)Pack).ObjectData)
|
||||
rezlist.Add(new KeyValuePair<UUID, uint>(obj.ItemID, obj.AttachmentPt));
|
||||
handlerRezMultipleAttachments(this, rezlist);
|
||||
}
|
||||
|
||||
return true;
|
||||
|
@ -11756,9 +11757,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
|||
locy = Convert.ToSingle(args[1]) - (float)regionY;
|
||||
locz = Convert.ToSingle(args[2]);
|
||||
|
||||
Action<Vector3, bool> handlerAutoPilotGo = OnAutoPilotGo;
|
||||
Action<Vector3, bool, bool> handlerAutoPilotGo = OnAutoPilotGo;
|
||||
if (handlerAutoPilotGo != null)
|
||||
handlerAutoPilotGo(new Vector3(locx, locy, locz), false);
|
||||
handlerAutoPilotGo(new Vector3(locx, locy, locz), false, false);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
|
|
@ -929,25 +929,17 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
|||
UUID sessionID = useCircuitCode.CircuitCode.SessionID;
|
||||
uint circuitCode = useCircuitCode.CircuitCode.Code;
|
||||
|
||||
if (m_scene.RegionStatus != RegionStatus.SlaveScene)
|
||||
AuthenticateResponse sessionInfo;
|
||||
if (IsClientAuthorized(useCircuitCode, out sessionInfo))
|
||||
{
|
||||
AuthenticateResponse sessionInfo;
|
||||
if (IsClientAuthorized(useCircuitCode, out sessionInfo))
|
||||
{
|
||||
AddClient(circuitCode, agentID, sessionID, remoteEndPoint, sessionInfo);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Don't create circuits for unauthorized clients
|
||||
m_log.WarnFormat(
|
||||
"[LLUDPSERVER]: Connection request for client {0} connecting with unnotified circuit code {1} from {2}",
|
||||
useCircuitCode.CircuitCode.ID, useCircuitCode.CircuitCode.Code, remoteEndPoint);
|
||||
}
|
||||
AddClient(circuitCode, agentID, sessionID, remoteEndPoint, sessionInfo);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Slave regions don't accept new clients
|
||||
m_log.Debug("[LLUDPSERVER]: Slave region " + m_scene.RegionInfo.RegionName + " ignoring UseCircuitCode packet");
|
||||
// Don't create circuits for unauthorized clients
|
||||
m_log.WarnFormat(
|
||||
"[LLUDPSERVER]: Connection request for client {0} connecting with unnotified circuit code {1} from {2}",
|
||||
useCircuitCode.CircuitCode.ID, useCircuitCode.CircuitCode.Code, remoteEndPoint);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -41,14 +41,13 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
|
|||
/// </summary>
|
||||
public class AgentAssetTransactions
|
||||
{
|
||||
// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
// Fields
|
||||
private bool m_dumpAssetsToFile;
|
||||
private Scene m_Scene;
|
||||
public UUID UserID;
|
||||
public Dictionary<UUID, AssetXferUploader> XferUploaders =
|
||||
new Dictionary<UUID, AssetXferUploader>();
|
||||
private UUID UserID;
|
||||
private Dictionary<UUID, AssetXferUploader> XferUploaders = new Dictionary<UUID, AssetXferUploader>();
|
||||
|
||||
// Methods
|
||||
public AgentAssetTransactions(UUID agentID, Scene scene,
|
||||
|
@ -59,36 +58,94 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
|
|||
m_dumpAssetsToFile = dumpAssetsToFile;
|
||||
}
|
||||
|
||||
public AssetXferUploader RequestXferUploader(UUID transactionID)
|
||||
/// <summary>
|
||||
/// Return a xfer uploader if one does not already exist.
|
||||
/// </summary>
|
||||
/// <param name="transactionID"></param>
|
||||
/// <param name="assetID">
|
||||
/// We must transfer the new asset ID into the uploader on creation, otherwise
|
||||
/// we can see race conditions with other threads which can retrieve an item before it is updated with the new
|
||||
/// asset id.
|
||||
/// </param>
|
||||
/// <returns>
|
||||
/// The xfer uploader requested. Null if one is already in existence.
|
||||
/// FIXME: This is a bizarre thing to do, and is probably meant to signal an error condition if multiple
|
||||
/// transfers are made. Needs to be corrected.
|
||||
/// </returns>
|
||||
public AssetXferUploader RequestXferUploader(UUID transactionID, UUID assetID)
|
||||
{
|
||||
if (!XferUploaders.ContainsKey(transactionID))
|
||||
lock (XferUploaders)
|
||||
{
|
||||
AssetXferUploader uploader = new AssetXferUploader(m_Scene,
|
||||
m_dumpAssetsToFile);
|
||||
|
||||
lock (XferUploaders)
|
||||
if (!XferUploaders.ContainsKey(transactionID))
|
||||
{
|
||||
XferUploaders.Add(transactionID, uploader);
|
||||
}
|
||||
AssetXferUploader uploader = new AssetXferUploader(this, m_Scene, assetID, m_dumpAssetsToFile);
|
||||
|
||||
return uploader;
|
||||
// m_log.DebugFormat(
|
||||
// "[AGENT ASSETS TRANSACTIONS]: Adding asset xfer uploader {0} since it didn't previously exist", transactionID);
|
||||
|
||||
XferUploaders.Add(transactionID, uploader);
|
||||
|
||||
return uploader;
|
||||
}
|
||||
}
|
||||
|
||||
m_log.WarnFormat("[AGENT ASSETS TRANSACTIONS]: Ignoring request for asset xfer uploader {0} since it already exists", transactionID);
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public void HandleXfer(ulong xferID, uint packetID, byte[] data)
|
||||
{
|
||||
AssetXferUploader foundUploader = null;
|
||||
|
||||
lock (XferUploaders)
|
||||
{
|
||||
foreach (AssetXferUploader uploader in XferUploaders.Values)
|
||||
{
|
||||
// m_log.DebugFormat(
|
||||
// "[AGENT ASSETS TRANSACTIONS]: In HandleXfer, inspect xfer upload with xfer id {0}",
|
||||
// uploader.XferID);
|
||||
|
||||
if (uploader.XferID == xferID)
|
||||
{
|
||||
uploader.HandleXferPacket(xferID, packetID, data);
|
||||
foundUploader = uploader;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (foundUploader != null)
|
||||
{
|
||||
// m_log.DebugFormat(
|
||||
// "[AGENT ASSETS TRANSACTIONS]: Found xfer uploader for xfer id {0}, packet id {1}, data length {2}",
|
||||
// xferID, packetID, data.Length);
|
||||
|
||||
foundUploader.HandleXferPacket(xferID, packetID, data);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_log.ErrorFormat(
|
||||
"[AGENT ASSET TRANSACTIONS]: Could not find uploader for xfer id {0}, packet id {1}, data length {2}",
|
||||
xferID, packetID, data.Length);
|
||||
}
|
||||
}
|
||||
|
||||
public bool RemoveXferUploader(UUID transactionID)
|
||||
{
|
||||
lock (XferUploaders)
|
||||
{
|
||||
bool removed = XferUploaders.Remove(transactionID);
|
||||
|
||||
if (!removed)
|
||||
m_log.WarnFormat(
|
||||
"[AGENT ASSET TRANSACTIONS]: Received request to remove xfer uploader with transaction ID {0} but none found",
|
||||
transactionID);
|
||||
// else
|
||||
// m_log.DebugFormat(
|
||||
// "[AGENT ASSET TRANSACTIONS]: Removed xfer uploader with transaction ID {0}", transactionID);
|
||||
|
||||
return removed;
|
||||
}
|
||||
}
|
||||
|
||||
public void RequestCreateInventoryItem(IClientAPI remoteClient,
|
||||
|
@ -96,36 +153,43 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
|
|||
string description, string name, sbyte invType,
|
||||
sbyte type, byte wearableType, uint nextOwnerMask)
|
||||
{
|
||||
if (XferUploaders.ContainsKey(transactionID))
|
||||
AssetXferUploader uploader = null;
|
||||
|
||||
lock (XferUploaders)
|
||||
{
|
||||
XferUploaders[transactionID].RequestCreateInventoryItem(
|
||||
remoteClient, transactionID, folderID,
|
||||
callbackID, description, name, invType, type,
|
||||
wearableType, nextOwnerMask);
|
||||
if (XferUploaders.ContainsKey(transactionID))
|
||||
uploader = XferUploaders[transactionID];
|
||||
}
|
||||
|
||||
if (uploader != null)
|
||||
uploader.RequestCreateInventoryItem(
|
||||
remoteClient, transactionID, folderID,
|
||||
callbackID, description, name, invType, type,
|
||||
wearableType, nextOwnerMask);
|
||||
else
|
||||
m_log.ErrorFormat(
|
||||
"[AGENT ASSET TRANSACTIONS]: Could not find uploader with transaction ID {0} when handling request to create inventory item {1} from {2}",
|
||||
transactionID, name, remoteClient.Name);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Get an uploaded asset. If the data is successfully retrieved,
|
||||
/// the transaction will be removed.
|
||||
/// </summary>
|
||||
/// <param name="transactionID"></param>
|
||||
/// <returns>The asset if the upload has completed, null if it has not.</returns>
|
||||
public AssetBase GetTransactionAsset(UUID transactionID)
|
||||
private AssetBase GetTransactionAsset(UUID transactionID)
|
||||
{
|
||||
if (XferUploaders.ContainsKey(transactionID))
|
||||
lock (XferUploaders)
|
||||
{
|
||||
AssetXferUploader uploader = XferUploaders[transactionID];
|
||||
AssetBase asset = uploader.GetAssetData();
|
||||
|
||||
lock (XferUploaders)
|
||||
if (XferUploaders.ContainsKey(transactionID))
|
||||
{
|
||||
XferUploaders.Remove(transactionID);
|
||||
}
|
||||
AssetXferUploader uploader = XferUploaders[transactionID];
|
||||
AssetBase asset = uploader.GetAssetData();
|
||||
RemoveXferUploader(transactionID);
|
||||
|
||||
return asset;
|
||||
return asset;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
|
@ -135,7 +199,15 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
|
|||
SceneObjectPart part, UUID transactionID,
|
||||
TaskInventoryItem item)
|
||||
{
|
||||
if (XferUploaders.ContainsKey(transactionID))
|
||||
AssetXferUploader uploader = null;
|
||||
|
||||
lock (XferUploaders)
|
||||
{
|
||||
if (XferUploaders.ContainsKey(transactionID))
|
||||
uploader = XferUploaders[transactionID];
|
||||
}
|
||||
|
||||
if (uploader != null)
|
||||
{
|
||||
AssetBase asset = GetTransactionAsset(transactionID);
|
||||
|
||||
|
@ -161,44 +233,34 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
|
|||
m_Scene.AssetService.Store(asset);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
m_log.ErrorFormat(
|
||||
"[AGENT ASSET TRANSACTIONS]: Could not find uploader with transaction ID {0} when handling request to update task inventory item {1} in {2}",
|
||||
transactionID, item.Name, part.Name);
|
||||
}
|
||||
}
|
||||
|
||||
public void RequestUpdateInventoryItem(IClientAPI remoteClient,
|
||||
UUID transactionID, InventoryItemBase item)
|
||||
{
|
||||
if (XferUploaders.ContainsKey(transactionID))
|
||||
AssetXferUploader uploader = null;
|
||||
|
||||
lock (XferUploaders)
|
||||
{
|
||||
// m_log.DebugFormat("[XFER]: Asked to update item {0} ({1})",
|
||||
// item.Name, item.ID);
|
||||
if (XferUploaders.ContainsKey(transactionID))
|
||||
uploader = XferUploaders[transactionID];
|
||||
}
|
||||
|
||||
// Here we need to get the old asset to extract the
|
||||
// texture UUIDs if it's a wearable.
|
||||
if (item.AssetType == (int)AssetType.Bodypart ||
|
||||
item.AssetType == (int)AssetType.Clothing)
|
||||
{
|
||||
AssetBase oldAsset = m_Scene.AssetService.Get(item.AssetID.ToString());
|
||||
if (oldAsset != null)
|
||||
XferUploaders[transactionID].SetOldData(oldAsset.Data);
|
||||
}
|
||||
|
||||
AssetBase asset = GetTransactionAsset(transactionID);
|
||||
|
||||
if (asset != null)
|
||||
{
|
||||
asset.FullID = UUID.Random();
|
||||
asset.Name = item.Name;
|
||||
asset.Description = item.Description;
|
||||
asset.Type = (sbyte)item.AssetType;
|
||||
item.AssetID = asset.FullID;
|
||||
|
||||
m_Scene.AssetService.Store(asset);
|
||||
|
||||
IInventoryService invService = m_Scene.InventoryService;
|
||||
invService.UpdateItem(item);
|
||||
|
||||
// m_log.DebugFormat("[XFER]: Updated item {0} ({1}) with asset {2}",
|
||||
// item.Name, item.ID, asset.FullID);
|
||||
}
|
||||
if (uploader != null)
|
||||
{
|
||||
uploader.RequestUpdateInventoryItem(remoteClient, transactionID, item);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_log.ErrorFormat(
|
||||
"[AGENT ASSET TRANSACTIONS]: Could not find uploader with transaction ID {0} when handling request to update inventory item {1} for {2}",
|
||||
transactionID, item.Name, remoteClient.Name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -172,11 +172,12 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
|
|||
/// <summary>
|
||||
/// Update an inventory item with data that has been received through a
|
||||
/// transaction.
|
||||
///
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// This is called when clothing or body parts are updated (for
|
||||
/// instance, with new textures or colours). It may also be called in
|
||||
/// other situations.
|
||||
/// </summary>
|
||||
/// </remarks>
|
||||
/// <param name="remoteClient"></param>
|
||||
/// <param name="transactionID"></param>
|
||||
/// <param name="item"></param>
|
||||
|
@ -184,14 +185,12 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
|
|||
UUID transactionID, InventoryItemBase item)
|
||||
{
|
||||
// m_log.DebugFormat(
|
||||
// "[TRANSACTIONS MANAGER] Called HandleItemUpdateFromTransaction with item {0}",
|
||||
// "[ASSET TRANSACTION MODULE]: Called HandleItemUpdateFromTransaction with item {0}",
|
||||
// item.Name);
|
||||
|
||||
AgentAssetTransactions transactions =
|
||||
GetUserTransactions(remoteClient.AgentId);
|
||||
AgentAssetTransactions transactions = GetUserTransactions(remoteClient.AgentId);
|
||||
|
||||
transactions.RequestUpdateInventoryItem(remoteClient,
|
||||
transactionID, item);
|
||||
transactions.RequestUpdateInventoryItem(remoteClient, transactionID, item);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -255,11 +254,8 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
|
|||
}
|
||||
}
|
||||
|
||||
AgentAssetTransactions transactions =
|
||||
GetUserTransactions(remoteClient.AgentId);
|
||||
|
||||
AssetXferUploader uploader =
|
||||
transactions.RequestXferUploader(transaction);
|
||||
AgentAssetTransactions transactions = GetUserTransactions(remoteClient.AgentId);
|
||||
AssetXferUploader uploader = transactions.RequestXferUploader(transaction, assetID);
|
||||
|
||||
if (uploader != null)
|
||||
{
|
||||
|
@ -279,9 +275,8 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
|
|||
public void HandleXfer(IClientAPI remoteClient, ulong xferID,
|
||||
uint packetID, byte[] data)
|
||||
{
|
||||
//m_log.Debug("xferID: " + xferID + " packetID: " + packetID + " data!");
|
||||
AgentAssetTransactions transactions =
|
||||
GetUserTransactions(remoteClient.AgentId);
|
||||
// m_log.Debug("xferID: " + xferID + " packetID: " + packetID + " data length " + data.Length);
|
||||
AgentAssetTransactions transactions = GetUserTransactions(remoteClient.AgentId);
|
||||
|
||||
transactions.HandleXfer(xferID, packetID, data);
|
||||
}
|
||||
|
|
|
@ -48,11 +48,21 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
|
|||
};
|
||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
/// <summary>
|
||||
/// Reference to the object that holds this uploader. Used to remove ourselves from it's list if we
|
||||
/// are performing a delayed update.
|
||||
/// </summary>
|
||||
AgentAssetTransactions m_transactions;
|
||||
|
||||
private AssetBase m_asset;
|
||||
private UUID InventFolder = UUID.Zero;
|
||||
private sbyte invType = 0;
|
||||
|
||||
private bool m_createItem = false;
|
||||
private uint m_createItemCallback = 0;
|
||||
private bool m_updateItem = false;
|
||||
private InventoryItemBase m_updateItemData;
|
||||
|
||||
private string m_description = String.Empty;
|
||||
private bool m_dumpAssetToFile;
|
||||
private bool m_finished = false;
|
||||
|
@ -67,9 +77,11 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
|
|||
public ulong XferID;
|
||||
private Scene m_Scene;
|
||||
|
||||
public AssetXferUploader(Scene scene, bool dumpAssetToFile)
|
||||
public AssetXferUploader(AgentAssetTransactions transactions, Scene scene, UUID assetID, bool dumpAssetToFile)
|
||||
{
|
||||
m_transactions = transactions;
|
||||
m_Scene = scene;
|
||||
m_asset = new AssetBase() { FullID = assetID };
|
||||
m_dumpAssetToFile = dumpAssetToFile;
|
||||
}
|
||||
|
||||
|
@ -82,6 +94,10 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
|
|||
/// <returns>True if the transfer is complete, false otherwise or if the xferID was not valid</returns>
|
||||
public bool HandleXferPacket(ulong xferID, uint packetID, byte[] data)
|
||||
{
|
||||
// m_log.DebugFormat(
|
||||
// "[ASSET XFER UPLOADER]: Received packet {0} for xfer {1} (data length {2})",
|
||||
// packetID, xferID, data.Length);
|
||||
|
||||
if (XferID == xferID)
|
||||
{
|
||||
if (m_asset.Data.Length > 1)
|
||||
|
@ -116,16 +132,20 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
|
|||
/// <param name="xferID"></param>
|
||||
/// <param name="packetID"></param>
|
||||
/// <param name="data"></param>
|
||||
/// <returns>True if the transfer is complete, false otherwise</returns>
|
||||
public bool Initialise(IClientAPI remoteClient, UUID assetID,
|
||||
public void Initialise(IClientAPI remoteClient, UUID assetID,
|
||||
UUID transaction, sbyte type, byte[] data, bool storeLocal,
|
||||
bool tempFile)
|
||||
{
|
||||
// m_log.DebugFormat(
|
||||
// "[ASSET XFER UPLOADER]: Initialised xfer from {0}, asset {1}, transaction {2}, type {3}, storeLocal {4}, tempFile {5}, already received data length {6}",
|
||||
// remoteClient.Name, assetID, transaction, type, storeLocal, tempFile, data.Length);
|
||||
|
||||
ourClient = remoteClient;
|
||||
m_asset = new AssetBase(assetID, "blank", type,
|
||||
remoteClient.AgentId.ToString());
|
||||
m_asset.Data = data;
|
||||
m_asset.Name = "blank";
|
||||
m_asset.Description = "empty";
|
||||
m_asset.Type = type;
|
||||
m_asset.CreatorID = remoteClient.AgentId.ToString();
|
||||
m_asset.Data = data;
|
||||
m_asset.Local = storeLocal;
|
||||
m_asset.Temporary = tempFile;
|
||||
|
||||
|
@ -135,21 +155,22 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
|
|||
if (m_asset.Data.Length > 2)
|
||||
{
|
||||
SendCompleteMessage();
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
RequestStartXfer();
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
protected void RequestStartXfer()
|
||||
{
|
||||
XferID = Util.GetNextXferID();
|
||||
ourClient.SendXferRequest(XferID, m_asset.Type, m_asset.FullID,
|
||||
0, new byte[0]);
|
||||
|
||||
// m_log.DebugFormat(
|
||||
// "[ASSET XFER UPLOADER]: Requesting Xfer of asset {0}, type {1}, transfer id {2} from {3}",
|
||||
// m_asset.FullID, m_asset.Type, XferID, ourClient.Name);
|
||||
|
||||
ourClient.SendXferRequest(XferID, m_asset.Type, m_asset.FullID, 0, new byte[0]);
|
||||
}
|
||||
|
||||
protected void SendCompleteMessage()
|
||||
|
@ -157,18 +178,32 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
|
|||
ourClient.SendAssetUploadCompleteMessage(m_asset.Type, true,
|
||||
m_asset.FullID);
|
||||
|
||||
m_finished = true;
|
||||
if (m_createItem)
|
||||
// We must lock in order to avoid a race with a separate thread dealing with an inventory item or create
|
||||
// message from other client UDP.
|
||||
lock (this)
|
||||
{
|
||||
DoCreateItem(m_createItemCallback);
|
||||
}
|
||||
else if (m_storeLocal)
|
||||
{
|
||||
m_Scene.AssetService.Store(m_asset);
|
||||
m_finished = true;
|
||||
if (m_createItem)
|
||||
{
|
||||
DoCreateItem(m_createItemCallback);
|
||||
}
|
||||
else if (m_updateItem)
|
||||
{
|
||||
StoreAssetForItemUpdate(m_updateItemData);
|
||||
|
||||
// Remove ourselves from the list of transactions if completion was delayed until the transaction
|
||||
// was complete.
|
||||
// TODO: Should probably do the same for create item.
|
||||
m_transactions.RemoveXferUploader(TransactionID);
|
||||
}
|
||||
else if (m_storeLocal)
|
||||
{
|
||||
m_Scene.AssetService.Store(m_asset);
|
||||
}
|
||||
}
|
||||
|
||||
m_log.DebugFormat(
|
||||
"[ASSET TRANSACTIONS]: Uploaded asset {0} for transaction {1}",
|
||||
"[ASSET XFER UPLOADER]: Uploaded asset {0} for transaction {1}",
|
||||
m_asset.FullID, TransactionID);
|
||||
|
||||
if (m_dumpAssetToFile)
|
||||
|
@ -214,18 +249,66 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
|
|||
m_asset.Description = description;
|
||||
m_asset.Type = type;
|
||||
|
||||
// We must lock to avoid a race with a separate thread uploading the asset.
|
||||
lock (this)
|
||||
{
|
||||
if (m_finished)
|
||||
{
|
||||
DoCreateItem(callbackID);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_createItem = true; //set flag so the inventory item is created when upload is complete
|
||||
m_createItemCallback = callbackID;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void RequestUpdateInventoryItem(IClientAPI remoteClient, UUID transactionID, InventoryItemBase item)
|
||||
{
|
||||
// We must lock to avoid a race with a separate thread uploading the asset.
|
||||
lock (this)
|
||||
{
|
||||
m_asset.Name = item.Name;
|
||||
m_asset.Description = item.Description;
|
||||
m_asset.Type = (sbyte)item.AssetType;
|
||||
|
||||
// We must always store the item at this point even if the asset hasn't finished uploading, in order
|
||||
// to avoid a race condition when the appearance module retrieves the item to set the asset id in
|
||||
// the AvatarAppearance structure.
|
||||
item.AssetID = m_asset.FullID;
|
||||
m_Scene.InventoryService.UpdateItem(item);
|
||||
|
||||
if (m_finished)
|
||||
{
|
||||
DoCreateItem(callbackID);
|
||||
StoreAssetForItemUpdate(item);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_createItem = true; //set flag so the inventory item is created when upload is complete
|
||||
m_createItemCallback = callbackID;
|
||||
// m_log.DebugFormat(
|
||||
// "[ASSET XFER UPLOADER]: Holding update inventory item request {0} for {1} pending completion of asset xfer for transaction {2}",
|
||||
// item.Name, remoteClient.Name, transactionID);
|
||||
|
||||
m_updateItem = true;
|
||||
m_updateItemData = item;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Store the asset for the given item.
|
||||
/// </summary>
|
||||
/// <param name="item"></param>
|
||||
private void StoreAssetForItemUpdate(InventoryItemBase item)
|
||||
{
|
||||
// m_log.DebugFormat(
|
||||
// "[ASSET XFER UPLOADER]: Storing asset {0} for earlier item update for {1} for {2}",
|
||||
// m_asset.FullID, item.Name, ourClient.Name);
|
||||
|
||||
m_Scene.AssetService.Store(m_asset);
|
||||
}
|
||||
|
||||
private void DoCreateItem(uint callbackID)
|
||||
{
|
||||
ValidateAssets();
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -106,7 +106,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests
|
|||
|
||||
SceneObjectGroup so = SceneHelpers.AddSceneObject(scene, attName).ParentGroup;
|
||||
|
||||
m_attMod.AttachObject(m_presence.ControllingClient, so, (uint)AttachmentPoint.Chest, false);
|
||||
m_attMod.AttachObject(m_presence, so, (uint)AttachmentPoint.Chest, false);
|
||||
|
||||
// Check status on scene presence
|
||||
Assert.That(m_presence.HasAttachments(), Is.True);
|
||||
|
@ -140,7 +140,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests
|
|||
scene, attName, attItemId, attAssetId, m_presence.UUID, InventoryType.Object);
|
||||
|
||||
m_attMod.RezSingleAttachmentFromInventory(
|
||||
m_presence.ControllingClient, attItemId, (uint)AttachmentPoint.Chest);
|
||||
m_presence, attItemId, (uint)AttachmentPoint.Chest);
|
||||
|
||||
// Check scene presence status
|
||||
Assert.That(m_presence.HasAttachments(), Is.True);
|
||||
|
@ -174,8 +174,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests
|
|||
scene, attName, attItemId, attAssetId, m_presence.UUID, InventoryType.Object);
|
||||
|
||||
ISceneEntity so = m_attMod.RezSingleAttachmentFromInventory(
|
||||
m_presence.ControllingClient, attItemId, (uint)AttachmentPoint.Chest);
|
||||
m_attMod.DetachSingleAttachmentToGround(so.LocalId, m_presence.ControllingClient);
|
||||
m_presence, attItemId, (uint)AttachmentPoint.Chest);
|
||||
m_attMod.DetachSingleAttachmentToGround(m_presence, so.LocalId);
|
||||
|
||||
// Check scene presence status
|
||||
Assert.That(m_presence.HasAttachments(), Is.False);
|
||||
|
@ -208,8 +208,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests
|
|||
scene, attName, attItemId, attAssetId, m_presence.UUID, InventoryType.Object);
|
||||
|
||||
m_attMod.RezSingleAttachmentFromInventory(
|
||||
m_presence.ControllingClient, attItemId, (uint)AttachmentPoint.Chest);
|
||||
m_attMod.DetachSingleAttachmentToInv(attItemId, m_presence.ControllingClient);
|
||||
m_presence, attItemId, (uint)AttachmentPoint.Chest);
|
||||
m_attMod.DetachSingleAttachmentToInv(m_presence, attItemId);
|
||||
|
||||
// Check status on scene presence
|
||||
Assert.That(m_presence.HasAttachments(), Is.False);
|
||||
|
|
|
@ -64,15 +64,12 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
|
|||
scene.RegisterModuleInterface<IAvatarFactory>(this);
|
||||
scene.EventManager.OnNewClient += NewClient;
|
||||
|
||||
if (config != null)
|
||||
IConfig sconfig = config.Configs["Startup"];
|
||||
if (sconfig != null)
|
||||
{
|
||||
IConfig sconfig = config.Configs["Startup"];
|
||||
if (sconfig != null)
|
||||
{
|
||||
m_savetime = Convert.ToInt32(sconfig.GetString("DelayBeforeAppearanceSave",Convert.ToString(m_savetime)));
|
||||
m_sendtime = Convert.ToInt32(sconfig.GetString("DelayBeforeAppearanceSend",Convert.ToString(m_sendtime)));
|
||||
// m_log.InfoFormat("[AVFACTORY] configured for {0} save and {1} send",m_savetime,m_sendtime);
|
||||
}
|
||||
m_savetime = Convert.ToInt32(sconfig.GetString("DelayBeforeAppearanceSave",Convert.ToString(m_savetime)));
|
||||
m_sendtime = Convert.ToInt32(sconfig.GetString("DelayBeforeAppearanceSend",Convert.ToString(m_sendtime)));
|
||||
// m_log.InfoFormat("[AVFACTORY] configured for {0} save and {1} send",m_savetime,m_sendtime);
|
||||
}
|
||||
|
||||
if (m_scene == null)
|
||||
|
@ -211,8 +208,17 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
|
|||
// Process the visual params, this may change height as well
|
||||
if (visualParams != null)
|
||||
{
|
||||
// string[] visualParamsStrings = new string[visualParams.Length];
|
||||
// for (int i = 0; i < visualParams.Length; i++)
|
||||
// visualParamsStrings[i] = visualParams[i].ToString();
|
||||
// m_log.DebugFormat(
|
||||
// "[AVFACTORY]: Setting visual params for {0} to {1}",
|
||||
// client.Name, string.Join(", ", visualParamsStrings));
|
||||
|
||||
float oldHeight = sp.Appearance.AvatarHeight;
|
||||
changed = sp.Appearance.SetVisualParams(visualParams);
|
||||
if (sp.Appearance.AvatarHeight > 0)
|
||||
|
||||
if (sp.Appearance.AvatarHeight != oldHeight && sp.Appearance.AvatarHeight > 0)
|
||||
sp.SetHeight(sp.Appearance.AvatarHeight);
|
||||
}
|
||||
|
||||
|
@ -416,6 +422,13 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
|
|||
|
||||
// m_log.WarnFormat("[AVFACTORY] avatar {0} save appearance",agentid);
|
||||
|
||||
// This could take awhile since it needs to pull inventory
|
||||
// We need to do it at the point of save so that there is a sufficient delay for any upload of new body part/shape
|
||||
// assets and item asset id changes to complete.
|
||||
// I don't think we need to worry about doing this within m_setAppearanceLock since the queueing avoids
|
||||
// multiple save requests.
|
||||
SetAppearanceAssets(sp.UUID, sp.Appearance);
|
||||
|
||||
m_scene.AvatarService.SetAppearance(agentid, sp.Appearance);
|
||||
}
|
||||
|
||||
|
@ -467,7 +480,7 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
|
|||
return;
|
||||
}
|
||||
|
||||
// m_log.WarnFormat("[AVFACTORY]: Received request for wearables of {0}", client.AgentId);
|
||||
// m_log.DebugFormat("[AVFACTORY]: Received request for wearables of {0}", client.Name);
|
||||
|
||||
client.SendWearables(sp.Appearance.Wearables, sp.Appearance.Serial++);
|
||||
}
|
||||
|
@ -502,9 +515,6 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
|
|||
|
||||
avatAppearance.GetAssetsFrom(sp.Appearance);
|
||||
|
||||
// This could take awhile since it needs to pull inventory
|
||||
SetAppearanceAssets(sp.UUID, ref avatAppearance);
|
||||
|
||||
lock (m_setAppearanceLock)
|
||||
{
|
||||
// Update only those fields that we have changed. This is important because the viewer
|
||||
|
@ -538,7 +548,7 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
|
|||
return true;
|
||||
}
|
||||
|
||||
private void SetAppearanceAssets(UUID userID, ref AvatarAppearance appearance)
|
||||
private void SetAppearanceAssets(UUID userID, AvatarAppearance appearance)
|
||||
{
|
||||
IInventoryService invService = m_scene.InventoryService;
|
||||
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
* (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;
|
||||
using System.Collections.Generic;
|
||||
|
@ -145,14 +146,14 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
|
|||
scene.Entities[toAgentID] is ScenePresence)
|
||||
{
|
||||
// m_log.DebugFormat(
|
||||
// "[INSTANT MESSAGE]: Looking for root agent {0} in {1}",
|
||||
// "[HG INSTANT MESSAGE]: Looking for root agent {0} in {1}",
|
||||
// toAgentID.ToString(), scene.RegionInfo.RegionName);
|
||||
|
||||
ScenePresence user = (ScenePresence) scene.Entities[toAgentID];
|
||||
if (!user.IsChildAgent)
|
||||
{
|
||||
// Local message
|
||||
// m_log.DebugFormat("[INSTANT MESSAGE]: Delivering IM to root agent {0} {1}", user.Name, toAgentID);
|
||||
// m_log.DebugFormat("[HG INSTANT MESSAGE]: Delivering IM to root agent {0} {1}", user.Name, toAgentID);
|
||||
user.ControllingClient.SendInstantMessage(im);
|
||||
|
||||
// Message sent
|
||||
|
@ -166,7 +167,7 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
|
|||
foreach (Scene scene in m_Scenes)
|
||||
{
|
||||
// m_log.DebugFormat(
|
||||
// "[INSTANT MESSAGE]: Looking for child of {0} in {1}", toAgentID, scene.RegionInfo.RegionName);
|
||||
// "[HG INSTANT MESSAGE]: Looking for child of {0} in {1}", toAgentID, scene.RegionInfo.RegionName);
|
||||
|
||||
if (scene.Entities.ContainsKey(toAgentID) &&
|
||||
scene.Entities[toAgentID] is ScenePresence)
|
||||
|
@ -174,7 +175,7 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
|
|||
// Local message
|
||||
ScenePresence user = (ScenePresence) scene.Entities[toAgentID];
|
||||
|
||||
// m_log.DebugFormat("[INSTANT MESSAGE]: Delivering IM to child agent {0} {1}", user.Name, toAgentID);
|
||||
// m_log.DebugFormat("[HG INSTANT MESSAGE]: Delivering IM to child agent {0} {1}", user.Name, toAgentID);
|
||||
user.ControllingClient.SendInstantMessage(im);
|
||||
|
||||
// Message sent
|
||||
|
@ -183,7 +184,7 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
|
|||
}
|
||||
}
|
||||
|
||||
// m_log.DebugFormat("[INSTANT MESSAGE]: Delivering IM to {0} via XMLRPC", im.toAgentID);
|
||||
// m_log.DebugFormat("[HG INSTANT MESSAGE]: Delivering IM to {0} via XMLRPC", im.toAgentID);
|
||||
// Is the user a local user?
|
||||
UserAccount account = m_Scenes[0].UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, toAgentID);
|
||||
string url = string.Empty;
|
||||
|
|
|
@ -154,14 +154,17 @@ namespace OpenSim.Region.CoreModules.Avatar.Lure
|
|||
if (im.dialog == (byte)InstantMessageDialog.RequestTeleport)
|
||||
{
|
||||
UUID sessionID = new UUID(im.imSessionID);
|
||||
m_log.DebugFormat("[HG LURE MODULE]: RequestTeleport sessionID={0}, regionID={1}, message={2}", im.imSessionID, im.RegionID, im.message);
|
||||
m_PendingLures.Add(sessionID, im, 7200); // 2 hours
|
||||
|
||||
if (!m_PendingLures.Contains(sessionID))
|
||||
{
|
||||
m_log.DebugFormat("[HG LURE MODULE]: RequestTeleport sessionID={0}, regionID={1}, message={2}", im.imSessionID, im.RegionID, im.message);
|
||||
m_PendingLures.Add(sessionID, im, 7200); // 2 hours
|
||||
}
|
||||
|
||||
// Forward. We do this, because the IM module explicitly rejects
|
||||
// IMs of this type
|
||||
if (m_TransferModule != null)
|
||||
m_TransferModule.SendInstantMessage(im, delegate(bool success) { });
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -177,13 +180,18 @@ namespace OpenSim.Region.CoreModules.Avatar.Lure
|
|||
|
||||
m_log.DebugFormat("[HG LURE MODULE]: TP invite with message {0}", message);
|
||||
|
||||
UUID sessionID = UUID.Random();
|
||||
|
||||
GridInstantMessage m = new GridInstantMessage(scene, client.AgentId,
|
||||
client.FirstName+" "+client.LastName, targetid,
|
||||
(byte)InstantMessageDialog.RequestTeleport, false,
|
||||
message, UUID.Random(), false, presence.AbsolutePosition,
|
||||
message, sessionID, false, presence.AbsolutePosition,
|
||||
new Byte[0]);
|
||||
m.RegionID = client.Scene.RegionInfo.RegionID.Guid;
|
||||
|
||||
m_log.DebugFormat("[HG LURE MODULE]: RequestTeleport sessionID={0}, regionID={1}, message={2}", m.imSessionID, m.RegionID, m.message);
|
||||
m_PendingLures.Add(sessionID, m, 7200); // 2 hours
|
||||
|
||||
if (m_TransferModule != null)
|
||||
{
|
||||
m_TransferModule.SendInstantMessage(m,
|
||||
|
|
|
@ -150,7 +150,6 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
|
|||
{
|
||||
if (!m_Enabled)
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
|
|
@ -112,10 +112,13 @@ namespace OpenSim.Region.CoreModules.Scripting.LoadImageURL
|
|||
|
||||
public void PostInitialise()
|
||||
{
|
||||
m_textureManager = m_scene.RequestModuleInterface<IDynamicTextureManager>();
|
||||
if (m_textureManager != null)
|
||||
if (m_scene != null)
|
||||
{
|
||||
m_textureManager.RegisterRender(GetContentType(), this);
|
||||
m_textureManager = m_scene.RequestModuleInterface<IDynamicTextureManager>();
|
||||
if (m_textureManager != null)
|
||||
{
|
||||
m_textureManager.RegisterRender(GetContentType(), this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -141,11 +141,21 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Authorization
|
|||
|
||||
if (scene != null)
|
||||
{
|
||||
string mail = String.Empty;
|
||||
|
||||
UserAccount account = scene.UserAccountService.GetUserAccount(UUID.Zero, new UUID(userID));
|
||||
|
||||
//if account not found, we assume its a foreign visitor from HG, else use account data...
|
||||
if (account != null)
|
||||
{
|
||||
mail = account.Email;
|
||||
firstName = account.FirstName;
|
||||
lastName = account.LastName;
|
||||
}
|
||||
|
||||
isAuthorized
|
||||
= IsAuthorizedForRegion(
|
||||
userID, firstName, lastName, account.Email, scene.RegionInfo.RegionName, regionID, out message);
|
||||
userID, firstName, lastName, mail, scene.RegionInfo.RegionName, regionID, out message);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
@ -185,15 +185,18 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
|
|||
public InventoryCollection GetFolderContent(UUID userID, UUID folderID)
|
||||
{
|
||||
InventoryCollection invCol = m_InventoryService.GetFolderContent(userID, folderID);
|
||||
Util.FireAndForget(delegate
|
||||
|
||||
if (UserManager != null)
|
||||
{
|
||||
if (UserManager != null)
|
||||
// Protect ourselves against the caller subsequently modifying the items list
|
||||
List<InventoryItemBase> items = new List<InventoryItemBase>(invCol.Items);
|
||||
|
||||
Util.FireAndForget(delegate
|
||||
{
|
||||
// Protect ourselves against the caller subsequently modifying the items list
|
||||
foreach (InventoryItemBase item in new List<InventoryItemBase>(invCol.Items))
|
||||
foreach (InventoryItemBase item in items)
|
||||
UserManager.AddUser(item.CreatorIdAsUuid, item.CreatorData);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
return invCol;
|
||||
}
|
||||
|
|
|
@ -193,15 +193,18 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
|
|||
public InventoryCollection GetFolderContent(UUID userID, UUID folderID)
|
||||
{
|
||||
InventoryCollection invCol = m_RemoteConnector.GetFolderContent(userID, folderID);
|
||||
Util.FireAndForget(delegate
|
||||
|
||||
if (UserManager != null)
|
||||
{
|
||||
if (UserManager != null)
|
||||
// Protect ourselves against the caller subsequently modifying the items list
|
||||
List<InventoryItemBase> items = new List<InventoryItemBase>(invCol.Items);
|
||||
|
||||
Util.FireAndForget(delegate
|
||||
{
|
||||
// Protect ourselves against the caller subsequently modifying the items list
|
||||
foreach (InventoryItemBase item in new List<InventoryItemBase>(invCol.Items))
|
||||
foreach (InventoryItemBase item in items)
|
||||
UserManager.AddUser(item.CreatorIdAsUuid, item.CreatorData);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
return invCol;
|
||||
}
|
||||
|
|
|
@ -45,7 +45,12 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts
|
|||
LogManager.GetLogger(
|
||||
MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
private IUserAccountService m_UserService;
|
||||
/// <summary>
|
||||
/// This is not on the IUserAccountService. It's only being used so that standalone scenes can punch through
|
||||
/// to a local UserAccountService when setting up an estate manager.
|
||||
/// </summary>
|
||||
public IUserAccountService UserAccountService { get; private set; }
|
||||
|
||||
private UserAccountCache m_Cache;
|
||||
|
||||
private bool m_Enabled = false;
|
||||
|
@ -86,9 +91,9 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts
|
|||
}
|
||||
|
||||
Object[] args = new Object[] { source };
|
||||
m_UserService = ServerUtils.LoadPlugin<IUserAccountService>(serviceDll, args);
|
||||
UserAccountService = ServerUtils.LoadPlugin<IUserAccountService>(serviceDll, args);
|
||||
|
||||
if (m_UserService == null)
|
||||
if (UserAccountService == null)
|
||||
{
|
||||
m_log.ErrorFormat(
|
||||
"[LOCAL USER ACCOUNT SERVICE CONNECTOR]: Cannot load user account service specified as {0}", serviceDll);
|
||||
|
@ -119,7 +124,9 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts
|
|||
if (!m_Enabled)
|
||||
return;
|
||||
|
||||
scene.RegisterModuleInterface<IUserAccountService>(m_UserService);
|
||||
// FIXME: Why do we bother setting this module and caching up if we just end up registering the inner
|
||||
// user account service?!
|
||||
scene.RegisterModuleInterface<IUserAccountService>(UserAccountService);
|
||||
scene.RegisterModuleInterface<IUserAccountCacheModule>(m_Cache);
|
||||
}
|
||||
|
||||
|
@ -148,7 +155,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts
|
|||
if (inCache)
|
||||
return account;
|
||||
|
||||
account = m_UserService.GetUserAccount(scopeID, userID);
|
||||
account = UserAccountService.GetUserAccount(scopeID, userID);
|
||||
m_Cache.Cache(userID, account);
|
||||
|
||||
return account;
|
||||
|
@ -161,7 +168,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts
|
|||
if (inCache)
|
||||
return account;
|
||||
|
||||
account = m_UserService.GetUserAccount(scopeID, firstName, lastName);
|
||||
account = UserAccountService.GetUserAccount(scopeID, firstName, lastName);
|
||||
if (account != null)
|
||||
m_Cache.Cache(account.PrincipalID, account);
|
||||
|
||||
|
@ -170,7 +177,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts
|
|||
|
||||
public UserAccount GetUserAccount(UUID scopeID, string Email)
|
||||
{
|
||||
return m_UserService.GetUserAccount(scopeID, Email);
|
||||
return UserAccountService.GetUserAccount(scopeID, Email);
|
||||
}
|
||||
|
||||
public List<UserAccount> GetUserAccountsWhere(UUID scopeID, string query)
|
||||
|
@ -180,17 +187,16 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts
|
|||
|
||||
public List<UserAccount> GetUserAccounts(UUID scopeID, string query)
|
||||
{
|
||||
return m_UserService.GetUserAccounts(scopeID, query);
|
||||
return UserAccountService.GetUserAccounts(scopeID, query);
|
||||
}
|
||||
|
||||
// Update all updatable fields
|
||||
//
|
||||
public bool StoreUserAccount(UserAccount data)
|
||||
{
|
||||
return m_UserService.StoreUserAccount(data);
|
||||
return UserAccountService.StoreUserAccount(data);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -101,7 +101,7 @@ namespace OpenSim.Region.CoreModules.World.Objects.BuySell
|
|||
|
||||
part.ParentGroup.HasGroupChanged = true;
|
||||
|
||||
part.GetProperties(client);
|
||||
part.SendPropertiesToClient(client);
|
||||
}
|
||||
|
||||
public bool BuyObject(IClientAPI remoteClient, UUID categoryID, uint localID, byte saleType, int salePrice)
|
||||
|
@ -142,7 +142,7 @@ namespace OpenSim.Region.CoreModules.World.Objects.BuySell
|
|||
part.SalePrice = 10;
|
||||
|
||||
group.HasGroupChanged = true;
|
||||
part.GetProperties(remoteClient);
|
||||
part.SendPropertiesToClient(remoteClient);
|
||||
part.TriggerScriptChangedEvent(Changed.OWNER);
|
||||
group.ResumeScripts();
|
||||
part.ScheduleFullUpdate();
|
||||
|
|
|
@ -1,131 +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.Collections.Generic;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Region.Framework.Scenes;
|
||||
|
||||
namespace OpenSim.Region.Examples.SimpleModule
|
||||
{
|
||||
public class ComplexObject : SceneObjectGroup
|
||||
{
|
||||
private readonly Quaternion m_rotationDirection;
|
||||
|
||||
protected override bool InSceneBackup
|
||||
{
|
||||
get
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
private class RotatingWheel : SceneObjectPart
|
||||
{
|
||||
private readonly Quaternion m_rotationDirection;
|
||||
|
||||
public RotatingWheel()
|
||||
{
|
||||
}
|
||||
|
||||
public RotatingWheel(
|
||||
UUID ownerID, Vector3 groupPosition, Vector3 offsetPosition, Quaternion rotationDirection)
|
||||
: base(ownerID, PrimitiveBaseShape.Default, groupPosition, Quaternion.Identity, offsetPosition)
|
||||
{
|
||||
m_rotationDirection = rotationDirection;
|
||||
|
||||
Flags |= PrimFlags.Touch;
|
||||
}
|
||||
|
||||
public override void UpdateMovement()
|
||||
{
|
||||
UpdateRotation(RotationOffset * m_rotationDirection);
|
||||
}
|
||||
}
|
||||
|
||||
public override void UpdateMovement()
|
||||
{
|
||||
UpdateGroupRotationR(GroupRotation * m_rotationDirection);
|
||||
|
||||
base.UpdateMovement();
|
||||
}
|
||||
|
||||
public ComplexObject()
|
||||
{
|
||||
}
|
||||
|
||||
public ComplexObject(Scene scene, ulong regionHandle, UUID ownerID, uint localID, Vector3 pos)
|
||||
: base(ownerID, pos, PrimitiveBaseShape.Default)
|
||||
{
|
||||
m_rotationDirection = new Quaternion(0.05f, 0.1f, 0.15f);
|
||||
|
||||
AddPart(
|
||||
new RotatingWheel(ownerID, pos, new Vector3(0, 0, 0.75f),
|
||||
new Quaternion(0.05f, 0, 0)));
|
||||
AddPart(
|
||||
new RotatingWheel(ownerID, pos, new Vector3(0, 0, -0.75f),
|
||||
new Quaternion(-0.05f, 0, 0)));
|
||||
|
||||
AddPart(
|
||||
new RotatingWheel(ownerID, pos, new Vector3(0, 0.75f, 0),
|
||||
new Quaternion(0.5f, 0, 0.05f)));
|
||||
AddPart(
|
||||
new RotatingWheel(ownerID, pos, new Vector3(0, -0.75f, 0),
|
||||
new Quaternion(-0.5f, 0, -0.05f)));
|
||||
|
||||
AddPart(
|
||||
new RotatingWheel(ownerID, pos, new Vector3(0.75f, 0, 0),
|
||||
new Quaternion(0, 0.5f, 0.05f)));
|
||||
AddPart(
|
||||
new RotatingWheel(ownerID, pos, new Vector3(-0.75f, 0, 0),
|
||||
new Quaternion(0, -0.5f, -0.05f)));
|
||||
|
||||
RootPart.Flags |= PrimFlags.Touch;
|
||||
}
|
||||
|
||||
public override void OnGrabPart(SceneObjectPart part, Vector3 offsetPos, IClientAPI remoteClient)
|
||||
{
|
||||
m_parts.Remove(part.UUID);
|
||||
|
||||
remoteClient.SendKillObject(m_regionHandle, new List<uint>() { part.LocalId} );
|
||||
remoteClient.AddMoney(1);
|
||||
remoteClient.SendChatMessage("Poof!", 1, AbsolutePosition, "Party Party", UUID.Zero, (byte)ChatSourceType.Object, (byte)ChatAudibleLevel.Fully);
|
||||
}
|
||||
|
||||
public override void OnGrabGroup(Vector3 offsetPos, IClientAPI remoteClient)
|
||||
{
|
||||
if (m_parts.Count == 1)
|
||||
{
|
||||
m_parts.Remove(m_rootPart.UUID);
|
||||
m_scene.DeleteSceneObject(this, false);
|
||||
remoteClient.SendKillObject(m_regionHandle, new List<uint>() { m_rootPart.LocalId });
|
||||
remoteClient.AddMoney(50);
|
||||
remoteClient.SendChatMessage("KABLAM!!!", 1, AbsolutePosition, "Groupie Groupie", UUID.Zero, (byte)ChatSourceType.Object, (byte)ChatAudibleLevel.Fully);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,68 +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.Diagnostics;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Region.Framework.Scenes;
|
||||
|
||||
namespace OpenSim.Region.Examples.SimpleModule
|
||||
{
|
||||
public class CpuCounterObject : SceneObjectGroup
|
||||
{
|
||||
protected override bool InSceneBackup
|
||||
{
|
||||
get
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
private PerformanceCounter m_counter;
|
||||
|
||||
public CpuCounterObject(UUID ownerID, Vector3 pos)
|
||||
: base(ownerID, pos, PrimitiveBaseShape.Default)
|
||||
{
|
||||
String objectName = "Processor";
|
||||
String counterName = "% Processor Time";
|
||||
String instanceName = "_Total";
|
||||
|
||||
m_counter = new PerformanceCounter(objectName, counterName, instanceName);
|
||||
}
|
||||
|
||||
public override void UpdateMovement()
|
||||
{
|
||||
float cpu = m_counter.NextValue()/40f;
|
||||
Vector3 size = new Vector3(cpu, cpu, cpu);
|
||||
|
||||
RootPart.Resize(size);
|
||||
|
||||
base.UpdateMovement();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,51 +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.IO;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Region.Framework.Scenes;
|
||||
|
||||
namespace OpenSim.Region.Examples.SimpleModule
|
||||
{
|
||||
public class FileSystemObject : SceneObjectGroup
|
||||
{
|
||||
public FileSystemObject(FileInfo fileInfo, Vector3 pos)
|
||||
: base(UUID.Zero, pos, PrimitiveBaseShape.Default)
|
||||
{
|
||||
Text = fileInfo.Name;
|
||||
}
|
||||
|
||||
protected override bool InSceneBackup
|
||||
{
|
||||
get
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
File diff suppressed because it is too large
Load Diff
|
@ -1,62 +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;
|
||||
|
||||
// General information about an assembly is controlled through the following
|
||||
// set of attributes. Change these attribute values to modify the information
|
||||
// associated with an assembly.
|
||||
[assembly: AssemblyTitle("OpenSim.Region.Examples.SimpleModule")]
|
||||
[assembly: AssemblyDescription("")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("http://opensimulator.org")]
|
||||
[assembly: AssemblyProduct("OpenSim.Region.Examples.SimpleModule")]
|
||||
[assembly: AssemblyCopyright("Copyright (c) 2008")]
|
||||
[assembly: AssemblyTrademark("")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
|
||||
// Setting ComVisible to false makes the types in this assembly not visible
|
||||
// to COM components. If you need to access a type in this assembly from
|
||||
// COM, set the ComVisible attribute to true on that type.
|
||||
[assembly: ComVisible(false)]
|
||||
|
||||
// The following GUID is for the ID of the typelib if this project is exposed to COM
|
||||
[assembly: Guid("f0caca77-7818-4a43-9200-0a8548009a05")]
|
||||
|
||||
// Version information for an assembly consists of the following four values:
|
||||
//
|
||||
// Major Version
|
||||
// Minor Version
|
||||
// Build Number
|
||||
// Revision
|
||||
//
|
||||
// You can specify all the values or you can default the Build and Revision Numbers
|
||||
// by using the '*' as shown below:
|
||||
// [assembly: AssemblyVersion("0.6.5.*")]
|
||||
[assembly: AssemblyVersion("0.6.5.*")]
|
||||
[assembly: AssemblyFileVersion("0.6.5.0")]
|
|
@ -1,9 +0,0 @@
|
|||
!!!IMPORTANT NOTE!!!
|
||||
|
||||
This code snippet provided as an example of coding functional content with region modules.
|
||||
|
||||
As of 13/3 2008 this module actually renders all regions within the instance unusable if enabled by dragging the dll from ./bin to global /bin.
|
||||
|
||||
So, use at own peril and in dedicated instance.
|
||||
|
||||
Peace.
|
|
@ -1,147 +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.Collections.Generic;
|
||||
using Nini.Config;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Region.Framework.Interfaces;
|
||||
using OpenSim.Region.Framework.Scenes;
|
||||
|
||||
namespace OpenSim.Region.Examples.SimpleModule
|
||||
{
|
||||
/// <summary>
|
||||
/// Example region module.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// This is an old and unmaintained region module which uses the old style module interface. It is not loaded into
|
||||
/// OpenSim by default. If you want to try enabling it, look in the bin folder of this project.
|
||||
/// Please see the README.txt in this project on the filesystem for some more information.
|
||||
/// Nonetheless, it may contain some useful example code so has been left here for now.
|
||||
///
|
||||
/// You can see bare bones examples of the more modern region module system in OpenSim/Region/OptionalModules/Example
|
||||
/// </remarks>
|
||||
public class RegionModule : IRegionModule
|
||||
{
|
||||
#region IRegionModule Members
|
||||
|
||||
private Scene m_scene;
|
||||
|
||||
public void Initialise(Scene scene, IConfigSource source)
|
||||
{
|
||||
m_scene = scene;
|
||||
}
|
||||
|
||||
public void PostInitialise()
|
||||
{
|
||||
// RegionInfo regionInfo = m_scene.RegionInfo;
|
||||
|
||||
// Vector3 pos = new Vector3(110, 129, 27);
|
||||
|
||||
//AddCpuCounter(regionInfo, pos);
|
||||
// AddComplexObjects(regionInfo, pos);
|
||||
AddAvatars();
|
||||
// AddFileSystemObjects();
|
||||
}
|
||||
|
||||
// private void AddFileSystemObjects()
|
||||
// {
|
||||
// DirectoryInfo dirInfo = new DirectoryInfo(".");
|
||||
|
||||
// float x = 0;
|
||||
// float z = 0;
|
||||
|
||||
// foreach (FileInfo fileInfo in dirInfo.GetFiles())
|
||||
// {
|
||||
// Vector3 filePos = new Vector3(100 + x, 129, 27 + z);
|
||||
// x = x + 2;
|
||||
// if (x > 50)
|
||||
// {
|
||||
// x = 0;
|
||||
// z = z + 2;
|
||||
// }
|
||||
|
||||
// FileSystemObject fileObject = new FileSystemObject(m_scene, fileInfo, filePos);
|
||||
// m_scene.AddNewSceneObject(fileObject, true);
|
||||
// }
|
||||
// }
|
||||
|
||||
private void AddAvatars()
|
||||
{
|
||||
for (int i = 0; i < 1; i++)
|
||||
{
|
||||
MyNpcCharacter m_character = new MyNpcCharacter(m_scene);
|
||||
m_scene.AddNewClient(m_character, PresenceType.Npc);
|
||||
m_scene.AgentCrossing(m_character.AgentId, Vector3.Zero, false);
|
||||
}
|
||||
|
||||
m_scene.ForEachScenePresence(delegate(ScenePresence sp)
|
||||
{
|
||||
if (!sp.IsChildAgent)
|
||||
sp.AbsolutePosition =
|
||||
new Vector3((float)Util.RandomClass.Next(100, 200), (float)Util.RandomClass.Next(30, 200), 2);
|
||||
});
|
||||
}
|
||||
|
||||
// private void AddComplexObjects(RegionInfo regionInfo, Vector3 pos)
|
||||
// {
|
||||
// int objs = 3;
|
||||
|
||||
// for (int i = 0; i < (objs*objs*objs); i++)
|
||||
// {
|
||||
// Vector3 posOffset = new Vector3((i % objs) * 4, ((i % (objs*objs)) / (objs)) * 4, (i / (objs*objs)) * 4);
|
||||
// ComplexObject complexObject =
|
||||
// new ComplexObject(m_scene, regionInfo.RegionHandle, UUID.Zero, pos + posOffset);
|
||||
// m_scene.AddNewSceneObject(complexObject, true);
|
||||
// }
|
||||
// }
|
||||
|
||||
// private void AddCpuCounter(RegionInfo regionInfo, Vector3 pos)
|
||||
// {
|
||||
// SceneObjectGroup sceneObject =
|
||||
// new CpuCounterObject(m_scene, regionInfo.RegionHandle, UUID.Zero, pos + new Vector3(1f, 1f, 1f));
|
||||
// m_scene.AddNewSceneObject(sceneObject, true);
|
||||
// }
|
||||
|
||||
public void Close()
|
||||
{
|
||||
m_scene = null;
|
||||
}
|
||||
|
||||
public string Name
|
||||
{
|
||||
get { return GetType().AssemblyQualifiedName; }
|
||||
}
|
||||
|
||||
public bool IsSharedModule
|
||||
{
|
||||
get { return false; }
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
|
@ -27,8 +27,8 @@
|
|||
|
||||
using System;
|
||||
using System.Xml;
|
||||
using System.Collections.Generic;
|
||||
using OpenMetaverse;
|
||||
using OpenMetaverse.Packets;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Region.Framework.Scenes;
|
||||
|
||||
|
@ -40,6 +40,7 @@ namespace OpenSim.Region.Framework.Interfaces
|
|||
/// RezAttachments. This should only be called upon login on the first region.
|
||||
/// Attachment rezzings on crossings and TPs are done in a different way.
|
||||
/// </summary>
|
||||
/// <param name="sp"></param>
|
||||
void RezAttachments(IScenePresence sp);
|
||||
|
||||
/// <summary>
|
||||
|
@ -50,43 +51,21 @@ namespace OpenSim.Region.Framework.Interfaces
|
|||
|
||||
/// <summary>
|
||||
/// Delete all the presence's attachments from the scene
|
||||
/// </summary>
|
||||
/// <param name="sp">
|
||||
/// This is done when a root agent leaves/is demoted to child (for instance, on logout, teleport or region cross).
|
||||
/// </param>
|
||||
/// </summary>
|
||||
/// <param name="sp"></param>
|
||||
/// <param name="silent"></param>
|
||||
void DeleteAttachmentsFromScene(IScenePresence sp, bool silent);
|
||||
|
||||
/// <summary>
|
||||
/// Attach an object to an avatar from the world.
|
||||
/// </summary>
|
||||
/// <param name="controllingClient"></param>
|
||||
/// <param name="localID"></param>
|
||||
/// <param name="attachPoint"></param>
|
||||
/// <param name="rot"></param>
|
||||
/// <param name="silent"></param>
|
||||
void AttachObject(
|
||||
IClientAPI remoteClient, uint objectLocalID, uint AttachmentPt, bool silent);
|
||||
|
||||
/// <summary>
|
||||
/// Attach an object to an avatar
|
||||
/// </summary>
|
||||
/// <param name="remoteClient"></param>
|
||||
/// <param name="sp"></param>
|
||||
/// <param name="grp"></param>
|
||||
/// <param name="AttachmentPt"></param>
|
||||
/// <param name="silent"></param>
|
||||
/// <returns>true if the object was successfully attached, false otherwise</returns>
|
||||
bool AttachObject(
|
||||
IClientAPI remoteClient, SceneObjectGroup grp, uint AttachmentPt, bool silent);
|
||||
|
||||
/// <summary>
|
||||
/// Rez an attachment from user inventory and change inventory status to match.
|
||||
/// </summary>
|
||||
/// <param name="remoteClient"></param>
|
||||
/// <param name="itemID"></param>
|
||||
/// <param name="AttachmentPt"></param>
|
||||
/// <returns>The scene object that was attached. Null if the scene object could not be found</returns>
|
||||
ISceneEntity RezSingleAttachmentFromInventory(IClientAPI remoteClient, UUID itemID, uint AttachmentPt);
|
||||
bool AttachObject(IScenePresence sp, SceneObjectGroup grp, uint AttachmentPt, bool silent);
|
||||
|
||||
/// <summary>
|
||||
/// Rez an attachment from user inventory and change inventory status to match.
|
||||
|
@ -95,51 +74,32 @@ namespace OpenSim.Region.Framework.Interfaces
|
|||
/// <param name="itemID"></param>
|
||||
/// <param name="AttachmentPt"></param>
|
||||
/// <returns>The scene object that was attached. Null if the scene object could not be found</returns>
|
||||
ISceneEntity RezSingleAttachmentFromInventory(ScenePresence sp, UUID itemID, uint AttachmentPt);
|
||||
ISceneEntity RezSingleAttachmentFromInventory(IScenePresence sp, UUID itemID, uint AttachmentPt);
|
||||
|
||||
// Same as above, but also load script states from a separate doc
|
||||
ISceneEntity RezSingleAttachmentFromInventory(
|
||||
IClientAPI remoteClient, UUID itemID, uint AttachmentPt, bool updateInventoryStatus, XmlDocument doc);
|
||||
IScenePresence presence, UUID itemID, uint AttachmentPt, bool updateInventoryStatus, XmlDocument doc);
|
||||
|
||||
/// <summary>
|
||||
/// Rez multiple attachments from a user's inventory
|
||||
/// </summary>
|
||||
/// <param name="remoteClient"></param>
|
||||
/// <param name="header"></param>
|
||||
/// <param name="objects"></param>
|
||||
void RezMultipleAttachmentsFromInventory(
|
||||
IClientAPI remoteClient,
|
||||
RezMultipleAttachmentsFromInvPacket.HeaderDataBlock header,
|
||||
RezMultipleAttachmentsFromInvPacket.ObjectDataBlock[] objects);
|
||||
|
||||
/// <summary>
|
||||
/// Detach an object from the avatar.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// This method is called in response to a client's detach request, so we only update the information in
|
||||
/// inventory
|
||||
/// </remarks>
|
||||
/// <param name="objectLocalID"></param>
|
||||
/// <param name="remoteClient"></param>
|
||||
void DetachObject(uint objectLocalID, IClientAPI remoteClient);
|
||||
/// <param name="sp"></param>
|
||||
/// <param name="rezlist"></param>
|
||||
void RezMultipleAttachmentsFromInventory(IScenePresence sp,List<KeyValuePair<UUID, uint>> rezlist);
|
||||
|
||||
/// <summary>
|
||||
/// Detach the given item to the ground.
|
||||
/// </summary>
|
||||
/// <param name="sp"></param>
|
||||
/// <param name="objectLocalID"></param>
|
||||
/// <param name="remoteClient"></param>
|
||||
void DetachSingleAttachmentToGround(uint objectLocalID, IClientAPI remoteClient);
|
||||
void DetachSingleAttachmentToGround(IScenePresence sp, uint objectLocalID);
|
||||
|
||||
/// <summary>
|
||||
/// Detach the given item so that it remains in the user's inventory.
|
||||
/// </summary>
|
||||
/// <param name="itemID">
|
||||
/// A <see cref="UUID"/>
|
||||
/// </param>
|
||||
/// <param name="remoteClient">
|
||||
/// A <see cref="IClientAPI"/>
|
||||
/// </param>
|
||||
void DetachSingleAttachmentToInv(UUID itemID, IClientAPI remoteClient);
|
||||
/// <param name="sp">/param>
|
||||
/// <param name="itemID"></param>
|
||||
void DetachSingleAttachmentToInv(IScenePresence sp, UUID itemID);
|
||||
|
||||
/// Update the position of an attachment.
|
||||
/// </summary>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/*
|
||||
/*
|
||||
* Copyright (c) Contributors, http://opensimulator.org/
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
|
@ -49,6 +49,14 @@ namespace OpenSim.Region.Framework.Interfaces
|
|||
/// <returns></returns>
|
||||
EstateSettings LoadEstateSettings(int estateID);
|
||||
|
||||
/// <summary>
|
||||
/// Create a new estate.
|
||||
/// </summary>
|
||||
/// <returns>
|
||||
/// A <see cref="EstateSettings"/>
|
||||
/// </returns>
|
||||
EstateSettings CreateNewEstate();
|
||||
|
||||
/// <summary>
|
||||
/// Load/Get all estate settings.
|
||||
/// </summary>
|
||||
|
|
|
@ -54,6 +54,14 @@ namespace OpenSim.Region.Framework.Interfaces
|
|||
/// <returns></returns>
|
||||
EstateSettings LoadEstateSettings(int estateID);
|
||||
|
||||
/// <summary>
|
||||
/// Create a new estate.
|
||||
/// </summary>
|
||||
/// <returns>
|
||||
/// A <see cref="EstateSettings"/>
|
||||
/// </returns>
|
||||
EstateSettings CreateNewEstate();
|
||||
|
||||
/// <summary>
|
||||
/// Load/Get all estate settings.
|
||||
/// </summary>
|
||||
|
|
|
@ -35,7 +35,16 @@ namespace OpenSim.Region.Framework.Interfaces
|
|||
/// </summary>
|
||||
public interface IRegionModule
|
||||
{
|
||||
/// <summary>
|
||||
/// Initialize the module.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// For a shared module this can be called multiple times - once per scene.
|
||||
/// </remarks>
|
||||
/// <param name="scene"></param>
|
||||
/// <param name="source">Configuration information. For a shared module this will be identical on every scene call</param>
|
||||
void Initialise(Scene scene, IConfigSource source);
|
||||
|
||||
void PostInitialise();
|
||||
void Close();
|
||||
string Name { get; }
|
||||
|
|
|
@ -181,8 +181,8 @@ TrySetMovementAnimation("STAND");
|
|||
bool heldBack = ((controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG || (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG);
|
||||
bool heldLeft = ((controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS) == AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS || (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_POS) == AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_POS);
|
||||
bool heldRight = ((controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG || (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_NEG);
|
||||
//bool heldTurnLeft = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT) == AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT;
|
||||
//bool heldTurnRight = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT) == AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT;
|
||||
bool heldTurnLeft = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT) == AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT;
|
||||
bool heldTurnRight = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT) == AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT;
|
||||
bool heldUp = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) == AgentManager.ControlFlags.AGENT_CONTROL_UP_POS;
|
||||
bool heldDown = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG;
|
||||
//bool flying = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_FLY) == AgentManager.ControlFlags.AGENT_CONTROL_FLY;
|
||||
|
@ -404,7 +404,17 @@ TrySetMovementAnimation("STAND");
|
|||
else if (m_scenePresence.SetAlwaysRun)
|
||||
return "RUN";
|
||||
else
|
||||
return "WALK";
|
||||
{
|
||||
// Not walking
|
||||
if (move.Z < 0)
|
||||
return "CROUCH";
|
||||
else if (heldTurnLeft)
|
||||
return "TURNLEFT";
|
||||
else if (heldTurnRight)
|
||||
return "TURNRIGHT";
|
||||
else
|
||||
return "WALK";
|
||||
}
|
||||
}
|
||||
// rm for jumping else
|
||||
else if (!m_jumping) // add for jumping
|
||||
|
|
|
@ -120,6 +120,11 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
{
|
||||
m_log.Debug("[ASYNC DELETER]: Starting send to inventory loop");
|
||||
|
||||
// We must set appearance parameters in the en_US culture in order to avoid issues where values are saved
|
||||
// in a culture where decimal points are commas and then reloaded in a culture which just treats them as
|
||||
// number seperators.
|
||||
Culture.SetCurrentCulture();
|
||||
|
||||
while (InventoryDeQueueAndDelete())
|
||||
{
|
||||
//m_log.Debug("[ASYNC DELETER]: Sent item successfully to inventory, continuing...");
|
||||
|
|
|
@ -26,8 +26,10 @@
|
|||
*/
|
||||
|
||||
using System;
|
||||
using System.Reflection;
|
||||
using System.Runtime.Serialization;
|
||||
using System.Security.Permissions;
|
||||
using log4net;
|
||||
using OpenSim.Framework;
|
||||
using OpenMetaverse;
|
||||
|
||||
|
@ -35,6 +37,8 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
{
|
||||
public abstract class EntityBase : ISceneEntity
|
||||
{
|
||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
/// <summary>
|
||||
/// The scene to which this entity belongs
|
||||
/// </summary>
|
||||
|
@ -71,12 +75,15 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
protected Vector3 m_pos;
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// Absolute position of this entity in a scene.
|
||||
/// </summary>
|
||||
public virtual Vector3 AbsolutePosition
|
||||
{
|
||||
get { return m_pos; }
|
||||
set { m_pos = value; }
|
||||
set
|
||||
{
|
||||
m_pos = value;
|
||||
}
|
||||
}
|
||||
|
||||
protected Vector3 m_velocity;
|
||||
|
@ -107,11 +114,6 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
m_name = "(basic entity)";
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public abstract void UpdateMovement();
|
||||
|
||||
/// <summary>
|
||||
/// Performs any updates that need to be done at each frame, as opposed to immediately.
|
||||
/// These included scheduled updates and updates that occur due to physics processing.
|
||||
|
|
|
@ -261,7 +261,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
item.AssetID = asset.FullID;
|
||||
group.UpdateInventoryItem(item);
|
||||
|
||||
part.GetProperties(remoteClient);
|
||||
part.SendPropertiesToClient(remoteClient);
|
||||
|
||||
// Trigger rerunning of script (use TriggerRezScript event, see RezScript)
|
||||
ArrayList errors = new ArrayList();
|
||||
|
@ -316,6 +316,10 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
public void UpdateInventoryItemAsset(IClientAPI remoteClient, UUID transactionID,
|
||||
UUID itemID, InventoryItemBase itemUpd)
|
||||
{
|
||||
// m_log.DebugFormat(
|
||||
// "[USER INVENTORY]: Updating asset for item {0} {1}, transaction ID {2} for {3}",
|
||||
// itemID, itemUpd.Name, transactionID, remoteClient.Name);
|
||||
|
||||
// This one will let people set next perms on items in agent
|
||||
// inventory. Rut-Roh. Whatever. Make this secure. Yeah.
|
||||
//
|
||||
|
@ -368,8 +372,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
IAgentAssetTransactions agentTransactions = this.RequestModuleInterface<IAgentAssetTransactions>();
|
||||
if (agentTransactions != null)
|
||||
{
|
||||
agentTransactions.HandleItemUpdateFromTransaction(
|
||||
remoteClient, transactionID, item);
|
||||
agentTransactions.HandleItemUpdateFromTransaction(remoteClient, transactionID, item);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1005,7 +1008,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
}
|
||||
|
||||
group.RemoveInventoryItem(localID, itemID);
|
||||
part.GetProperties(remoteClient);
|
||||
part.SendPropertiesToClient(remoteClient);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1283,7 +1286,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
|
||||
if (TryGetScenePresence(srcTaskItem.OwnerID, out avatar))
|
||||
{
|
||||
destPart.GetProperties(avatar.ControllingClient);
|
||||
destPart.SendPropertiesToClient(avatar.ControllingClient);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1446,7 +1449,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
m_log.InfoFormat(
|
||||
"[PRIM INVENTORY]: Update with item {0} requested of prim {1} for {2}",
|
||||
item.Name, primLocalID, remoteClient.Name);
|
||||
part.GetProperties(remoteClient);
|
||||
part.SendPropertiesToClient(remoteClient);
|
||||
if (!Permissions.BypassPermissions())
|
||||
{
|
||||
if ((item.CurrentPermissions & (uint)PermissionMask.Copy) == 0)
|
||||
|
@ -1534,7 +1537,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
|
||||
if (part.Inventory.UpdateInventoryItem(itemInfo))
|
||||
{
|
||||
part.GetProperties(remoteClient);
|
||||
part.SendPropertiesToClient(remoteClient);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1586,7 +1589,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
// m_log.InfoFormat("[PRIMINVENTORY]: " +
|
||||
// "Rezzed script {0} into prim local ID {1} for user {2}",
|
||||
// item.inventoryName, localID, remoteClient.Name);
|
||||
part.GetProperties(remoteClient);
|
||||
part.SendPropertiesToClient(remoteClient);
|
||||
part.ParentGroup.ResumeScripts();
|
||||
}
|
||||
else
|
||||
|
@ -1644,7 +1647,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
taskItem.AssetID = asset.FullID;
|
||||
|
||||
part.Inventory.AddInventoryItem(taskItem, false);
|
||||
part.GetProperties(remoteClient);
|
||||
part.SendPropertiesToClient(remoteClient);
|
||||
|
||||
part.Inventory.CreateScriptInstance(taskItem, 0, false, DefaultScriptEngine, 0);
|
||||
part.ParentGroup.ResumeScripts();
|
||||
|
@ -1758,7 +1761,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
|
||||
if (TryGetScenePresence(srcTaskItem.OwnerID, out avatar))
|
||||
{
|
||||
destPart.GetProperties(avatar.ControllingClient);
|
||||
destPart.SendPropertiesToClient(avatar.ControllingClient);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2217,7 +2220,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
SceneObjectPart part = GetSceneObjectPart(localID);
|
||||
if (part == null)
|
||||
continue;
|
||||
part.GetProperties(remoteClient);
|
||||
part.SendPropertiesToClient(remoteClient);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -144,7 +144,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
{
|
||||
if (((SceneObjectGroup) ent).LocalId == primLocalID)
|
||||
{
|
||||
((SceneObjectGroup) ent).GetProperties(remoteClient);
|
||||
((SceneObjectGroup) ent).SendPropertiesToClient(remoteClient);
|
||||
((SceneObjectGroup) ent).IsSelected = true;
|
||||
// A prim is only tainted if it's allowed to be edited by the person clicking it.
|
||||
if (Permissions.CanEditObject(((SceneObjectGroup)ent).UUID, remoteClient.AgentId)
|
||||
|
@ -167,7 +167,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
{
|
||||
if (part.LocalId == primLocalID)
|
||||
{
|
||||
part.GetProperties(remoteClient);
|
||||
part.SendPropertiesToClient(remoteClient);
|
||||
foundPrim = true;
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -896,6 +896,8 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
|
||||
if (dm != null)
|
||||
m_eventManager.OnPermissionError += dm.SendAlertToUser;
|
||||
|
||||
m_eventManager.OnSignificantClientMovement += HandleOnSignificantClientMovement;
|
||||
}
|
||||
|
||||
public override string GetSimulatorVersion()
|
||||
|
@ -1198,87 +1200,6 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
m_dialogModule = RequestModuleInterface<IDialogModule>();
|
||||
m_capsModule = RequestModuleInterface<ICapabilitiesModule>();
|
||||
m_teleportModule = RequestModuleInterface<IEntityTransferModule>();
|
||||
|
||||
// Shoving this in here for now, because we have the needed
|
||||
// interfaces at this point
|
||||
//
|
||||
// TODO: Find a better place for this
|
||||
//
|
||||
while (m_regInfo.EstateSettings.EstateOwner == UUID.Zero && MainConsole.Instance != null)
|
||||
{
|
||||
MainConsole.Instance.OutputFormat("Estate {0} has no owner set.", m_regInfo.EstateSettings.EstateName);
|
||||
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 = UserAccountService.GetUserAccount(m_regInfo.ScopeID, first, last);
|
||||
|
||||
if (account == null)
|
||||
{
|
||||
// Create a new account
|
||||
account = new UserAccount(m_regInfo.ScopeID, first, last, String.Empty);
|
||||
if (account.ServiceURLs == null || (account.ServiceURLs != null && account.ServiceURLs.Count == 0))
|
||||
{
|
||||
account.ServiceURLs = new Dictionary<string, object>();
|
||||
account.ServiceURLs["HomeURI"] = string.Empty;
|
||||
account.ServiceURLs["GatekeeperURI"] = string.Empty;
|
||||
account.ServiceURLs["InventoryServerURI"] = string.Empty;
|
||||
account.ServiceURLs["AssetServerURI"] = string.Empty;
|
||||
}
|
||||
|
||||
if (UserAccountService.StoreUserAccount(account))
|
||||
{
|
||||
string password = MainConsole.Instance.PasswdPrompt("Password");
|
||||
string email = MainConsole.Instance.CmdPrompt("Email", "");
|
||||
|
||||
account.Email = email;
|
||||
UserAccountService.StoreUserAccount(account);
|
||||
|
||||
bool success = false;
|
||||
success = AuthenticationService.SetPassword(account.PrincipalID, password);
|
||||
if (!success)
|
||||
m_log.WarnFormat("[USER ACCOUNT SERVICE]: Unable to set password for account {0} {1}.",
|
||||
first, last);
|
||||
|
||||
GridRegion home = null;
|
||||
if (GridService != null)
|
||||
{
|
||||
List<GridRegion> defaultRegions = GridService.GetDefaultRegions(UUID.Zero);
|
||||
if (defaultRegions != null && defaultRegions.Count >= 1)
|
||||
home = defaultRegions[0];
|
||||
|
||||
if (GridUserService != null && home != null)
|
||||
GridUserService.SetHome(account.PrincipalID.ToString(), home.RegionID, new Vector3(128, 128, 0), new Vector3(0, 1, 0));
|
||||
else
|
||||
m_log.WarnFormat("[USER ACCOUNT SERVICE]: Unable to set home for account {0} {1}.",
|
||||
first, last);
|
||||
|
||||
}
|
||||
else
|
||||
m_log.WarnFormat("[USER ACCOUNT SERVICE]: Unable to retrieve home region for account {0} {1}.",
|
||||
first, last);
|
||||
|
||||
if (InventoryService != null)
|
||||
success = InventoryService.CreateUserInventory(account.PrincipalID);
|
||||
if (!success)
|
||||
m_log.WarnFormat("[USER ACCOUNT SERVICE]: Unable to create inventory for account {0} {1}.",
|
||||
first, last);
|
||||
|
||||
|
||||
m_log.InfoFormat("[USER ACCOUNT SERVICE]: Account {0} {1} created successfully", first, last);
|
||||
|
||||
m_regInfo.EstateSettings.EstateOwner = account.PrincipalID;
|
||||
m_regInfo.EstateSettings.Save();
|
||||
}
|
||||
else
|
||||
m_log.ErrorFormat("[SCENE]: Unable to store account. If this simulator is connected to a grid, you must create the estate owner account first.");
|
||||
}
|
||||
else
|
||||
{
|
||||
m_regInfo.EstateSettings.EstateOwner = account.PrincipalID;
|
||||
m_regInfo.EstateSettings.Save();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
@ -1382,28 +1303,12 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
tempOnRezMS = Util.EnvironmentTickCountSubtract(tmpTempOnRezMS);
|
||||
}
|
||||
|
||||
if (RegionStatus != RegionStatus.SlaveScene)
|
||||
if (Frame % m_update_events == 0)
|
||||
{
|
||||
if (Frame % m_update_events == 0)
|
||||
{
|
||||
int evMS = Util.EnvironmentTickCount();
|
||||
UpdateEvents();
|
||||
eventMS = Util.EnvironmentTickCountSubtract(evMS); ;
|
||||
}
|
||||
|
||||
if (Frame % m_update_backup == 0)
|
||||
{
|
||||
int backMS = Util.EnvironmentTickCount();
|
||||
UpdateStorageBackup();
|
||||
backupMS = Util.EnvironmentTickCountSubtract(backMS);
|
||||
}
|
||||
|
||||
if (Frame % m_update_terrain == 0)
|
||||
{
|
||||
int terMS = Util.EnvironmentTickCount();
|
||||
UpdateTerrain();
|
||||
terrainMS = Util.EnvironmentTickCountSubtract(terMS);
|
||||
}
|
||||
int evMS = Util.EnvironmentTickCount();
|
||||
UpdateEvents();
|
||||
eventMS = Util.EnvironmentTickCountSubtract(evMS); ;
|
||||
}
|
||||
|
||||
// if (Frame % m_update_land == 0)
|
||||
// {
|
||||
|
@ -1412,26 +1317,46 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
// landMS = Util.EnvironmentTickCountSubtract(ldMS);
|
||||
// }
|
||||
|
||||
frameMS = Util.EnvironmentTickCountSubtract(tmpFrameMS);
|
||||
otherMS = tempOnRezMS + eventMS + backupMS + terrainMS + landMS;
|
||||
lastCompletedFrame = Util.EnvironmentTickCount();
|
||||
|
||||
// if (Frame%m_update_avatars == 0)
|
||||
// UpdateInWorldTime();
|
||||
StatsReporter.AddPhysicsFPS(physicsFPS);
|
||||
StatsReporter.AddTimeDilation(TimeDilation);
|
||||
StatsReporter.AddFPS(1);
|
||||
StatsReporter.SetRootAgents(m_sceneGraph.GetRootAgentCount());
|
||||
StatsReporter.SetChildAgents(m_sceneGraph.GetChildAgentCount());
|
||||
StatsReporter.SetObjects(m_sceneGraph.GetTotalObjectsCount());
|
||||
StatsReporter.SetActiveObjects(m_sceneGraph.GetActiveObjectsCount());
|
||||
StatsReporter.addFrameMS(frameMS);
|
||||
StatsReporter.addPhysicsMS(physicsMS + physicsMS2);
|
||||
StatsReporter.addOtherMS(otherMS);
|
||||
StatsReporter.SetActiveScripts(m_sceneGraph.GetActiveScriptsCount());
|
||||
StatsReporter.addScriptLines(m_sceneGraph.GetScriptLPS());
|
||||
if (Frame % m_update_backup == 0)
|
||||
{
|
||||
int backMS = Util.EnvironmentTickCount();
|
||||
UpdateStorageBackup();
|
||||
backupMS = Util.EnvironmentTickCountSubtract(backMS);
|
||||
}
|
||||
|
||||
if (Frame % m_update_terrain == 0)
|
||||
{
|
||||
int terMS = Util.EnvironmentTickCount();
|
||||
UpdateTerrain();
|
||||
terrainMS = Util.EnvironmentTickCountSubtract(terMS);
|
||||
}
|
||||
|
||||
//if (Frame % m_update_land == 0)
|
||||
//{
|
||||
// int ldMS = Util.EnvironmentTickCount();
|
||||
// UpdateLand();
|
||||
// landMS = Util.EnvironmentTickCountSubtract(ldMS);
|
||||
//}
|
||||
|
||||
frameMS = Util.EnvironmentTickCountSubtract(tmpFrameMS);
|
||||
otherMS = tempOnRezMS + eventMS + backupMS + terrainMS + landMS;
|
||||
lastCompletedFrame = Util.EnvironmentTickCount();
|
||||
|
||||
// if (Frame%m_update_avatars == 0)
|
||||
// UpdateInWorldTime();
|
||||
StatsReporter.AddPhysicsFPS(physicsFPS);
|
||||
StatsReporter.AddTimeDilation(TimeDilation);
|
||||
StatsReporter.AddFPS(1);
|
||||
StatsReporter.SetRootAgents(m_sceneGraph.GetRootAgentCount());
|
||||
StatsReporter.SetChildAgents(m_sceneGraph.GetChildAgentCount());
|
||||
StatsReporter.SetObjects(m_sceneGraph.GetTotalObjectsCount());
|
||||
StatsReporter.SetActiveObjects(m_sceneGraph.GetActiveObjectsCount());
|
||||
StatsReporter.addFrameMS(frameMS);
|
||||
StatsReporter.addPhysicsMS(physicsMS + physicsMS2);
|
||||
StatsReporter.addOtherMS(otherMS);
|
||||
StatsReporter.SetActiveScripts(m_sceneGraph.GetActiveScriptsCount());
|
||||
StatsReporter.addScriptLines(m_sceneGraph.GetScriptLPS());
|
||||
|
||||
if (LoginsDisabled && Frame == 20)
|
||||
{
|
||||
// In 99.9% of cases it is a bad idea to manually force garbage collection. However,
|
||||
|
@ -2603,9 +2528,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
RootPrim.RemFlag(PrimFlags.TemporaryOnRez);
|
||||
|
||||
if (AttachmentsModule != null)
|
||||
AttachmentsModule.AttachObject(sp.ControllingClient, grp, 0, false);
|
||||
|
||||
m_log.DebugFormat("[SCENE]: Attachment {0} arrived and scene presence was found, attaching", sceneObject.UUID);
|
||||
AttachmentsModule.AttachObject(sp, grp, 0, false);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -5477,7 +5400,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
return true;
|
||||
}
|
||||
|
||||
public void StartTimerWatchdog()
|
||||
public void StartTimerWatchdog()
|
||||
{
|
||||
m_timerWatchdog.Interval = 1000;
|
||||
m_timerWatchdog.Elapsed += TimerWatchdog;
|
||||
|
@ -5488,6 +5411,70 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
public void TimerWatchdog(object sender, ElapsedEventArgs e)
|
||||
{
|
||||
CheckHeartbeat();
|
||||
}
|
||||
|
||||
/// This method deals with movement when an avatar is automatically moving (but this is distinct from the
|
||||
/// autopilot that moves an avatar to a sit target!.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// This is not intended as a permament location for this method.
|
||||
/// </remarks>
|
||||
/// <param name="presence"></param>
|
||||
private void HandleOnSignificantClientMovement(ScenePresence presence)
|
||||
{
|
||||
if (presence.MovingToTarget)
|
||||
{
|
||||
double distanceToTarget = Util.GetDistanceTo(presence.AbsolutePosition, presence.MoveToPositionTarget);
|
||||
// m_log.DebugFormat(
|
||||
// "[SCENE]: Abs pos of {0} is {1}, target {2}, distance {3}",
|
||||
// presence.Name, presence.AbsolutePosition, presence.MoveToPositionTarget, distanceToTarget);
|
||||
|
||||
// Check the error term of the current position in relation to the target position
|
||||
if (distanceToTarget <= ScenePresence.SIGNIFICANT_MOVEMENT)
|
||||
{
|
||||
// We are close enough to the target
|
||||
// m_log.DebugFormat("[SCENEE]: Stopping autopilot of {0}", presence.Name);
|
||||
|
||||
presence.Velocity = Vector3.Zero;
|
||||
presence.AbsolutePosition = presence.MoveToPositionTarget;
|
||||
presence.ResetMoveToTarget();
|
||||
|
||||
if (presence.PhysicsActor.Flying)
|
||||
{
|
||||
// A horrible hack to stop the avatar dead in its tracks rather than having them overshoot
|
||||
// the target if flying.
|
||||
// We really need to be more subtle (slow the avatar as it approaches the target) or at
|
||||
// least be able to set collision status once, rather than 5 times to give it enough
|
||||
// weighting so that that PhysicsActor thinks it really is colliding.
|
||||
for (int i = 0; i < 5; i++)
|
||||
presence.PhysicsActor.IsColliding = true;
|
||||
|
||||
if (presence.LandAtTarget)
|
||||
presence.PhysicsActor.Flying = false;
|
||||
|
||||
// Vector3 targetPos = presence.MoveToPositionTarget;
|
||||
// float terrainHeight = (float)presence.Scene.Heightmap[(int)targetPos.X, (int)targetPos.Y];
|
||||
// if (targetPos.Z - terrainHeight < 0.2)
|
||||
// {
|
||||
// presence.PhysicsActor.Flying = false;
|
||||
// }
|
||||
}
|
||||
|
||||
// m_log.DebugFormat(
|
||||
// "[SCENE]: AgentControlFlags {0}, MovementFlag {1} for {2}",
|
||||
// presence.AgentControlFlags, presence.MovementFlag, presence.Name);
|
||||
}
|
||||
else
|
||||
{
|
||||
// m_log.DebugFormat(
|
||||
// "[SCENE]: Updating npc {0} at {1} for next movement to {2}",
|
||||
// presence.Name, presence.AbsolutePosition, presence.MoveToPositionTarget);
|
||||
|
||||
Vector3 agent_control_v3 = new Vector3();
|
||||
presence.HandleMoveToTargetUpdate(ref agent_control_v3);
|
||||
presence.AddNewMovement(agent_control_v3);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1312,13 +1312,6 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
part.ClearUndoState();
|
||||
}
|
||||
|
||||
public override void UpdateMovement()
|
||||
{
|
||||
SceneObjectPart[] parts = m_parts.GetArray();
|
||||
for (int i = 0; i < parts.Length; i++)
|
||||
parts[i].UpdateMovement();
|
||||
}
|
||||
|
||||
public ushort GetTimeDilation()
|
||||
{
|
||||
return Utils.FloatToUInt16(m_scene.TimeDilation, 0.0f, 1.0f);
|
||||
|
@ -1486,7 +1479,15 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
avatar.StandUp();
|
||||
|
||||
if (!silent)
|
||||
{
|
||||
part.UpdateFlag = 0;
|
||||
if (part == m_rootPart)
|
||||
{
|
||||
if (!IsAttachment || (AttachedAvatar == avatar.ControllingClient.AgentId) ||
|
||||
(AttachmentPoint < 31) || (AttachmentPoint > 38))
|
||||
avatar.ControllingClient.SendKillObject(m_regionHandle, new List<uint>() {part.LocalId});
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -1939,7 +1940,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
ScenePresence avatar = m_scene.GetScenePresence(AttachedAvatar);
|
||||
if (avatar != null)
|
||||
{
|
||||
avatar.MoveToTarget(target, false);
|
||||
avatar.MoveToTarget(target, false, false);
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@ -2104,8 +2105,6 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
|
||||
#endregion
|
||||
|
||||
#region Scheduling
|
||||
|
||||
public override void Update()
|
||||
{
|
||||
// Check that the group was not deleted before the scheduled update
|
||||
|
@ -2256,7 +2255,14 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
parts[i].SendTerseUpdateToAllClients();
|
||||
}
|
||||
|
||||
#endregion
|
||||
/// <summary>
|
||||
/// Send metadata about the root prim (name, description, sale price, etc.) to a client.
|
||||
/// </summary>
|
||||
/// <param name="client"></param>
|
||||
public void SendPropertiesToClient(IClientAPI client)
|
||||
{
|
||||
m_rootPart.SendPropertiesToClient(client);
|
||||
}
|
||||
|
||||
#region SceneGroupPart Methods
|
||||
|
||||
|
@ -2751,15 +2757,6 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Return metadata about a prim (name, description, sale price, etc.)
|
||||
/// </summary>
|
||||
/// <param name="client"></param>
|
||||
public void GetProperties(IClientAPI client)
|
||||
{
|
||||
m_rootPart.GetProperties(client);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Set the name of a prim
|
||||
/// </summary>
|
||||
|
|
|
@ -804,7 +804,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
if (av.LinkedPrim == m_uuid)
|
||||
{
|
||||
Vector3 offset = (m_offsetPosition - oldpos);
|
||||
av.OffsetPosition += offset;
|
||||
av.AbsolutePosition += offset;
|
||||
av.SendAvatarDataToAllAgents();
|
||||
}
|
||||
}
|
||||
|
@ -1357,8 +1357,6 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
|
||||
#endregion Public Properties with only Get
|
||||
|
||||
#region Private Methods
|
||||
|
||||
private uint ApplyMask(uint val, bool set, uint mask)
|
||||
{
|
||||
if (set)
|
||||
|
@ -1371,14 +1369,35 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
}
|
||||
}
|
||||
|
||||
private void SendObjectPropertiesToClient(UUID AgentID)
|
||||
/// <summary>
|
||||
/// Clear all pending updates of parts to clients
|
||||
/// </summary>
|
||||
private void ClearUpdateSchedule()
|
||||
{
|
||||
m_updateFlag = 0;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Send this part's properties (name, description, inventory serial, base mask, etc.) to a client
|
||||
/// </summary>
|
||||
/// <param name="client"></param>
|
||||
public void SendPropertiesToClient(IClientAPI client)
|
||||
{
|
||||
client.SendObjectPropertiesReply(this);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// For the scene object group to which this part belongs, send that scene object's root part properties to a client.
|
||||
/// </summary>
|
||||
/// <param name="AgentID"></param>
|
||||
private void SendRootPartPropertiesToClient(UUID AgentID)
|
||||
{
|
||||
m_parentGroup.Scene.ForEachScenePresence(delegate(ScenePresence avatar)
|
||||
{
|
||||
// Ugly reference :(
|
||||
if (avatar.UUID == AgentID)
|
||||
{
|
||||
m_parentGroup.GetProperties(avatar.ControllingClient);
|
||||
m_parentGroup.SendPropertiesToClient(avatar.ControllingClient);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -1407,8 +1426,6 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
// }
|
||||
// }
|
||||
|
||||
#endregion Private Methods
|
||||
|
||||
#region Public Methods
|
||||
|
||||
public void ResetExpire()
|
||||
|
@ -1752,20 +1769,6 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
Name, LocalId, id);
|
||||
}
|
||||
|
||||
public static SceneObjectPart Create()
|
||||
{
|
||||
SceneObjectPart part = new SceneObjectPart();
|
||||
part.UUID = UUID.Random();
|
||||
|
||||
PrimitiveBaseShape shape = PrimitiveBaseShape.Create();
|
||||
part.Shape = shape;
|
||||
|
||||
part.Name = "Object";
|
||||
part._ownerID = UUID.Random();
|
||||
|
||||
return part;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Do a physics property update for a NINJA joint.
|
||||
/// </summary>
|
||||
|
@ -2077,11 +2080,6 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
return Vector3.Zero;
|
||||
}
|
||||
|
||||
public void GetProperties(IClientAPI client)
|
||||
{
|
||||
client.SendObjectPropertiesReply(this);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Method for a prim to get it's world position from the group.
|
||||
/// </summary>
|
||||
|
@ -3055,6 +3053,10 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
if (ParentGroup.IsDeleted)
|
||||
return;
|
||||
|
||||
if (ParentGroup.IsAttachment && (ParentGroup.AttachedAvatar != remoteClient.AgentId) &&
|
||||
(ParentGroup.AttachmentPoint >= 31) && (ParentGroup.AttachmentPoint <= 38))
|
||||
return;
|
||||
|
||||
clientFlags &= ~(uint) PrimFlags.CreateSelected;
|
||||
|
||||
if (remoteClient.AgentId == _ownerID)
|
||||
|
@ -3500,7 +3502,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
{
|
||||
_groupID = groupID;
|
||||
if (client != null)
|
||||
GetProperties(client);
|
||||
SendPropertiesToClient(client);
|
||||
m_updateFlag = 2;
|
||||
}
|
||||
|
||||
|
@ -4242,10 +4244,6 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
}
|
||||
}
|
||||
|
||||
public virtual void UpdateMovement()
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
|
@ -4320,10 +4318,10 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
|
||||
break;
|
||||
}
|
||||
|
||||
SendFullUpdateToAllClients();
|
||||
|
||||
SendObjectPropertiesToClient(AgentID);
|
||||
|
||||
SendRootPartPropertiesToClient(AgentID);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -4844,7 +4842,8 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
if (ParentGroup.IsDeleted)
|
||||
return;
|
||||
|
||||
if (ParentGroup.IsAttachment && ParentGroup.RootPart != this)
|
||||
if (ParentGroup.IsAttachment && ((ParentGroup.RootPart != this) ||
|
||||
((ParentGroup.AttachedAvatar != remoteClient.AgentId) && (ParentGroup.AttachmentPoint >= 31) && (ParentGroup.AttachmentPoint <= 38))))
|
||||
return;
|
||||
|
||||
// Causes this thread to dig into the Client Thread Data.
|
||||
|
|
|
@ -988,11 +988,16 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
|
||||
private bool CreateInventoryFileName()
|
||||
{
|
||||
// m_log.DebugFormat(
|
||||
// "[PRIM INVENTORY]: Creating inventory file for {0} {1} {2}, serial {3}",
|
||||
// m_part.Name, m_part.UUID, m_part.LocalId, m_inventorySerial);
|
||||
|
||||
if (m_inventoryFileName == String.Empty ||
|
||||
m_inventoryFileNameSerial < m_inventorySerial)
|
||||
{
|
||||
m_inventoryFileName = "inventory_" + UUID.Random().ToString() + ".tmp";
|
||||
m_inventoryFileNameSerial = m_inventorySerial;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1025,6 +1030,12 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
return;
|
||||
}
|
||||
|
||||
if (m_items.Count == 0) // No inventory
|
||||
{
|
||||
client.SendTaskInventory(m_part.UUID, 0, new byte[0]);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!changed)
|
||||
{
|
||||
if (m_inventoryFileData.Length > 2)
|
||||
|
@ -1096,10 +1107,12 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
if (m_inventoryFileData.Length > 2)
|
||||
{
|
||||
xferManager.AddNewFile(m_inventoryFileName, m_inventoryFileData);
|
||||
client.SendTaskInventory(m_part.UUID, (short)m_inventorySerial,
|
||||
Util.StringToBytes256(m_inventoryFileName));
|
||||
return;
|
||||
}
|
||||
|
||||
client.SendTaskInventory(m_part.UUID, (short)m_inventorySerial,
|
||||
Util.StringToBytes256(m_inventoryFileName));
|
||||
client.SendTaskInventory(m_part.UUID, 0, new byte[0]);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
|
|
@ -71,7 +71,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
{
|
||||
// ~ScenePresence()
|
||||
// {
|
||||
// m_log.Debug("[ScenePresence] Destructor called");
|
||||
// m_log.Debug("[SCENE PRESENCE] Destructor called");
|
||||
// }
|
||||
|
||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
@ -191,8 +191,6 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
|
||||
private Quaternion m_bodyRot = Quaternion.Identity;
|
||||
|
||||
private Quaternion m_bodyRotPrevious = Quaternion.Identity;
|
||||
|
||||
private const int LAND_VELOCITYMAG_MAX = 12;
|
||||
|
||||
public bool IsRestrictedToRegion;
|
||||
|
@ -238,6 +236,11 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
public Vector3 MoveToPositionTarget { get; private set; }
|
||||
private Quaternion m_offsetRotation = new Quaternion(0.0f, 0.0f, 0.0f, 1.0f);
|
||||
|
||||
/// <summary>
|
||||
/// Controls whether an avatar automatically moving to a target will land when it gets there (if flying).
|
||||
/// </summary>
|
||||
public bool LandAtTarget { get; private set; }
|
||||
|
||||
private bool m_followCamAuto;
|
||||
|
||||
private int m_movementUpdateCount;
|
||||
|
@ -492,7 +495,13 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
PhysicsActor actor = m_physicsActor;
|
||||
// if (actor != null)
|
||||
if ((actor != null) && (m_parentID == 0)) // KF Do NOT update m_pos here if Av is sitting!
|
||||
{
|
||||
m_pos = actor.Position;
|
||||
|
||||
// m_log.DebugFormat(
|
||||
// "[SCENE PRESENCE]: Set position {0} for {1} in {2} via getting AbsolutePosition!",
|
||||
// m_pos, Name, Scene.RegionInfo.RegionName);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Obtain the correct position of a seated avatar.
|
||||
|
@ -536,20 +545,28 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
m_log.Error("[SCENEPRESENCE]: ABSOLUTE POSITION " + e.Message);
|
||||
m_log.Error("[SCENE PRESENCE]: ABSOLUTE POSITION " + e.Message);
|
||||
}
|
||||
}
|
||||
|
||||
if (m_parentID == 0) // KF Do NOT update m_pos here if Av is sitting!
|
||||
// Changed this to update unconditionally to make npose work
|
||||
// if (m_parentID == 0) // KF Do NOT update m_pos here if Av is sitting!
|
||||
m_pos = value;
|
||||
m_parentPosition = Vector3.Zero;
|
||||
|
||||
// m_log.DebugFormat(
|
||||
// "[ENTITY BASE]: In {0} set AbsolutePosition of {1} to {2}",
|
||||
// Scene.RegionInfo.RegionName, Name, m_pos);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// If sitting, returns the offset position from the prim the avatar is sitting on.
|
||||
/// Otherwise, returns absolute position in the scene.
|
||||
/// </summary>
|
||||
public Vector3 OffsetPosition
|
||||
{
|
||||
get { return m_pos; }
|
||||
set { m_pos = value; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -561,8 +578,14 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
{
|
||||
PhysicsActor actor = m_physicsActor;
|
||||
if (actor != null)
|
||||
{
|
||||
m_velocity = actor.Velocity;
|
||||
|
||||
// m_log.DebugFormat(
|
||||
// "[SCENE PRESENCE]: Set velocity {0} for {1} in {2} via getting Velocity!",
|
||||
// m_velocity, Name, Scene.RegionInfo.RegionName);
|
||||
}
|
||||
|
||||
return m_velocity;
|
||||
}
|
||||
set
|
||||
|
@ -577,11 +600,15 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
m_log.Error("[SCENEPRESENCE]: VELOCITY " + e.Message);
|
||||
m_log.Error("[SCENE PRESENCE]: VELOCITY " + e.Message);
|
||||
}
|
||||
}
|
||||
|
||||
m_velocity = value;
|
||||
|
||||
// m_log.DebugFormat(
|
||||
// "[SCENE PRESENCE]: In {0} set velocity of {1} to {2}",
|
||||
// Scene.RegionInfo.RegionName, Name, m_velocity);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -620,12 +647,6 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
}
|
||||
}
|
||||
|
||||
public Quaternion PreviousRotation
|
||||
{
|
||||
get { return m_bodyRotPrevious; }
|
||||
set { m_bodyRotPrevious = value; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// If this is true, agent doesn't have a representation in this scene.
|
||||
/// this is an agent 'looking into' this scene from a nearby scene(region)
|
||||
|
@ -1126,7 +1147,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
Animator.ResetAnimations();
|
||||
|
||||
// m_log.DebugFormat(
|
||||
// "[SCENEPRESENCE]: Downgrading root agent {0}, {1} to a child agent in {2}",
|
||||
// "[SCENE PRESENCE]: Downgrading root agent {0}, {1} to a child agent in {2}",
|
||||
// Name, UUID, m_scene.RegionInfo.RegionName);
|
||||
|
||||
// Don't zero out the velocity since this can cause problems when an avatar is making a region crossing,
|
||||
|
@ -1302,7 +1323,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
m_callbackURI = null;
|
||||
}
|
||||
|
||||
//m_log.DebugFormat("Completed movement");
|
||||
//m_log.DebugFormat("[SCENE PRESENCE] Completed movement");
|
||||
|
||||
m_controllingClient.MoveAgentIntoRegion(m_scene.RegionInfo, AbsolutePosition, look);
|
||||
SendInitialData();
|
||||
|
@ -1813,7 +1834,10 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
/// This is to allow movement to targets that are known to be on an elevated platform with a continuous path
|
||||
/// from start to finish.
|
||||
/// </param>
|
||||
public void MoveToTarget(Vector3 pos, bool noFly)
|
||||
/// <param name="landAtTarget">
|
||||
/// If true and the avatar starts flying during the move then land at the target.
|
||||
/// </param>
|
||||
public void MoveToTarget(Vector3 pos, bool noFly, bool landAtTarget)
|
||||
{
|
||||
m_log.DebugFormat(
|
||||
"[SCENE PRESENCE]: Avatar {0} received request to move to position {1} in {2}",
|
||||
|
@ -1839,7 +1863,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
|
||||
// Fudge factor. It appears that if one clicks "go here" on a piece of ground, the go here request is
|
||||
// always slightly higher than the actual terrain height.
|
||||
// FIXME: This constrains NOC movements as well, so should be somewhere else.
|
||||
// FIXME: This constrains NPC movements as well, so should be somewhere else.
|
||||
if (pos.Z - terrainHeight < 0.2)
|
||||
pos.Z = terrainHeight;
|
||||
|
||||
|
@ -1852,9 +1876,25 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
else if (pos.Z > terrainHeight)
|
||||
PhysicsActor.Flying = true;
|
||||
|
||||
LandAtTarget = landAtTarget;
|
||||
MovingToTarget = true;
|
||||
MoveToPositionTarget = pos;
|
||||
|
||||
// Rotate presence around the z-axis to point in same direction as movement.
|
||||
// Ignore z component of vector
|
||||
Vector3 localVectorToTarget3D = pos - AbsolutePosition;
|
||||
Vector3 localVectorToTarget2D = new Vector3((float)(localVectorToTarget3D.X), (float)(localVectorToTarget3D.Y), 0f);
|
||||
|
||||
// m_log.DebugFormat("[SCENE PRESENCE]: Local vector to target is {0}", localVectorToTarget2D);
|
||||
|
||||
// Calculate the yaw.
|
||||
Vector3 angle = new Vector3(0, 0, (float)(Math.Atan2(localVectorToTarget2D.Y, localVectorToTarget2D.X)));
|
||||
|
||||
// m_log.DebugFormat("[SCENE PRESENCE]: Angle is {0}", angle);
|
||||
|
||||
Rotation = Quaternion.CreateFromEulers(angle);
|
||||
// m_log.DebugFormat("[SCENE PRESENCE]: Body rot for {0} set to {1}", Name, Rotation);
|
||||
|
||||
Vector3 agent_control_v3 = new Vector3();
|
||||
HandleMoveToTargetUpdate(ref agent_control_v3);
|
||||
AddNewMovement(agent_control_v3);
|
||||
|
@ -2744,7 +2784,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
Vector3 pos = m_pos;
|
||||
pos.Z += m_appearance.HipOffset;
|
||||
|
||||
//m_log.DebugFormat("[SCENEPRESENCE]: TerseUpdate: Pos={0} Rot={1} Vel={2}", m_pos, m_bodyRot, m_velocity);
|
||||
//m_log.DebugFormat("[SCENE PRESENCE]: " + Name + " sending TerseUpdate to " + remoteClient.Name + " : Pos={0} Rot={1} Vel={2}", m_pos, m_bodyRot, m_velocity);
|
||||
|
||||
remoteClient.SendPrimUpdate(
|
||||
this,
|
||||
|
@ -2831,6 +2871,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
/// </summary>
|
||||
private void SendInitialData()
|
||||
{
|
||||
//m_log.DebugFormat("[SCENE PRESENCE] SendInitialData: {0} ({1})", Name, UUID);
|
||||
// Moved this into CompleteMovement to ensure that m_appearance is initialized before
|
||||
// the inventory arrives
|
||||
// m_scene.GetAvatarAppearance(m_controllingClient, out m_appearance);
|
||||
|
@ -2875,10 +2916,11 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
/// </summary>
|
||||
public void SendAvatarDataToAllAgents()
|
||||
{
|
||||
//m_log.DebugFormat("[SCENE PRESENCE] SendAvatarDataToAllAgents: {0} ({1})", Name, UUID);
|
||||
// only send update from root agents to other clients; children are only "listening posts"
|
||||
if (IsChildAgent)
|
||||
{
|
||||
m_log.Warn("[SCENEPRESENCE] attempt to send avatar data from a child agent");
|
||||
m_log.Warn("[SCENE PRESENCE] attempt to send avatar data from a child agent");
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -2928,7 +2970,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
/// <param name="avatar"></param>
|
||||
public void SendAvatarDataToAgent(ScenePresence avatar)
|
||||
{
|
||||
// m_log.WarnFormat("[SP] Send avatar data from {0} to {1}",m_uuid,avatar.ControllingClient.AgentId);
|
||||
//m_log.DebugFormat("[SCENE PRESENCE] SendAvatarDataToAgent from {0} ({1}) to {2} ({3})", Name, UUID, avatar.Name, avatar.UUID);
|
||||
|
||||
avatar.ControllingClient.SendAvatarDataImmediate(this);
|
||||
if (Animator != null)
|
||||
|
@ -2941,10 +2983,11 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
/// </summary>
|
||||
public void SendAppearanceToAllOtherAgents()
|
||||
{
|
||||
m_log.DebugFormat("[SCENE PRESENCE] SendAppearanceToAllOtherAgents: {0} ({1})", Name, UUID);
|
||||
// only send update from root agents to other clients; children are only "listening posts"
|
||||
if (IsChildAgent)
|
||||
{
|
||||
m_log.Warn("[SCENEPRESENCE] attempt to send avatar data from a child agent");
|
||||
m_log.Warn("[SCENE PRESENCE] attempt to send avatar data from a child agent");
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -2970,6 +3013,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
/// </summary>
|
||||
public void SendOtherAgentsAppearanceToMe()
|
||||
{
|
||||
//m_log.DebugFormat("[SCENE PRESENCE] SendOtherAgentsAppearanceToMe: {0} ({1})", Name, UUID);
|
||||
m_perfMonMS = Util.EnvironmentTickCount();
|
||||
|
||||
int count = 0;
|
||||
|
@ -3618,7 +3662,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
/// <summary>
|
||||
/// Handles part of the PID controller function for moving an avatar.
|
||||
/// </summary>
|
||||
public override void UpdateMovement()
|
||||
public void UpdateMovement()
|
||||
{
|
||||
if (m_forceToApply.HasValue)
|
||||
{
|
||||
|
@ -3637,6 +3681,10 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
/// </summary>
|
||||
public void AddToPhysicalScene(bool isFlying)
|
||||
{
|
||||
// m_log.DebugFormat(
|
||||
// "[SCENE PRESENCE]: Adding physics actor for {0}, ifFlying = {1} in {2}",
|
||||
// Name, isFlying, Scene.RegionInfo.RegionName);
|
||||
|
||||
if (m_appearance.AvatarHeight == 0)
|
||||
m_appearance.SetHeight();
|
||||
|
||||
|
|
|
@ -0,0 +1,135 @@
|
|||
/*
|
||||
* 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.Reflection;
|
||||
using log4net;
|
||||
using Nini.Config;
|
||||
using NUnit.Framework;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Framework.Communications;
|
||||
using OpenSim.Region.Framework.Interfaces;
|
||||
using OpenSim.Region.Framework.Scenes;
|
||||
using OpenSim.Tests.Common;
|
||||
using OpenSim.Tests.Common.Mock;
|
||||
|
||||
namespace OpenSim.Region.Framework.Scenes.Tests
|
||||
{
|
||||
[TestFixture]
|
||||
public class ScenePresenceAutopilotTests
|
||||
{
|
||||
private TestScene m_scene;
|
||||
|
||||
[TestFixtureSetUp]
|
||||
public void FixtureInit()
|
||||
{
|
||||
// Don't allow tests to be bamboozled by asynchronous events. Execute everything on the same thread.
|
||||
Util.FireAndForgetMethod = FireAndForgetMethod.None;
|
||||
}
|
||||
|
||||
[TestFixtureTearDown]
|
||||
public void TearDown()
|
||||
{
|
||||
// We must set this back afterwards, otherwise later tests will fail since they're expecting multiple
|
||||
// threads. Possibly, later tests should be rewritten not to worry about such things.
|
||||
Util.FireAndForgetMethod = Util.DefaultFireAndForgetMethod;
|
||||
}
|
||||
|
||||
[SetUp]
|
||||
public void Init()
|
||||
{
|
||||
m_scene = SceneHelpers.SetupScene();
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestMove()
|
||||
{
|
||||
TestHelpers.InMethod();
|
||||
// log4net.Config.XmlConfigurator.Configure();
|
||||
|
||||
ScenePresence sp = SceneHelpers.AddScenePresence(m_scene, TestHelpers.ParseTail(0x1));
|
||||
|
||||
Vector3 startPos = sp.AbsolutePosition;
|
||||
// Vector3 startPos = new Vector3(128, 128, 30);
|
||||
|
||||
// For now, we'll make the scene presence fly to simplify this test, but this needs to change.
|
||||
sp.PhysicsActor.Flying = true;
|
||||
|
||||
m_scene.Update();
|
||||
Assert.That(sp.AbsolutePosition, Is.EqualTo(startPos));
|
||||
|
||||
Vector3 targetPos = startPos + new Vector3(0, 10, 0);
|
||||
sp.MoveToTarget(targetPos, false, false);
|
||||
|
||||
Assert.That(sp.AbsolutePosition, Is.EqualTo(startPos));
|
||||
Assert.That(
|
||||
sp.Rotation, new QuaternionToleranceConstraint(new Quaternion(0, 0, 0.7071068f, 0.7071068f), 0.000001));
|
||||
|
||||
m_scene.Update();
|
||||
|
||||
// We should really check the exact figure.
|
||||
Assert.That(sp.AbsolutePosition.X, Is.EqualTo(startPos.X));
|
||||
Assert.That(sp.AbsolutePosition.Y, Is.GreaterThan(startPos.Y));
|
||||
Assert.That(sp.AbsolutePosition.Z, Is.EqualTo(startPos.Z));
|
||||
Assert.That(sp.AbsolutePosition.Z, Is.LessThan(targetPos.X));
|
||||
|
||||
for (int i = 0; i < 10; i++)
|
||||
m_scene.Update();
|
||||
|
||||
double distanceToTarget = Util.GetDistanceTo(sp.AbsolutePosition, targetPos);
|
||||
Assert.That(distanceToTarget, Is.LessThan(1), "Avatar not within 1 unit of target position on first move");
|
||||
Assert.That(sp.AbsolutePosition, Is.EqualTo(targetPos));
|
||||
Assert.That(sp.AgentControlFlags, Is.EqualTo((uint)AgentManager.ControlFlags.NONE));
|
||||
|
||||
// Try a second movement
|
||||
startPos = sp.AbsolutePosition;
|
||||
targetPos = startPos + new Vector3(10, 0, 0);
|
||||
sp.MoveToTarget(targetPos, false, false);
|
||||
|
||||
Assert.That(sp.AbsolutePosition, Is.EqualTo(startPos));
|
||||
Assert.That(
|
||||
sp.Rotation, new QuaternionToleranceConstraint(new Quaternion(0, 0, 0, 1), 0.000001));
|
||||
|
||||
m_scene.Update();
|
||||
|
||||
// We should really check the exact figure.
|
||||
Assert.That(sp.AbsolutePosition.X, Is.GreaterThan(startPos.X));
|
||||
Assert.That(sp.AbsolutePosition.X, Is.LessThan(targetPos.X));
|
||||
Assert.That(sp.AbsolutePosition.Y, Is.EqualTo(startPos.Y));
|
||||
Assert.That(sp.AbsolutePosition.Z, Is.EqualTo(startPos.Z));
|
||||
|
||||
for (int i = 0; i < 10; i++)
|
||||
m_scene.Update();
|
||||
|
||||
distanceToTarget = Util.GetDistanceTo(sp.AbsolutePosition, targetPos);
|
||||
Assert.That(distanceToTarget, Is.LessThan(1), "Avatar not within 1 unit of target position on second move");
|
||||
Assert.That(sp.AbsolutePosition, Is.EqualTo(targetPos));
|
||||
}
|
||||
}
|
||||
}
|
|
@ -806,7 +806,7 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server
|
|||
public event ScriptReset OnScriptReset;
|
||||
public event GetScriptRunning OnGetScriptRunning;
|
||||
public event SetScriptRunning OnSetScriptRunning;
|
||||
public event Action<Vector3, bool> OnAutoPilotGo;
|
||||
public event Action<Vector3, bool, bool> OnAutoPilotGo;
|
||||
public event TerrainUnacked OnUnackedTerrain;
|
||||
public event ActivateGesture OnActivateGesture;
|
||||
public event DeactivateGesture OnDeactivateGesture;
|
||||
|
|
|
@ -37,11 +37,6 @@ namespace OpenSim.Region.OptionalModules.World.NPC
|
|||
{
|
||||
public class NPCAvatar : IClientAPI
|
||||
{
|
||||
/// <summary>
|
||||
/// Signal whether the avatar should land when it reaches a move target
|
||||
/// </summary>
|
||||
public bool LandAtTarget { get; set; }
|
||||
|
||||
private readonly string m_firstname;
|
||||
private readonly string m_lastname;
|
||||
private readonly Vector3 m_startPos;
|
||||
|
@ -333,7 +328,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC
|
|||
public event ScriptReset OnScriptReset;
|
||||
public event GetScriptRunning OnGetScriptRunning;
|
||||
public event SetScriptRunning OnSetScriptRunning;
|
||||
public event Action<Vector3, bool> OnAutoPilotGo;
|
||||
public event Action<Vector3, bool, bool> OnAutoPilotGo;
|
||||
|
||||
public event TerrainUnacked OnUnackedTerrain;
|
||||
|
||||
|
|
|
@ -53,78 +53,13 @@ namespace OpenSim.Region.OptionalModules.World.NPC
|
|||
if (config != null && config.GetBoolean("Enabled", false))
|
||||
{
|
||||
scene.RegisterModuleInterface<INPCModule>(this);
|
||||
scene.EventManager.OnSignificantClientMovement += HandleOnSignificantClientMovement;
|
||||
}
|
||||
}
|
||||
|
||||
public void HandleOnSignificantClientMovement(ScenePresence presence)
|
||||
{
|
||||
lock (m_avatars)
|
||||
{
|
||||
if (m_avatars.ContainsKey(presence.UUID) && presence.MovingToTarget)
|
||||
{
|
||||
double distanceToTarget = Util.GetDistanceTo(presence.AbsolutePosition, presence.MoveToPositionTarget);
|
||||
// m_log.DebugFormat(
|
||||
// "[NPC MODULE]: Abs pos of {0} is {1}, target {2}, distance {3}",
|
||||
// presence.Name, presence.AbsolutePosition, presence.MoveToPositionTarget, distanceToTarget);
|
||||
|
||||
// Check the error term of the current position in relation to the target position
|
||||
if (distanceToTarget <= ScenePresence.SIGNIFICANT_MOVEMENT)
|
||||
{
|
||||
// We are close enough to the target
|
||||
m_log.DebugFormat("[NPC MODULE]: Stopping movement of npc {0}", presence.Name);
|
||||
|
||||
presence.Velocity = Vector3.Zero;
|
||||
presence.AbsolutePosition = presence.MoveToPositionTarget;
|
||||
presence.ResetMoveToTarget();
|
||||
|
||||
if (presence.PhysicsActor.Flying)
|
||||
{
|
||||
// A horrible hack to stop the NPC dead in its tracks rather than having them overshoot
|
||||
// the target if flying.
|
||||
// We really need to be more subtle (slow the avatar as it approaches the target) or at
|
||||
// least be able to set collision status once, rather than 5 times to give it enough
|
||||
// weighting so that that PhysicsActor thinks it really is colliding.
|
||||
for (int i = 0; i < 5; i++)
|
||||
presence.PhysicsActor.IsColliding = true;
|
||||
|
||||
// Vector3 targetPos = presence.MoveToPositionTarget;
|
||||
if (m_avatars[presence.UUID].LandAtTarget)
|
||||
presence.PhysicsActor.Flying = false;
|
||||
|
||||
// float terrainHeight = (float)presence.Scene.Heightmap[(int)targetPos.X, (int)targetPos.Y];
|
||||
// if (targetPos.Z - terrainHeight < 0.2)
|
||||
// {
|
||||
// presence.PhysicsActor.Flying = false;
|
||||
// }
|
||||
}
|
||||
|
||||
// m_log.DebugFormat(
|
||||
// "[NPC MODULE]: AgentControlFlags {0}, MovementFlag {1} for {2}",
|
||||
// presence.AgentControlFlags, presence.MovementFlag, presence.Name);
|
||||
}
|
||||
else
|
||||
{
|
||||
// m_log.DebugFormat(
|
||||
// "[NPC MODULE]: Updating npc {0} at {1} for next movement to {2}",
|
||||
// presence.Name, presence.AbsolutePosition, presence.MoveToPositionTarget);
|
||||
|
||||
Vector3 agent_control_v3 = new Vector3();
|
||||
presence.HandleMoveToTargetUpdate(ref agent_control_v3);
|
||||
presence.AddNewMovement(agent_control_v3);
|
||||
}
|
||||
//
|
||||
//// presence.DoMoveToPositionUpdate((0, presence.MoveToPositionTarget, null);
|
||||
|
||||
//
|
||||
//
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public bool IsNPC(UUID agentId, Scene scene)
|
||||
{
|
||||
// FIXME: This implementation could not just use the ScenePresence.PresenceType (and callers could inspect
|
||||
// that directly).
|
||||
ScenePresence sp = scene.GetScenePresence(agentId);
|
||||
if (sp == null || sp.IsChildAgent)
|
||||
return false;
|
||||
|
@ -218,8 +153,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC
|
|||
"[NPC MODULE]: Moving {0} to {1} in {2}, noFly {3}, landAtTarget {4}",
|
||||
sp.Name, pos, scene.RegionInfo.RegionName, noFly, landAtTarget);
|
||||
|
||||
m_avatars[agentID].LandAtTarget = landAtTarget;
|
||||
sp.MoveToTarget(pos, noFly);
|
||||
sp.MoveToTarget(pos, noFly, landAtTarget);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -132,11 +132,9 @@ namespace OpenSim.Region.OptionalModules.World.NPC.Tests
|
|||
UUID attAssetId = TestHelpers.ParseTail(0x3);
|
||||
string attName = "att";
|
||||
|
||||
UserInventoryHelpers.CreateInventoryItem(
|
||||
scene, attName, attItemId, attAssetId, sp.UUID, InventoryType.Object);
|
||||
UserInventoryHelpers.CreateInventoryItem(scene, attName, attItemId, attAssetId, sp.UUID, InventoryType.Object);
|
||||
|
||||
am.RezSingleAttachmentFromInventory(
|
||||
sp.ControllingClient, attItemId, (uint)AttachmentPoint.Chest);
|
||||
am.RezSingleAttachmentFromInventory(sp, attItemId, (uint)AttachmentPoint.Chest);
|
||||
|
||||
INPCModule npcModule = scene.RequestModuleInterface<INPCModule>();
|
||||
UUID npcId = npcModule.CreateNPC("John", "Smith", new Vector3(128, 128, 30), scene, sp.Appearance);
|
||||
|
@ -182,18 +180,21 @@ namespace OpenSim.Region.OptionalModules.World.NPC.Tests
|
|||
scene.Update();
|
||||
Assert.That(npc.AbsolutePosition, Is.EqualTo(startPos));
|
||||
|
||||
Vector3 targetPos = startPos + new Vector3(0, 0, 10);
|
||||
Vector3 targetPos = startPos + new Vector3(0, 10, 0);
|
||||
npcModule.MoveToTarget(npc.UUID, scene, targetPos, false, false);
|
||||
|
||||
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, new QuaternionToleranceConstraint(new Quaternion(0, 0, 0.7071068f, 0.7071068f), 0.000001));
|
||||
|
||||
scene.Update();
|
||||
|
||||
// We should really check the exact figure.
|
||||
Assert.That(npc.AbsolutePosition.X, Is.EqualTo(startPos.X));
|
||||
Assert.That(npc.AbsolutePosition.Y, Is.EqualTo(startPos.Y));
|
||||
Assert.That(npc.AbsolutePosition.Z, Is.GreaterThan(startPos.Z));
|
||||
Assert.That(npc.AbsolutePosition.Z, Is.LessThan(targetPos.Z));
|
||||
Assert.That(npc.AbsolutePosition.Y, Is.GreaterThan(startPos.Y));
|
||||
Assert.That(npc.AbsolutePosition.Z, Is.EqualTo(startPos.Z));
|
||||
Assert.That(npc.AbsolutePosition.Z, Is.LessThan(targetPos.X));
|
||||
|
||||
for (int i = 0; i < 10; i++)
|
||||
scene.Update();
|
||||
|
@ -208,6 +209,11 @@ namespace OpenSim.Region.OptionalModules.World.NPC.Tests
|
|||
targetPos = startPos + new Vector3(10, 0, 0);
|
||||
npcModule.MoveToTarget(npc.UUID, scene, targetPos, false, false);
|
||||
|
||||
Assert.That(npc.AbsolutePosition, Is.EqualTo(startPos));
|
||||
// Assert.That(npc.Rotation, Is.EqualTo(new Quaternion(0, 0, 0, 1)));
|
||||
Assert.That(
|
||||
npc.Rotation, new QuaternionToleranceConstraint(new Quaternion(0, 0, 0, 1), 0.000001));
|
||||
|
||||
scene.Update();
|
||||
|
||||
// We should really check the exact figure.
|
||||
|
|
|
@ -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("BulletDotNETPlugin")]
|
||||
[assembly : AssemblyDescription("")]
|
||||
[assembly : AssemblyConfiguration("")]
|
||||
[assembly : AssemblyCompany("http://opensimulator.org")]
|
||||
[assembly : AssemblyProduct("OdePlugin")]
|
||||
[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.3.*")]
|
File diff suppressed because it is too large
Load Diff
|
@ -1,65 +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 OpenSim.Region.Physics.Manager;
|
||||
|
||||
namespace OpenSim.Region.Physics.BulletDotNETPlugin
|
||||
{
|
||||
public class BulletDotNetPlugin : IPhysicsPlugin
|
||||
{
|
||||
private BulletDotNETScene m_scene;
|
||||
private const string m_pluginName = "BulletDotNETPlugin";
|
||||
|
||||
#region IPhysicsPlugin Members
|
||||
|
||||
public bool Init()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
public PhysicsScene GetScene(string sceneIdentifier)
|
||||
{
|
||||
if (m_scene == null)
|
||||
{
|
||||
m_scene = new BulletDotNETScene(sceneIdentifier);
|
||||
}
|
||||
return m_scene;
|
||||
}
|
||||
|
||||
public string GetName()
|
||||
{
|
||||
return m_pluginName;
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
|
@ -1,60 +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;
|
||||
|
||||
public enum StatusIndicators : int
|
||||
{
|
||||
Generic = 0,
|
||||
Start = 1,
|
||||
End = 2
|
||||
}
|
||||
|
||||
public struct sCollisionData
|
||||
{
|
||||
public uint ColliderLocalId;
|
||||
public uint CollidedWithLocalId;
|
||||
public int NumberOfCollisions;
|
||||
public int CollisionType;
|
||||
public int StatusIndicator;
|
||||
public int lastframe;
|
||||
}
|
||||
|
||||
[Flags]
|
||||
public enum CollisionCategories : int
|
||||
{
|
||||
Disabled = 0,
|
||||
Geom = 0x00000001,
|
||||
Body = 0x00000002,
|
||||
Space = 0x00000004,
|
||||
Character = 0x00000008,
|
||||
Land = 0x00000010,
|
||||
Water = 0x00000020,
|
||||
Wind = 0x00000040,
|
||||
Sensor = 0x00000080,
|
||||
Selected = 0x00000100
|
||||
}
|
File diff suppressed because it is too large
Load Diff
|
@ -1,776 +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 System.Reflection;
|
||||
using System.IO;
|
||||
using System.Diagnostics;
|
||||
using System.Threading;
|
||||
using log4net;
|
||||
using Nini.Config;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Region.Physics.Manager;
|
||||
using OpenMetaverse;
|
||||
using BulletDotNET;
|
||||
|
||||
namespace OpenSim.Region.Physics.BulletDotNETPlugin
|
||||
{
|
||||
public class BulletDotNETScene : PhysicsScene
|
||||
{
|
||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
// private string m_sceneIdentifier = string.Empty;
|
||||
|
||||
private List<BulletDotNETCharacter> m_characters = new List<BulletDotNETCharacter>();
|
||||
private Dictionary<uint, BulletDotNETCharacter> m_charactersLocalID = new Dictionary<uint, BulletDotNETCharacter>();
|
||||
private List<BulletDotNETPrim> m_prims = new List<BulletDotNETPrim>();
|
||||
private Dictionary<uint, BulletDotNETPrim> m_primsLocalID = new Dictionary<uint, BulletDotNETPrim>();
|
||||
private List<BulletDotNETPrim> m_activePrims = new List<BulletDotNETPrim>();
|
||||
private List<PhysicsActor> m_taintedActors = new List<PhysicsActor>();
|
||||
private btDiscreteDynamicsWorld m_world;
|
||||
private btAxisSweep3 m_broadphase;
|
||||
private btCollisionConfiguration m_collisionConfiguration;
|
||||
private btConstraintSolver m_solver;
|
||||
private btCollisionDispatcher m_dispatcher;
|
||||
private btHeightfieldTerrainShape m_terrainShape;
|
||||
public btRigidBody TerrainBody;
|
||||
private btVector3 m_terrainPosition;
|
||||
private btVector3 m_gravity;
|
||||
public btMotionState m_terrainMotionState;
|
||||
public btTransform m_terrainTransform;
|
||||
public btVector3 VectorZero;
|
||||
public btQuaternion QuatIdentity;
|
||||
public btTransform TransZero;
|
||||
|
||||
public float geomDefaultDensity = 10.000006836f;
|
||||
|
||||
private float avPIDD = 65f;
|
||||
private float avPIDP = 21f;
|
||||
private float avCapRadius = 0.37f;
|
||||
private float avStandupTensor = 2000000f;
|
||||
private float avDensity = 80f;
|
||||
private float avHeightFudgeFactor = 0.52f;
|
||||
private float avMovementDivisorWalk = 1.8f;
|
||||
private float avMovementDivisorRun = 0.8f;
|
||||
|
||||
// private float minimumGroundFlightOffset = 3f;
|
||||
|
||||
public bool meshSculptedPrim = true;
|
||||
|
||||
public float meshSculptLOD = 32;
|
||||
public float MeshSculptphysicalLOD = 16;
|
||||
|
||||
public float bodyPIDD = 35f;
|
||||
public float bodyPIDG = 25;
|
||||
internal int geomCrossingFailuresBeforeOutofbounds = 4;
|
||||
|
||||
public float bodyMotorJointMaxforceTensor = 2;
|
||||
|
||||
public int bodyFramesAutoDisable = 20;
|
||||
|
||||
public float WorldTimeStep = 10f/60f;
|
||||
public const float WorldTimeComp = 1/60f;
|
||||
public float gravityz = -9.8f;
|
||||
|
||||
private float[] _origheightmap; // Used for Fly height. Kitto Flora
|
||||
private bool usingGImpactAlgorithm = false;
|
||||
|
||||
// private IConfigSource m_config;
|
||||
private readonly btVector3 worldAabbMin = new btVector3(-10f, -10f, 0);
|
||||
private readonly btVector3 worldAabbMax = new btVector3((int)Constants.RegionSize + 10f, (int)Constants.RegionSize + 10f, 9000);
|
||||
|
||||
public IMesher mesher;
|
||||
private ContactAddedCallbackHandler m_CollisionInterface;
|
||||
|
||||
public BulletDotNETScene(string sceneIdentifier)
|
||||
{
|
||||
// m_sceneIdentifier = sceneIdentifier;
|
||||
VectorZero = new btVector3(0, 0, 0);
|
||||
QuatIdentity = new btQuaternion(0, 0, 0, 1);
|
||||
TransZero = new btTransform(QuatIdentity, VectorZero);
|
||||
m_gravity = new btVector3(0, 0, gravityz);
|
||||
_origheightmap = new float[(int)Constants.RegionSize * (int)Constants.RegionSize];
|
||||
|
||||
}
|
||||
|
||||
public override void Initialise(IMesher meshmerizer, IConfigSource config)
|
||||
{
|
||||
mesher = meshmerizer;
|
||||
// m_config = config;
|
||||
/*
|
||||
if (Environment.OSVersion.Platform == PlatformID.Unix)
|
||||
{
|
||||
m_log.Fatal("[BulletDotNET]: This configuration is not supported on *nix currently");
|
||||
Thread.Sleep(5000);
|
||||
Environment.Exit(0);
|
||||
}
|
||||
*/
|
||||
m_broadphase = new btAxisSweep3(worldAabbMin, worldAabbMax, 16000);
|
||||
m_collisionConfiguration = new btDefaultCollisionConfiguration();
|
||||
m_solver = new btSequentialImpulseConstraintSolver();
|
||||
m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration);
|
||||
m_world = new btDiscreteDynamicsWorld(m_dispatcher, m_broadphase, m_solver, m_collisionConfiguration);
|
||||
m_world.setGravity(m_gravity);
|
||||
EnableCollisionInterface();
|
||||
|
||||
|
||||
}
|
||||
|
||||
public override PhysicsActor AddAvatar(string avName, Vector3 position, Vector3 size, bool isFlying)
|
||||
{
|
||||
BulletDotNETCharacter chr = new BulletDotNETCharacter(avName, this, position, size, avPIDD, avPIDP,
|
||||
avCapRadius, avStandupTensor, avDensity,
|
||||
avHeightFudgeFactor, avMovementDivisorWalk,
|
||||
avMovementDivisorRun);
|
||||
try
|
||||
{
|
||||
m_characters.Add(chr);
|
||||
m_charactersLocalID.Add(chr.m_localID, chr);
|
||||
}
|
||||
catch
|
||||
{
|
||||
// noop if it's already there
|
||||
m_log.Debug("[PHYSICS] BulletDotNet: adding duplicate avatar localID");
|
||||
}
|
||||
AddPhysicsActorTaint(chr);
|
||||
return chr;
|
||||
}
|
||||
|
||||
public override void RemoveAvatar(PhysicsActor actor)
|
||||
{
|
||||
BulletDotNETCharacter chr = (BulletDotNETCharacter) actor;
|
||||
|
||||
m_charactersLocalID.Remove(chr.m_localID);
|
||||
m_characters.Remove(chr);
|
||||
m_world.removeRigidBody(chr.Body);
|
||||
m_world.removeCollisionObject(chr.Body);
|
||||
|
||||
chr.Remove();
|
||||
AddPhysicsActorTaint(chr);
|
||||
//chr = null;
|
||||
}
|
||||
|
||||
public override void RemovePrim(PhysicsActor prim)
|
||||
{
|
||||
if (prim is BulletDotNETPrim)
|
||||
{
|
||||
|
||||
BulletDotNETPrim p = (BulletDotNETPrim)prim;
|
||||
|
||||
p.setPrimForRemoval();
|
||||
AddPhysicsActorTaint(prim);
|
||||
//RemovePrimThreadLocked(p);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
private PhysicsActor AddPrim(String name, Vector3 position, Vector3 size, Quaternion rotation,
|
||||
IMesh mesh, PrimitiveBaseShape pbs, bool isphysical)
|
||||
{
|
||||
Vector3 pos = position;
|
||||
//pos.X = position.X;
|
||||
//pos.Y = position.Y;
|
||||
//pos.Z = position.Z;
|
||||
Vector3 siz = Vector3.Zero;
|
||||
siz.X = size.X;
|
||||
siz.Y = size.Y;
|
||||
siz.Z = size.Z;
|
||||
Quaternion rot = rotation;
|
||||
|
||||
BulletDotNETPrim newPrim;
|
||||
|
||||
newPrim = new BulletDotNETPrim(name, this, pos, siz, rot, mesh, pbs, isphysical);
|
||||
|
||||
//lock (m_prims)
|
||||
// m_prims.Add(newPrim);
|
||||
|
||||
|
||||
return newPrim;
|
||||
}
|
||||
|
||||
public override PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, Vector3 position, Vector3 size, Quaternion rotation, bool isPhysical, uint localid)
|
||||
{
|
||||
PhysicsActor result;
|
||||
IMesh mesh = null;
|
||||
|
||||
//switch (pbs.ProfileShape)
|
||||
//{
|
||||
// case ProfileShape.Square:
|
||||
// //support simple box & hollow box now; later, more shapes
|
||||
// if (needsMeshing(pbs))
|
||||
// {
|
||||
// mesh = mesher.CreateMesh(primName, pbs, size, 32f, isPhysical);
|
||||
// }
|
||||
|
||||
// break;
|
||||
//}
|
||||
|
||||
if (needsMeshing(pbs))
|
||||
mesh = mesher.CreateMesh(primName, pbs, size, 32f, isPhysical);
|
||||
|
||||
result = AddPrim(primName, position, size, rotation, mesh, pbs, isPhysical);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public override void AddPhysicsActorTaint(PhysicsActor prim)
|
||||
{
|
||||
lock (m_taintedActors)
|
||||
{
|
||||
if (!m_taintedActors.Contains(prim))
|
||||
{
|
||||
m_taintedActors.Add(prim);
|
||||
}
|
||||
}
|
||||
}
|
||||
internal void SetUsingGImpact()
|
||||
{
|
||||
if (!usingGImpactAlgorithm)
|
||||
btGImpactCollisionAlgorithm.registerAlgorithm(m_dispatcher);
|
||||
usingGImpactAlgorithm = true;
|
||||
}
|
||||
|
||||
public override float Simulate(float timeStep)
|
||||
{
|
||||
|
||||
lock (m_taintedActors)
|
||||
{
|
||||
foreach (PhysicsActor act in m_taintedActors)
|
||||
{
|
||||
if (act is BulletDotNETCharacter)
|
||||
((BulletDotNETCharacter) act).ProcessTaints(timeStep);
|
||||
if (act is BulletDotNETPrim)
|
||||
((BulletDotNETPrim)act).ProcessTaints(timeStep);
|
||||
}
|
||||
m_taintedActors.Clear();
|
||||
}
|
||||
|
||||
lock (m_characters)
|
||||
{
|
||||
foreach (BulletDotNETCharacter chr in m_characters)
|
||||
{
|
||||
chr.Move(timeStep);
|
||||
}
|
||||
}
|
||||
|
||||
lock (m_prims)
|
||||
{
|
||||
foreach (BulletDotNETPrim prim in m_prims)
|
||||
{
|
||||
if (prim != null)
|
||||
prim.Move(timeStep);
|
||||
}
|
||||
}
|
||||
float steps = m_world.stepSimulation(timeStep, 10, WorldTimeComp);
|
||||
|
||||
foreach (BulletDotNETCharacter chr in m_characters)
|
||||
{
|
||||
chr.UpdatePositionAndVelocity();
|
||||
}
|
||||
|
||||
foreach (BulletDotNETPrim prm in m_activePrims)
|
||||
{
|
||||
/*
|
||||
if (prm != null)
|
||||
if (prm.Body != null)
|
||||
*/
|
||||
prm.UpdatePositionAndVelocity();
|
||||
}
|
||||
if (m_CollisionInterface != null)
|
||||
{
|
||||
List<BulletDotNETPrim> primsWithCollisions = new List<BulletDotNETPrim>();
|
||||
List<BulletDotNETCharacter> charactersWithCollisions = new List<BulletDotNETCharacter>();
|
||||
|
||||
// get the collisions that happened this tick
|
||||
List<BulletDotNET.ContactAddedCallbackHandler.ContactInfo> collisions = m_CollisionInterface.GetContactList();
|
||||
// passed back the localID of the prim so we can associate the prim
|
||||
foreach (BulletDotNET.ContactAddedCallbackHandler.ContactInfo ci in collisions)
|
||||
{
|
||||
// ContactPoint = { contactPoint, contactNormal, penetrationDepth }
|
||||
ContactPoint contact = new ContactPoint(new Vector3(ci.pX, ci.pY, ci.pZ),
|
||||
new Vector3(ci.nX, ci.nY, ci.nZ), ci.depth);
|
||||
|
||||
ProcessContact(ci.contact, ci.contactWith, contact, ref primsWithCollisions, ref charactersWithCollisions);
|
||||
ProcessContact(ci.contactWith, ci.contact, contact, ref primsWithCollisions, ref charactersWithCollisions);
|
||||
|
||||
}
|
||||
m_CollisionInterface.Clear();
|
||||
// for those prims and characters that had collisions cause collision events
|
||||
foreach (BulletDotNETPrim bdnp in primsWithCollisions)
|
||||
{
|
||||
bdnp.SendCollisions();
|
||||
}
|
||||
foreach (BulletDotNETCharacter bdnc in charactersWithCollisions)
|
||||
{
|
||||
bdnc.SendCollisions();
|
||||
}
|
||||
}
|
||||
return steps;
|
||||
}
|
||||
|
||||
private void ProcessContact(uint cont, uint contWith, ContactPoint contact,
|
||||
ref List<BulletDotNETPrim> primsWithCollisions,
|
||||
ref List<BulletDotNETCharacter> charactersWithCollisions)
|
||||
{
|
||||
BulletDotNETPrim bdnp;
|
||||
// collisions with a normal prim?
|
||||
if (m_primsLocalID.TryGetValue(cont, out bdnp))
|
||||
{
|
||||
// Added collision event to the prim. This creates a pile of events
|
||||
// that will be sent to any subscribed listeners.
|
||||
bdnp.AddCollision(contWith, contact);
|
||||
if (!primsWithCollisions.Contains(bdnp))
|
||||
{
|
||||
primsWithCollisions.Add(bdnp);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
BulletDotNETCharacter bdnc;
|
||||
// if not a prim, maybe it's one of the characters
|
||||
if (m_charactersLocalID.TryGetValue(cont, out bdnc))
|
||||
{
|
||||
bdnc.AddCollision(contWith, contact);
|
||||
if (!charactersWithCollisions.Contains(bdnc))
|
||||
{
|
||||
charactersWithCollisions.Add(bdnc);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public override void GetResults()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public override void SetTerrain(float[] heightMap)
|
||||
{
|
||||
if (m_terrainShape != null)
|
||||
DeleteTerrain();
|
||||
|
||||
float hfmax = -9000;
|
||||
float hfmin = 90000;
|
||||
|
||||
for (int i = 0; i <heightMap.Length;i++)
|
||||
{
|
||||
if (Single.IsNaN(heightMap[i]) || Single.IsInfinity(heightMap[i]))
|
||||
{
|
||||
heightMap[i] = 0f;
|
||||
}
|
||||
|
||||
hfmin = (heightMap[i] < hfmin) ? heightMap[i] : hfmin;
|
||||
hfmax = (heightMap[i] > hfmax) ? heightMap[i] : hfmax;
|
||||
}
|
||||
// store this for later reference.
|
||||
// Note, we're storing it after we check it for anomolies above
|
||||
_origheightmap = heightMap;
|
||||
|
||||
hfmin = 0;
|
||||
hfmax = 256;
|
||||
|
||||
m_terrainShape = new btHeightfieldTerrainShape((int)Constants.RegionSize, (int)Constants.RegionSize, heightMap,
|
||||
1.0f, hfmin, hfmax, (int)btHeightfieldTerrainShape.UPAxis.Z,
|
||||
(int)btHeightfieldTerrainShape.PHY_ScalarType.PHY_FLOAT, false);
|
||||
float AabbCenterX = Constants.RegionSize/2f;
|
||||
float AabbCenterY = Constants.RegionSize/2f;
|
||||
|
||||
float AabbCenterZ = 0;
|
||||
float temphfmin, temphfmax;
|
||||
|
||||
temphfmin = hfmin;
|
||||
temphfmax = hfmax;
|
||||
|
||||
if (temphfmin < 0)
|
||||
{
|
||||
temphfmax = 0 - temphfmin;
|
||||
temphfmin = 0 - temphfmin;
|
||||
}
|
||||
else if (temphfmin > 0)
|
||||
{
|
||||
temphfmax = temphfmax + (0 - temphfmin);
|
||||
//temphfmin = temphfmin + (0 - temphfmin);
|
||||
}
|
||||
AabbCenterZ = temphfmax/2f;
|
||||
|
||||
if (m_terrainPosition == null)
|
||||
{
|
||||
m_terrainPosition = new btVector3(AabbCenterX, AabbCenterY, AabbCenterZ);
|
||||
}
|
||||
else
|
||||
{
|
||||
try
|
||||
{
|
||||
m_terrainPosition.setValue(AabbCenterX, AabbCenterY, AabbCenterZ);
|
||||
}
|
||||
catch (ObjectDisposedException)
|
||||
{
|
||||
m_terrainPosition = new btVector3(AabbCenterX, AabbCenterY, AabbCenterZ);
|
||||
}
|
||||
}
|
||||
if (m_terrainMotionState != null)
|
||||
{
|
||||
m_terrainMotionState.Dispose();
|
||||
m_terrainMotionState = null;
|
||||
}
|
||||
m_terrainTransform = new btTransform(QuatIdentity, m_terrainPosition);
|
||||
m_terrainMotionState = new btDefaultMotionState(m_terrainTransform);
|
||||
TerrainBody = new btRigidBody(0, m_terrainMotionState, m_terrainShape);
|
||||
TerrainBody.setUserPointer((IntPtr)0);
|
||||
m_world.addRigidBody(TerrainBody);
|
||||
|
||||
|
||||
}
|
||||
|
||||
public override void SetWaterLevel(float baseheight)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public override void DeleteTerrain()
|
||||
{
|
||||
if (TerrainBody != null)
|
||||
{
|
||||
m_world.removeRigidBody(TerrainBody);
|
||||
}
|
||||
|
||||
if (m_terrainShape != null)
|
||||
{
|
||||
m_terrainShape.Dispose();
|
||||
m_terrainShape = null;
|
||||
}
|
||||
|
||||
if (m_terrainMotionState != null)
|
||||
{
|
||||
m_terrainMotionState.Dispose();
|
||||
m_terrainMotionState = null;
|
||||
}
|
||||
|
||||
if (m_terrainTransform != null)
|
||||
{
|
||||
m_terrainTransform.Dispose();
|
||||
m_terrainTransform = null;
|
||||
}
|
||||
|
||||
if (m_terrainPosition != null)
|
||||
{
|
||||
m_terrainPosition.Dispose();
|
||||
m_terrainPosition = null;
|
||||
}
|
||||
}
|
||||
|
||||
public override void Dispose()
|
||||
{
|
||||
disposeAllBodies();
|
||||
m_world.Dispose();
|
||||
m_broadphase.Dispose();
|
||||
((btDefaultCollisionConfiguration) m_collisionConfiguration).Dispose();
|
||||
((btSequentialImpulseConstraintSolver) m_solver).Dispose();
|
||||
worldAabbMax.Dispose();
|
||||
worldAabbMin.Dispose();
|
||||
VectorZero.Dispose();
|
||||
QuatIdentity.Dispose();
|
||||
m_gravity.Dispose();
|
||||
VectorZero = null;
|
||||
QuatIdentity = null;
|
||||
}
|
||||
|
||||
public override Dictionary<uint, float> GetTopColliders()
|
||||
{
|
||||
return new Dictionary<uint, float>();
|
||||
}
|
||||
|
||||
public btDiscreteDynamicsWorld getBulletWorld()
|
||||
{
|
||||
return m_world;
|
||||
}
|
||||
|
||||
private void disposeAllBodies()
|
||||
{
|
||||
lock (m_prims)
|
||||
{
|
||||
m_primsLocalID.Clear();
|
||||
foreach (BulletDotNETPrim prim in m_prims)
|
||||
{
|
||||
if (prim.Body != null)
|
||||
m_world.removeRigidBody(prim.Body);
|
||||
|
||||
prim.Dispose();
|
||||
}
|
||||
m_prims.Clear();
|
||||
|
||||
foreach (BulletDotNETCharacter chr in m_characters)
|
||||
{
|
||||
if (chr.Body != null)
|
||||
m_world.removeRigidBody(chr.Body);
|
||||
chr.Dispose();
|
||||
}
|
||||
m_characters.Clear();
|
||||
}
|
||||
}
|
||||
|
||||
public override bool IsThreaded
|
||||
{
|
||||
get { return false; }
|
||||
}
|
||||
|
||||
internal void addCollisionEventReporting(PhysicsActor bulletDotNETCharacter)
|
||||
{
|
||||
//TODO: FIXME:
|
||||
}
|
||||
|
||||
internal void remCollisionEventReporting(PhysicsActor bulletDotNETCharacter)
|
||||
{
|
||||
//TODO: FIXME:
|
||||
}
|
||||
|
||||
internal void AddRigidBody(btRigidBody Body)
|
||||
{
|
||||
m_world.addRigidBody(Body);
|
||||
}
|
||||
[Obsolete("bad!")]
|
||||
internal void removeFromWorld(btRigidBody body)
|
||||
{
|
||||
|
||||
m_world.removeRigidBody(body);
|
||||
}
|
||||
|
||||
internal void removeFromWorld(BulletDotNETPrim prm ,btRigidBody body)
|
||||
{
|
||||
lock (m_prims)
|
||||
{
|
||||
if (m_prims.Contains(prm))
|
||||
{
|
||||
m_world.removeRigidBody(body);
|
||||
}
|
||||
remActivePrim(prm);
|
||||
m_primsLocalID.Remove(prm.m_localID);
|
||||
m_prims.Remove(prm);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
internal float GetWaterLevel()
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
// Recovered for use by fly height. Kitto Flora
|
||||
public float GetTerrainHeightAtXY(float x, float y)
|
||||
{
|
||||
// Teravus: Kitto, this code causes recurring errors that stall physics permenantly unless
|
||||
// the values are checked, so checking below.
|
||||
// Is there any reason that we don't do this in ScenePresence?
|
||||
// The only physics engine that benefits from it in the physics plugin is this one
|
||||
|
||||
if (x > (int)Constants.RegionSize || y > (int)Constants.RegionSize ||
|
||||
x < 0.001f || y < 0.001f)
|
||||
return 0;
|
||||
|
||||
return _origheightmap[(int)y * Constants.RegionSize + (int)x];
|
||||
}
|
||||
// End recovered. Kitto Flora
|
||||
|
||||
/// <summary>
|
||||
/// Routine to figure out if we need to mesh this prim with our mesher
|
||||
/// </summary>
|
||||
/// <param name="pbs"></param>
|
||||
/// <returns></returns>
|
||||
public bool needsMeshing(PrimitiveBaseShape pbs)
|
||||
{
|
||||
// most of this is redundant now as the mesher will return null if it cant mesh a prim
|
||||
// but we still need to check for sculptie meshing being enabled so this is the most
|
||||
// convenient place to do it for now...
|
||||
|
||||
// //if (pbs.PathCurve == (byte)Primitive.PathCurve.Circle && pbs.ProfileCurve == (byte)Primitive.ProfileCurve.Circle && pbs.PathScaleY <= 0.75f)
|
||||
// //m_log.Debug("needsMeshing: " + " pathCurve: " + pbs.PathCurve.ToString() + " profileCurve: " + pbs.ProfileCurve.ToString() + " pathScaleY: " + Primitive.UnpackPathScale(pbs.PathScaleY).ToString());
|
||||
int iPropertiesNotSupportedDefault = 0;
|
||||
|
||||
if (pbs.SculptEntry && !meshSculptedPrim)
|
||||
{
|
||||
#if SPAM
|
||||
m_log.Warn("NonMesh");
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
|
||||
// if it's a standard box or sphere with no cuts, hollows, twist or top shear, return false since ODE can use an internal representation for the prim
|
||||
if ((pbs.ProfileShape == ProfileShape.Square && pbs.PathCurve == (byte)Extrusion.Straight)
|
||||
|| (pbs.ProfileShape == ProfileShape.HalfCircle && pbs.PathCurve == (byte)Extrusion.Curve1
|
||||
&& pbs.Scale.X == pbs.Scale.Y && pbs.Scale.Y == pbs.Scale.Z))
|
||||
{
|
||||
|
||||
if (pbs.ProfileBegin == 0 && pbs.ProfileEnd == 0
|
||||
&& pbs.ProfileHollow == 0
|
||||
&& pbs.PathTwist == 0 && pbs.PathTwistBegin == 0
|
||||
&& pbs.PathBegin == 0 && pbs.PathEnd == 0
|
||||
&& pbs.PathTaperX == 0 && pbs.PathTaperY == 0
|
||||
&& pbs.PathScaleX == 100 && pbs.PathScaleY == 100
|
||||
&& pbs.PathShearX == 0 && pbs.PathShearY == 0)
|
||||
{
|
||||
#if SPAM
|
||||
m_log.Warn("NonMesh");
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (pbs.ProfileHollow != 0)
|
||||
iPropertiesNotSupportedDefault++;
|
||||
|
||||
if ((pbs.PathBegin != 0) || pbs.PathEnd != 0)
|
||||
iPropertiesNotSupportedDefault++;
|
||||
|
||||
if ((pbs.PathTwistBegin != 0) || (pbs.PathTwist != 0))
|
||||
iPropertiesNotSupportedDefault++;
|
||||
|
||||
if ((pbs.ProfileBegin != 0) || pbs.ProfileEnd != 0)
|
||||
iPropertiesNotSupportedDefault++;
|
||||
|
||||
if ((pbs.PathScaleX != 100) || (pbs.PathScaleY != 100))
|
||||
iPropertiesNotSupportedDefault++;
|
||||
|
||||
if ((pbs.PathShearX != 0) || (pbs.PathShearY != 0))
|
||||
iPropertiesNotSupportedDefault++;
|
||||
|
||||
if (pbs.ProfileShape == ProfileShape.Circle && pbs.PathCurve == (byte)Extrusion.Straight)
|
||||
iPropertiesNotSupportedDefault++;
|
||||
|
||||
if (pbs.ProfileShape == ProfileShape.HalfCircle && pbs.PathCurve == (byte)Extrusion.Curve1 && (pbs.Scale.X != pbs.Scale.Y || pbs.Scale.Y != pbs.Scale.Z || pbs.Scale.Z != pbs.Scale.X))
|
||||
iPropertiesNotSupportedDefault++;
|
||||
|
||||
if (pbs.ProfileShape == ProfileShape.HalfCircle && pbs.PathCurve == (byte)Extrusion.Curve1)
|
||||
iPropertiesNotSupportedDefault++;
|
||||
|
||||
// test for torus
|
||||
if ((pbs.ProfileCurve & 0x07) == (byte)ProfileShape.Square)
|
||||
{
|
||||
if (pbs.PathCurve == (byte)Extrusion.Curve1)
|
||||
{
|
||||
iPropertiesNotSupportedDefault++;
|
||||
}
|
||||
}
|
||||
else if ((pbs.ProfileCurve & 0x07) == (byte)ProfileShape.Circle)
|
||||
{
|
||||
if (pbs.PathCurve == (byte)Extrusion.Straight)
|
||||
{
|
||||
iPropertiesNotSupportedDefault++;
|
||||
}
|
||||
|
||||
// ProfileCurve seems to combine hole shape and profile curve so we need to only compare against the lower 3 bits
|
||||
else if (pbs.PathCurve == (byte)Extrusion.Curve1)
|
||||
{
|
||||
iPropertiesNotSupportedDefault++;
|
||||
}
|
||||
}
|
||||
else if ((pbs.ProfileCurve & 0x07) == (byte)ProfileShape.HalfCircle)
|
||||
{
|
||||
if (pbs.PathCurve == (byte)Extrusion.Curve1 || pbs.PathCurve == (byte)Extrusion.Curve2)
|
||||
{
|
||||
iPropertiesNotSupportedDefault++;
|
||||
}
|
||||
}
|
||||
else if ((pbs.ProfileCurve & 0x07) == (byte)ProfileShape.EquilateralTriangle)
|
||||
{
|
||||
if (pbs.PathCurve == (byte)Extrusion.Straight)
|
||||
{
|
||||
iPropertiesNotSupportedDefault++;
|
||||
}
|
||||
else if (pbs.PathCurve == (byte)Extrusion.Curve1)
|
||||
{
|
||||
iPropertiesNotSupportedDefault++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (iPropertiesNotSupportedDefault == 0)
|
||||
{
|
||||
#if SPAM
|
||||
m_log.Warn("NonMesh");
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
#if SPAM
|
||||
m_log.Debug("Mesh");
|
||||
#endif
|
||||
return true;
|
||||
}
|
||||
|
||||
internal void addActivePrim(BulletDotNETPrim pPrim)
|
||||
{
|
||||
lock (m_activePrims)
|
||||
{
|
||||
if (!m_activePrims.Contains(pPrim))
|
||||
{
|
||||
m_activePrims.Add(pPrim);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void remActivePrim(BulletDotNETPrim pDeactivatePrim)
|
||||
{
|
||||
lock (m_activePrims)
|
||||
{
|
||||
m_activePrims.Remove(pDeactivatePrim);
|
||||
}
|
||||
}
|
||||
|
||||
internal void AddPrimToScene(BulletDotNETPrim pPrim)
|
||||
{
|
||||
lock (m_prims)
|
||||
{
|
||||
if (!m_prims.Contains(pPrim))
|
||||
{
|
||||
try
|
||||
{
|
||||
m_prims.Add(pPrim);
|
||||
m_primsLocalID.Add(pPrim.m_localID, pPrim);
|
||||
}
|
||||
catch
|
||||
{
|
||||
// noop if it's already there
|
||||
m_log.Debug("[PHYSICS] BulletDotNet: adding duplicate prim localID");
|
||||
}
|
||||
m_world.addRigidBody(pPrim.Body);
|
||||
// m_log.Debug("[PHYSICS] added prim to scene");
|
||||
}
|
||||
}
|
||||
}
|
||||
internal void EnableCollisionInterface()
|
||||
{
|
||||
if (m_CollisionInterface == null)
|
||||
{
|
||||
m_CollisionInterface = new ContactAddedCallbackHandler(m_world);
|
||||
// m_world.SetCollisionAddedCallback(m_CollisionInterface);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
|
@ -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("BulletXPlugin")]
|
||||
[assembly : AssemblyDescription("")]
|
||||
[assembly : AssemblyConfiguration("")]
|
||||
[assembly : AssemblyCompany("http://opensimulator.org")]
|
||||
[assembly : AssemblyProduct("BulletXPlugin")]
|
||||
[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.*")]
|
File diff suppressed because it is too large
Load Diff
|
@ -1,197 +0,0 @@
|
|||
/*
|
||||
Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru
|
||||
Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
/*
|
||||
This file contains a class TriangleIndexVertexArray. I tried using the class with the same name
|
||||
from the BulletX implementation and found it unusable for the purpose of using triangle meshes
|
||||
within BulletX as the implementation was painfully incomplete.
|
||||
The attempt to derive from the original class failed as viable members were hidden.
|
||||
Fiddling around with BulletX itself was not my intention.
|
||||
So I copied the class to the BulletX-plugin and modified it.
|
||||
If you want to fiddle around with it it's up to you to move all this to BulletX.
|
||||
If someone someday implements the missing functionality in BulletX, feel free to remove this class.
|
||||
It's just an ugly hack.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using MonoXnaCompactMaths;
|
||||
using XnaDevRu.BulletX;
|
||||
|
||||
namespace OpenSim.Region.Physics.BulletXPlugin
|
||||
{
|
||||
/// <summary>
|
||||
/// IndexedMesh indexes into existing vertex and index arrays, in a similar way OpenGL glDrawElements
|
||||
/// instead of the number of indices, we pass the number of triangles
|
||||
/// </summary>
|
||||
public struct IndexedMesh
|
||||
{
|
||||
private int _numTriangles;
|
||||
private int[] _triangleIndexBase;
|
||||
private int _triangleIndexStride;
|
||||
private int _numVertices;
|
||||
private Vector3[] _vertexBase;
|
||||
private int _vertexStride;
|
||||
|
||||
public IndexedMesh(int numTriangleIndices, int[] triangleIndexBase, int triangleIndexStride, int numVertices,
|
||||
Vector3[] vertexBase, int vertexStride)
|
||||
{
|
||||
_numTriangles = numTriangleIndices;
|
||||
_triangleIndexBase = triangleIndexBase;
|
||||
_triangleIndexStride = triangleIndexStride;
|
||||
_vertexBase = vertexBase;
|
||||
_numVertices = numVertices;
|
||||
_vertexStride = vertexStride;
|
||||
}
|
||||
|
||||
public IndexedMesh(int[] triangleIndexBase, Vector3[] vertexBase)
|
||||
{
|
||||
_numTriangles = triangleIndexBase.Length;
|
||||
_triangleIndexBase = triangleIndexBase;
|
||||
_triangleIndexStride = 32;
|
||||
_vertexBase = vertexBase;
|
||||
_numVertices = vertexBase.Length;
|
||||
_vertexStride = 24;
|
||||
}
|
||||
|
||||
public int TriangleCount
|
||||
{
|
||||
get { return _numTriangles; }
|
||||
set { _numTriangles = value; }
|
||||
}
|
||||
|
||||
public int[] TriangleIndexBase
|
||||
{
|
||||
get { return _triangleIndexBase; }
|
||||
set { _triangleIndexBase = value; }
|
||||
}
|
||||
|
||||
public int TriangleIndexStride
|
||||
{
|
||||
get { return _triangleIndexStride; }
|
||||
set { _triangleIndexStride = value; }
|
||||
}
|
||||
|
||||
public int VertexCount
|
||||
{
|
||||
get { return _numVertices; }
|
||||
set { _numVertices = value; }
|
||||
}
|
||||
|
||||
public Vector3[] VertexBase
|
||||
{
|
||||
get { return _vertexBase; }
|
||||
set { _vertexBase = value; }
|
||||
}
|
||||
|
||||
public int VertexStride
|
||||
{
|
||||
get { return _vertexStride; }
|
||||
set { _vertexStride = value; }
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// TriangleIndexVertexArray allows to use multiple meshes, by indexing into existing triangle/index arrays.
|
||||
/// Additional meshes can be added using addIndexedMesh
|
||||
/// </summary>
|
||||
public class TriangleIndexVertexArray : StridingMeshInterface
|
||||
{
|
||||
private List<IndexedMesh> _indexedMeshes = new List<IndexedMesh>();
|
||||
|
||||
public TriangleIndexVertexArray()
|
||||
{
|
||||
}
|
||||
|
||||
public TriangleIndexVertexArray(int numTriangleIndices, int[] triangleIndexBase, int triangleIndexStride,
|
||||
int numVertices, Vector3[] vertexBase, int vertexStride)
|
||||
{
|
||||
IndexedMesh mesh = new IndexedMesh();
|
||||
mesh.TriangleCount = numTriangleIndices;
|
||||
mesh.TriangleIndexBase = triangleIndexBase;
|
||||
mesh.TriangleIndexStride = triangleIndexStride;
|
||||
mesh.VertexBase = vertexBase;
|
||||
mesh.VertexCount = numVertices;
|
||||
mesh.VertexStride = vertexStride;
|
||||
|
||||
AddIndexedMesh(mesh);
|
||||
}
|
||||
|
||||
public TriangleIndexVertexArray(int[] triangleIndexBase, Vector3[] vertexBase)
|
||||
: this(triangleIndexBase.Length, triangleIndexBase, 32, vertexBase.Length, vertexBase, 24)
|
||||
{
|
||||
}
|
||||
|
||||
public void AddIndexedMesh(IndexedMesh indexedMesh)
|
||||
{
|
||||
_indexedMeshes.Add(indexedMesh);
|
||||
}
|
||||
|
||||
public override void GetLockedVertexIndexBase(out List<Vector3> verts, out List<int> indicies, out int numfaces,
|
||||
int subpart)
|
||||
{
|
||||
throw new Exception("The method or operation is not implemented.");
|
||||
}
|
||||
|
||||
public override void GetLockedReadOnlyVertexIndexBase(out List<Vector3> verts, out List<int> indicies,
|
||||
out int numfaces, int subpart)
|
||||
{
|
||||
IndexedMesh m = _indexedMeshes[0];
|
||||
Vector3[] vertexBase = m.VertexBase;
|
||||
verts = new List<Vector3>();
|
||||
foreach (Vector3 v in vertexBase)
|
||||
{
|
||||
verts.Add(v);
|
||||
}
|
||||
int[] indexBase = m.TriangleIndexBase;
|
||||
indicies = new List<int>();
|
||||
foreach (int i in indexBase)
|
||||
{
|
||||
indicies.Add(i);
|
||||
}
|
||||
numfaces = vertexBase.GetLength(0);
|
||||
}
|
||||
|
||||
public override void UnLockVertexBase(int subpart)
|
||||
{
|
||||
throw new Exception("The method or operation is not implemented.");
|
||||
}
|
||||
|
||||
public override void UnLockReadOnlyVertexBase(int subpart)
|
||||
{
|
||||
}
|
||||
|
||||
public override int SubPartsCount()
|
||||
{
|
||||
return _indexedMeshes.Count;
|
||||
}
|
||||
|
||||
public override void PreallocateVertices(int numverts)
|
||||
{
|
||||
throw new Exception("The method or operation is not implemented.");
|
||||
}
|
||||
|
||||
public override void PreallocateIndices(int numindices)
|
||||
{
|
||||
throw new Exception("The method or operation is not implemented.");
|
||||
}
|
||||
}
|
||||
}
|
|
@ -464,10 +464,12 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
m_pidControllerActive = true;
|
||||
|
||||
Vector3 SetSize = value;
|
||||
m_tainted_CAPSULE_LENGTH = (SetSize.Z*1.15f) - CAPSULE_RADIUS*2.0f;
|
||||
//m_log.Info("[SIZE]: " + CAPSULE_LENGTH.ToString());
|
||||
m_tainted_CAPSULE_LENGTH = (SetSize.Z * 1.15f) - CAPSULE_RADIUS * 2.0f;
|
||||
// m_log.Info("[SIZE]: " + CAPSULE_LENGTH);
|
||||
|
||||
Velocity = Vector3.Zero;
|
||||
// If we reset velocity here, then an avatar stalls when it crosses a border for the first time
|
||||
// (as the height of the new root agent is set).
|
||||
// Velocity = Vector3.Zero;
|
||||
|
||||
_parent_scene.AddPhysicsActorTaint(this);
|
||||
}
|
||||
|
@ -785,6 +787,8 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
{
|
||||
m_log.Warn("[PHYSICS]: Got a NaN velocity from Scene in a Character");
|
||||
}
|
||||
|
||||
// m_log.DebugFormat("[PHYSICS]: Set target velocity of {0}", _target_velocity);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1324,6 +1328,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
{
|
||||
if (Shell != IntPtr.Zero && Body != IntPtr.Zero && Amotor != IntPtr.Zero)
|
||||
{
|
||||
// m_log.DebugFormat("[PHYSICS]: Changing capsule size");
|
||||
|
||||
m_pidControllerActive = true;
|
||||
// no lock needed on _parent_scene.OdeLock because we are called from within the thread lock in OdePlugin's simulate()
|
||||
|
@ -1335,7 +1340,10 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
d.GeomDestroy(Shell);
|
||||
AvatarGeomAndBodyCreation(_position.X, _position.Y,
|
||||
_position.Z + (Math.Abs(CAPSULE_LENGTH - prevCapsule) * 2), m_tensor);
|
||||
Velocity = Vector3.Zero;
|
||||
|
||||
// As with Size, we reset velocity. However, this isn't strictly necessary since it doesn't
|
||||
// appear to stall initial region crossings when done here. Being done for consistency.
|
||||
// Velocity = Vector3.Zero;
|
||||
|
||||
_parent_scene.geom_name_map[Shell] = m_name;
|
||||
_parent_scene.actor_name_map[Shell] = (PhysicsActor)this;
|
||||
|
@ -1360,7 +1368,6 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
_position.Z = m_taintPosition.Z;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
internal void AddCollisionFrameTime(int p)
|
||||
|
|
|
@ -1526,6 +1526,7 @@ Console.WriteLine("changeadd 1");
|
|||
{
|
||||
if (Body == IntPtr.Zero)
|
||||
enableBody();
|
||||
|
||||
//Prim auto disable after 20 frames,
|
||||
//if you move it, re-enable the prim manually.
|
||||
if (_parent != null)
|
||||
|
@ -1536,6 +1537,7 @@ Console.WriteLine("changeadd 1");
|
|||
m_linkJoint = IntPtr.Zero;
|
||||
}
|
||||
}
|
||||
|
||||
if (Body != IntPtr.Zero)
|
||||
{
|
||||
d.BodySetPosition(Body, _position.X, _position.Y, _position.Z);
|
||||
|
@ -1599,7 +1601,6 @@ Console.WriteLine(" JointCreateFixed");
|
|||
float fy = 0;
|
||||
float fz = 0;
|
||||
|
||||
|
||||
if (IsPhysical && (Body != IntPtr.Zero) && !m_isSelected && !childPrim) // KF: Only move root prims.
|
||||
{
|
||||
if (m_vehicle.Type != Vehicle.TYPE_NONE)
|
||||
|
@ -1819,7 +1820,6 @@ Console.WriteLine(" JointCreateFixed");
|
|||
float nmax = 35f * m_mass;
|
||||
float nmin = -35f * m_mass;
|
||||
|
||||
|
||||
if (fx > nmax)
|
||||
fx = nmax;
|
||||
if (fx < nmin)
|
||||
|
|
|
@ -2116,15 +2116,30 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
{
|
||||
face = 0;
|
||||
}
|
||||
|
||||
if (face >= 0 && face < GetNumberOfSides(part))
|
||||
{
|
||||
Primitive.TextureEntryFace texface;
|
||||
texface = tex.GetFace((uint)face);
|
||||
return texface.TextureID.ToString();
|
||||
string texture = texface.TextureID.ToString();
|
||||
|
||||
lock (part.TaskInventory)
|
||||
{
|
||||
foreach (KeyValuePair<UUID, TaskInventoryItem> inv in part.TaskInventory)
|
||||
{
|
||||
if (inv.Value.AssetID == texface.TextureID)
|
||||
{
|
||||
texture = inv.Value.Name.ToString();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return texture;
|
||||
}
|
||||
else
|
||||
{
|
||||
return String.Empty;
|
||||
return UUID.Zero.ToString();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3250,10 +3265,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
SceneObjectGroup grp = m_host.ParentGroup;
|
||||
|
||||
ScenePresence presence = World.GetScenePresence(m_host.OwnerID);
|
||||
if (presence.Scene.AttachmentsModule != null)
|
||||
{
|
||||
presence.Scene.AttachmentsModule.AttachObject(presence.ControllingClient, grp, (uint)attachment, false);
|
||||
}
|
||||
|
||||
IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule;
|
||||
if (attachmentsModule != null)
|
||||
attachmentsModule.AttachObject(presence, grp, (uint)attachment, false);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3301,7 +3316,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
|
||||
IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule;
|
||||
if (attachmentsModule != null)
|
||||
attachmentsModule.DetachSingleAttachmentToInv(itemID, presence.ControllingClient);
|
||||
attachmentsModule.DetachSingleAttachmentToInv(presence, itemID);
|
||||
}
|
||||
|
||||
public void llTakeCamera(string avatar)
|
||||
|
@ -3953,7 +3968,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
parentPrim.ScheduleGroupForFullUpdate();
|
||||
|
||||
if (client != null)
|
||||
parentPrim.GetProperties(client);
|
||||
parentPrim.SendPropertiesToClient(client);
|
||||
|
||||
ScriptSleep(1000);
|
||||
}
|
||||
|
@ -4104,6 +4119,25 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
public LSL_String llGetLinkKey(int linknum)
|
||||
{
|
||||
m_host.AddScriptLPS(1);
|
||||
List<UUID> keytable = new List<UUID>();
|
||||
// parse for sitting avatare-uuids
|
||||
World.ForEachScenePresence(delegate(ScenePresence presence)
|
||||
{
|
||||
if (!presence.IsChildAgent && presence.ParentID != 0 && m_host.ParentGroup.HasChildPrim(presence.ParentID))
|
||||
keytable.Add(presence.UUID);
|
||||
});
|
||||
|
||||
int totalprims = m_host.ParentGroup.PrimCount + keytable.Count;
|
||||
if (linknum > m_host.ParentGroup.PrimCount && linknum <= totalprims)
|
||||
{
|
||||
return keytable[totalprims - linknum].ToString();
|
||||
}
|
||||
|
||||
if (linknum == 1 && m_host.ParentGroup.PrimCount == 1 && keytable.Count == 1)
|
||||
{
|
||||
return m_host.UUID.ToString();
|
||||
}
|
||||
|
||||
SceneObjectPart part = m_host.ParentGroup.GetLinkNumPart(linknum);
|
||||
if (part != null)
|
||||
{
|
||||
|
@ -4160,6 +4194,27 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
public LSL_String llGetLinkName(int linknum)
|
||||
{
|
||||
m_host.AddScriptLPS(1);
|
||||
// parse for sitting avatare-names
|
||||
List<String> nametable = new List<String>();
|
||||
World.ForEachScenePresence(delegate(ScenePresence presence)
|
||||
{
|
||||
if (!presence.IsChildAgent && presence.ParentID != 0 && m_host.ParentGroup.HasChildPrim(presence.ParentID))
|
||||
nametable.Add(presence.ControllingClient.Name);
|
||||
});
|
||||
|
||||
int totalprims = m_host.ParentGroup.PrimCount + nametable.Count;
|
||||
if (totalprims > m_host.ParentGroup.PrimCount)
|
||||
{
|
||||
// sitting Avatar-Name with negativ linknum / SinglePrim
|
||||
if (linknum < 0 && m_host.ParentGroup.PrimCount == 1 && nametable.Count == 1)
|
||||
return nametable[0];
|
||||
// Prim-Name / SinglePrim Sitting Avatar
|
||||
if (linknum == 1 && m_host.ParentGroup.PrimCount == 1 && nametable.Count == 1)
|
||||
return m_host.Name;
|
||||
// LinkNumber > of Real PrimSet = AvatarName
|
||||
if (linknum > m_host.ParentGroup.PrimCount && linknum <= totalprims)
|
||||
return nametable[totalprims - linknum];
|
||||
}
|
||||
|
||||
// simplest case, this prims link number
|
||||
if (m_host.LinkNum == linknum)
|
||||
|
@ -4173,6 +4228,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
else
|
||||
return UUID.Zero.ToString();
|
||||
}
|
||||
|
||||
// Link set
|
||||
SceneObjectPart part = null;
|
||||
if (m_host.LinkNum == 1) // this is the Root prim
|
||||
|
@ -4619,8 +4675,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
|
||||
public void llCollisionSound(string impact_sound, double impact_volume)
|
||||
{
|
||||
|
||||
m_host.AddScriptLPS(1);
|
||||
|
||||
// TODO: Parameter check logic required.
|
||||
UUID soundId = UUID.Zero;
|
||||
if (!UUID.TryParse(impact_sound, out soundId))
|
||||
|
@ -6756,6 +6812,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
return m_host.GetAvatarOnSitTarget().ToString();
|
||||
}
|
||||
|
||||
// http://wiki.secondlife.com/wiki/LlAvatarOnLinkSitTarget
|
||||
public LSL_String llAvatarOnLinkSitTarget(int linknum)
|
||||
{
|
||||
m_host.AddScriptLPS(1);
|
||||
if(linknum == ScriptBaseClass.LINK_SET ||
|
||||
linknum == ScriptBaseClass.LINK_ALL_CHILDREN ||
|
||||
linknum == ScriptBaseClass.LINK_ALL_OTHERS) return UUID.Zero.ToString();
|
||||
|
||||
List<SceneObjectPart> parts = GetLinkParts(linknum);
|
||||
if (parts.Count == 0) return UUID.Zero.ToString();
|
||||
return parts[0].SitTargetAvatar.ToString();
|
||||
}
|
||||
|
||||
|
||||
public void llAddToLandPassList(string avatar, double hours)
|
||||
{
|
||||
m_host.AddScriptLPS(1);
|
||||
|
@ -7481,7 +7551,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
return;
|
||||
LSL_Vector v;
|
||||
v = rules.GetVector3Item(idx++);
|
||||
av.OffsetPosition = new Vector3((float)v.x, (float)v.y, (float)v.z);
|
||||
av.AbsolutePosition = new Vector3((float)v.x, (float)v.y, (float)v.z);
|
||||
av.SendAvatarDataToAllAgents();
|
||||
|
||||
break;
|
||||
|
|
|
@ -54,6 +54,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
|
|||
LSL_Float llAtan2(double x, double y);
|
||||
void llAttachToAvatar(int attachment);
|
||||
LSL_Key llAvatarOnSitTarget();
|
||||
LSL_Key llAvatarOnLinkSitTarget(int linknum);
|
||||
LSL_Rotation llAxes2Rot(LSL_Vector fwd, LSL_Vector left, LSL_Vector up);
|
||||
LSL_Rotation llAxisAngle2Rot(LSL_Vector axis, double angle);
|
||||
LSL_Integer llBase64ToInteger(string str);
|
||||
|
|
|
@ -130,6 +130,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
|
|||
return m_LSL_Functions.llAvatarOnSitTarget();
|
||||
}
|
||||
|
||||
public LSL_Key llAvatarOnLinkSitTarget(int linknum)
|
||||
{
|
||||
return m_LSL_Functions.llAvatarOnLinkSitTarget(linknum);
|
||||
}
|
||||
|
||||
public LSL_Rotation llAxes2Rot(LSL_Vector fwd, LSL_Vector left, LSL_Vector up)
|
||||
{
|
||||
return m_LSL_Functions.llAxes2Rot(fwd, left, up);
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/*
|
||||
/*
|
||||
* Copyright (c) Contributors, http://opensimulator.org/
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
|
@ -91,6 +91,11 @@ namespace OpenSim.Services.Connectors
|
|||
return m_database.LoadEstateSettings(estateID);
|
||||
}
|
||||
|
||||
public EstateSettings CreateNewEstate()
|
||||
{
|
||||
return m_database.CreateNewEstate();
|
||||
}
|
||||
|
||||
public List<EstateSettings> LoadEstateSettingsAll()
|
||||
{
|
||||
return m_database.LoadEstateSettingsAll();
|
||||
|
|
|
@ -40,9 +40,9 @@ namespace OpenSim.Services.InventoryService
|
|||
{
|
||||
public class XInventoryService : ServiceBase, IInventoryService
|
||||
{
|
||||
//private static readonly ILog m_log =
|
||||
// LogManager.GetLogger(
|
||||
// MethodBase.GetCurrentMethod().DeclaringType);
|
||||
// private static readonly ILog m_log =
|
||||
// LogManager.GetLogger(
|
||||
// MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
protected IXInventoryData m_Database;
|
||||
protected bool m_AllowDelete = true;
|
||||
|
@ -385,18 +385,22 @@ namespace OpenSim.Services.InventoryService
|
|||
|
||||
public virtual bool AddItem(InventoryItemBase item)
|
||||
{
|
||||
//m_log.DebugFormat(
|
||||
// "[XINVENTORY SERVICE]: Adding item {0} to folder {1} for {2}", item.ID, item.Folder, item.Owner);
|
||||
// m_log.DebugFormat(
|
||||
// "[XINVENTORY SERVICE]: Adding item {0} to folder {1} for {2}", item.ID, item.Folder, item.Owner);
|
||||
|
||||
return m_Database.StoreItem(ConvertFromOpenSim(item));
|
||||
}
|
||||
|
||||
public virtual bool UpdateItem(InventoryItemBase item)
|
||||
{
|
||||
// throw new Exception("urrgh");
|
||||
if (!m_AllowDelete)
|
||||
if (item.AssetType == (sbyte)AssetType.Link || item.AssetType == (sbyte)AssetType.LinkFolder)
|
||||
return false;
|
||||
|
||||
// m_log.InfoFormat(
|
||||
// "[XINVENTORY SERVICE]: Updating item {0} {1} in folder {2}", item.Name, item.ID, item.Folder);
|
||||
|
||||
return m_Database.StoreItem(ConvertFromOpenSim(item));
|
||||
}
|
||||
|
||||
|
|
|
@ -28,15 +28,15 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Reflection;
|
||||
using log4net;
|
||||
using Nini.Config;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Data;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Services.Interfaces;
|
||||
using OpenSim.Framework.Console;
|
||||
using GridRegion = OpenSim.Services.Interfaces.GridRegion;
|
||||
|
||||
using OpenMetaverse;
|
||||
using log4net;
|
||||
|
||||
namespace OpenSim.Services.UserAccountService
|
||||
{
|
||||
public class UserAccountService : UserAccountServiceBase, IUserAccountService
|
||||
|
@ -44,10 +44,16 @@ namespace OpenSim.Services.UserAccountService
|
|||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
private static UserAccountService m_RootInstance;
|
||||
|
||||
/// <summary>
|
||||
/// Should we create default entries (minimum body parts/clothing, avatar wearable entries) for a new avatar?
|
||||
/// </summary>
|
||||
private bool m_CreateDefaultAvatarEntries;
|
||||
|
||||
protected IGridService m_GridService;
|
||||
protected IAuthenticationService m_AuthenticationService;
|
||||
protected IGridUserService m_GridUserService;
|
||||
protected IInventoryService m_InventoryService;
|
||||
protected IAvatarService m_AvatarService;
|
||||
|
||||
public UserAccountService(IConfigSource config)
|
||||
: base(config)
|
||||
|
@ -77,6 +83,12 @@ namespace OpenSim.Services.UserAccountService
|
|||
if (invServiceDll != string.Empty)
|
||||
m_InventoryService = LoadPlugin<IInventoryService>(invServiceDll, new Object[] { config });
|
||||
|
||||
string avatarServiceDll = userConfig.GetString("AvatarService", string.Empty);
|
||||
if (avatarServiceDll != string.Empty)
|
||||
m_AvatarService = LoadPlugin<IAvatarService>(avatarServiceDll, new Object[] { config });
|
||||
|
||||
m_CreateDefaultAvatarEntries = userConfig.GetBoolean("CreateDefaultAvatarEntries", false);
|
||||
|
||||
if (MainConsole.Instance != null)
|
||||
{
|
||||
MainConsole.Instance.Commands.AddCommand("UserService", false,
|
||||
|
@ -102,9 +114,7 @@ namespace OpenSim.Services.UserAccountService
|
|||
"show account <first> <last>",
|
||||
"Show account details for the given user", HandleShowAccount);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#region IUserAccountService
|
||||
|
@ -349,7 +359,7 @@ namespace OpenSim.Services.UserAccountService
|
|||
email = MainConsole.Instance.CmdPrompt("Email", "");
|
||||
else email = cmdparams[5];
|
||||
|
||||
CreateUser(firstName, lastName, password, email);
|
||||
CreateUser(UUID.Zero, firstName, lastName, password, email);
|
||||
}
|
||||
|
||||
protected void HandleShowAccount(string module, string[] cmdparams)
|
||||
|
@ -461,11 +471,12 @@ namespace OpenSim.Services.UserAccountService
|
|||
/// <summary>
|
||||
/// Create a user
|
||||
/// </summary>
|
||||
/// <param name="scopeID">Allows hosting of multiple grids in a single database. Normally left as UUID.Zero</param>
|
||||
/// <param name="firstName"></param>
|
||||
/// <param name="lastName"></param>
|
||||
/// <param name="password"></param>
|
||||
/// <param name="email"></param>
|
||||
private void CreateUser(string firstName, string lastName, string password, string email)
|
||||
public UserAccount CreateUser(UUID scopeID, string firstName, string lastName, string password, string email)
|
||||
{
|
||||
UserAccount account = GetUserAccount(UUID.Zero, firstName, lastName);
|
||||
if (null == account)
|
||||
|
@ -512,12 +523,20 @@ namespace OpenSim.Services.UserAccountService
|
|||
{
|
||||
success = m_InventoryService.CreateUserInventory(account.PrincipalID);
|
||||
if (!success)
|
||||
{
|
||||
m_log.WarnFormat("[USER ACCOUNT SERVICE]: Unable to create inventory for account {0} {1}.",
|
||||
firstName, lastName);
|
||||
}
|
||||
else if (m_CreateDefaultAvatarEntries)
|
||||
{
|
||||
CreateDefaultAppearanceEntries(account.PrincipalID);
|
||||
}
|
||||
}
|
||||
|
||||
m_log.InfoFormat("[USER ACCOUNT SERVICE]: Account {0} {1} created successfully", firstName, lastName);
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
m_log.ErrorFormat("[USER ACCOUNT SERVICE]: Account creation failed for account {0} {1}", firstName, lastName);
|
||||
}
|
||||
}
|
||||
|
@ -525,6 +544,128 @@ namespace OpenSim.Services.UserAccountService
|
|||
{
|
||||
m_log.ErrorFormat("[USER ACCOUNT SERVICE]: A user with the name {0} {1} already exists!", firstName, lastName);
|
||||
}
|
||||
|
||||
return account;
|
||||
}
|
||||
|
||||
private void CreateDefaultAppearanceEntries(UUID principalID)
|
||||
{
|
||||
m_log.DebugFormat("[USER ACCOUNT SERVICE]: Creating default appearance items for {0}", principalID);
|
||||
|
||||
InventoryFolderBase bodyPartsFolder = m_InventoryService.GetFolderForType(principalID, AssetType.Bodypart);
|
||||
|
||||
InventoryItemBase eyes = new InventoryItemBase(UUID.Random(), principalID);
|
||||
eyes.AssetID = new UUID("4bb6fa4d-1cd2-498a-a84c-95c1a0e745a7");
|
||||
eyes.Name = "Default Eyes";
|
||||
eyes.CreatorId = principalID.ToString();
|
||||
eyes.AssetType = (int)AssetType.Bodypart;
|
||||
eyes.InvType = (int)InventoryType.Wearable;
|
||||
eyes.Folder = bodyPartsFolder.ID;
|
||||
eyes.BasePermissions = (uint)PermissionMask.All;
|
||||
eyes.CurrentPermissions = (uint)PermissionMask.All;
|
||||
eyes.EveryOnePermissions = (uint)PermissionMask.All;
|
||||
eyes.GroupPermissions = (uint)PermissionMask.All;
|
||||
eyes.NextPermissions = (uint)PermissionMask.All;
|
||||
eyes.Flags = (uint)WearableType.Eyes;
|
||||
m_InventoryService.AddItem(eyes);
|
||||
|
||||
InventoryItemBase shape = new InventoryItemBase(UUID.Random(), principalID);
|
||||
shape.AssetID = AvatarWearable.DEFAULT_BODY_ASSET;
|
||||
shape.Name = "Default Shape";
|
||||
shape.CreatorId = principalID.ToString();
|
||||
shape.AssetType = (int)AssetType.Bodypart;
|
||||
shape.InvType = (int)InventoryType.Wearable;
|
||||
shape.Folder = bodyPartsFolder.ID;
|
||||
shape.BasePermissions = (uint)PermissionMask.All;
|
||||
shape.CurrentPermissions = (uint)PermissionMask.All;
|
||||
shape.EveryOnePermissions = (uint)PermissionMask.All;
|
||||
shape.GroupPermissions = (uint)PermissionMask.All;
|
||||
shape.NextPermissions = (uint)PermissionMask.All;
|
||||
shape.Flags = (uint)WearableType.Shape;
|
||||
m_InventoryService.AddItem(shape);
|
||||
|
||||
InventoryItemBase skin = new InventoryItemBase(UUID.Random(), principalID);
|
||||
skin.AssetID = AvatarWearable.DEFAULT_SKIN_ASSET;
|
||||
skin.Name = "Default Skin";
|
||||
skin.CreatorId = principalID.ToString();
|
||||
skin.AssetType = (int)AssetType.Bodypart;
|
||||
skin.InvType = (int)InventoryType.Wearable;
|
||||
skin.Folder = bodyPartsFolder.ID;
|
||||
skin.BasePermissions = (uint)PermissionMask.All;
|
||||
skin.CurrentPermissions = (uint)PermissionMask.All;
|
||||
skin.EveryOnePermissions = (uint)PermissionMask.All;
|
||||
skin.GroupPermissions = (uint)PermissionMask.All;
|
||||
skin.NextPermissions = (uint)PermissionMask.All;
|
||||
skin.Flags = (uint)WearableType.Skin;
|
||||
m_InventoryService.AddItem(skin);
|
||||
|
||||
InventoryItemBase hair = new InventoryItemBase(UUID.Random(), principalID);
|
||||
hair.AssetID = AvatarWearable.DEFAULT_HAIR_ASSET;
|
||||
hair.Name = "Default Hair";
|
||||
hair.CreatorId = principalID.ToString();
|
||||
hair.AssetType = (int)AssetType.Bodypart;
|
||||
hair.InvType = (int)InventoryType.Wearable;
|
||||
hair.Folder = bodyPartsFolder.ID;
|
||||
hair.BasePermissions = (uint)PermissionMask.All;
|
||||
hair.CurrentPermissions = (uint)PermissionMask.All;
|
||||
hair.EveryOnePermissions = (uint)PermissionMask.All;
|
||||
hair.GroupPermissions = (uint)PermissionMask.All;
|
||||
hair.NextPermissions = (uint)PermissionMask.All;
|
||||
hair.Flags = (uint)WearableType.Hair;
|
||||
m_InventoryService.AddItem(hair);
|
||||
|
||||
InventoryFolderBase clothingFolder = m_InventoryService.GetFolderForType(principalID, AssetType.Clothing);
|
||||
|
||||
InventoryItemBase shirt = new InventoryItemBase(UUID.Random(), principalID);
|
||||
shirt.AssetID = AvatarWearable.DEFAULT_SHIRT_ASSET;
|
||||
shirt.Name = "Default Shirt";
|
||||
shirt.CreatorId = principalID.ToString();
|
||||
shirt.AssetType = (int)AssetType.Clothing;
|
||||
shirt.InvType = (int)InventoryType.Wearable;
|
||||
shirt.Folder = clothingFolder.ID;
|
||||
shirt.BasePermissions = (uint)PermissionMask.All;
|
||||
shirt.CurrentPermissions = (uint)PermissionMask.All;
|
||||
shirt.EveryOnePermissions = (uint)PermissionMask.All;
|
||||
shirt.GroupPermissions = (uint)PermissionMask.All;
|
||||
shirt.NextPermissions = (uint)PermissionMask.All;
|
||||
shirt.Flags = (uint)WearableType.Shirt;
|
||||
m_InventoryService.AddItem(shirt);
|
||||
|
||||
InventoryItemBase pants = new InventoryItemBase(UUID.Random(), principalID);
|
||||
pants.AssetID = AvatarWearable.DEFAULT_PANTS_ASSET;
|
||||
pants.Name = "Default Pants";
|
||||
pants.CreatorId = principalID.ToString();
|
||||
pants.AssetType = (int)AssetType.Clothing;
|
||||
pants.InvType = (int)InventoryType.Wearable;
|
||||
pants.Folder = clothingFolder.ID;
|
||||
pants.BasePermissions = (uint)PermissionMask.All;
|
||||
pants.CurrentPermissions = (uint)PermissionMask.All;
|
||||
pants.EveryOnePermissions = (uint)PermissionMask.All;
|
||||
pants.GroupPermissions = (uint)PermissionMask.All;
|
||||
pants.NextPermissions = (uint)PermissionMask.All;
|
||||
pants.Flags = (uint)WearableType.Pants;
|
||||
m_InventoryService.AddItem(pants);
|
||||
|
||||
if (m_AvatarService != null)
|
||||
{
|
||||
m_log.DebugFormat("[USER ACCOUNT SERVICE]: Creating default avatar entries for {0}", principalID);
|
||||
|
||||
AvatarWearable[] wearables = new AvatarWearable[6];
|
||||
wearables[AvatarWearable.EYES] = new AvatarWearable(eyes.ID, eyes.AssetID);
|
||||
wearables[AvatarWearable.BODY] = new AvatarWearable(shape.ID, shape.AssetID);
|
||||
wearables[AvatarWearable.SKIN] = new AvatarWearable(skin.ID, skin.AssetID);
|
||||
wearables[AvatarWearable.HAIR] = new AvatarWearable(hair.ID, hair.AssetID);
|
||||
wearables[AvatarWearable.SHIRT] = new AvatarWearable(shirt.ID, shirt.AssetID);
|
||||
wearables[AvatarWearable.PANTS] = new AvatarWearable(pants.ID, pants.AssetID);
|
||||
|
||||
AvatarAppearance ap = new AvatarAppearance();
|
||||
for (int i = 0; i < 6; i++)
|
||||
{
|
||||
ap.SetWearable(i, wearables[i]);
|
||||
}
|
||||
|
||||
m_AvatarService.SetAppearance(principalID, ap);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -234,7 +234,7 @@ namespace OpenSim.Tests.Common.Mock
|
|||
public event ScriptReset OnScriptReset;
|
||||
public event GetScriptRunning OnGetScriptRunning;
|
||||
public event SetScriptRunning OnSetScriptRunning;
|
||||
public event Action<Vector3, bool> OnAutoPilotGo;
|
||||
public event Action<Vector3, bool, bool> OnAutoPilotGo;
|
||||
|
||||
public event TerrainUnacked OnUnackedTerrain;
|
||||
|
||||
|
|
|
@ -0,0 +1,82 @@
|
|||
/*
|
||||
* 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 OpenMetaverse;
|
||||
using NUnit.Framework;
|
||||
using NUnit.Framework.Constraints;
|
||||
|
||||
namespace OpenSim.Tests.Common
|
||||
{
|
||||
public class QuaternionToleranceConstraint : ANumericalToleranceConstraint
|
||||
{
|
||||
private Quaternion _baseValue;
|
||||
private Quaternion _valueToBeTested;
|
||||
|
||||
public QuaternionToleranceConstraint(Quaternion baseValue, double tolerance) : base(tolerance)
|
||||
{
|
||||
_baseValue = baseValue;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Test whether the constraint is satisfied by a given value
|
||||
/// </summary>
|
||||
/// <param name="valueToBeTested">The value to be tested</param>
|
||||
/// <returns>
|
||||
/// True for success, false for failure
|
||||
/// </returns>
|
||||
public override bool Matches(object valueToBeTested)
|
||||
{
|
||||
if (valueToBeTested == null)
|
||||
{
|
||||
throw new ArgumentException("Constraint cannot be used upon null values.");
|
||||
}
|
||||
if (valueToBeTested.GetType() != typeof (Quaternion))
|
||||
{
|
||||
throw new ArgumentException("Constraint cannot be used upon non quaternion values.");
|
||||
}
|
||||
|
||||
_valueToBeTested = (Quaternion)valueToBeTested;
|
||||
|
||||
return (IsWithinDoubleConstraint(_valueToBeTested.X, _baseValue.X) &&
|
||||
IsWithinDoubleConstraint(_valueToBeTested.Y, _baseValue.Y) &&
|
||||
IsWithinDoubleConstraint(_valueToBeTested.Z, _baseValue.Z) &&
|
||||
IsWithinDoubleConstraint(_valueToBeTested.W, _baseValue.W));
|
||||
}
|
||||
|
||||
public override void WriteDescriptionTo(MessageWriter writer)
|
||||
{
|
||||
writer.WriteExpectedValue(
|
||||
string.Format("A value {0} within tolerance of plus or minus {1}", _baseValue, _tolerance));
|
||||
}
|
||||
|
||||
public override void WriteActualValueTo(MessageWriter writer)
|
||||
{
|
||||
writer.WriteActualValue(_valueToBeTested);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -233,6 +233,7 @@ namespace OpenSim.Tools.Configger
|
|||
config = defaultConfig.AddConfig("Startup");
|
||||
|
||||
config.Set("region_info_source", "filesystem");
|
||||
config.Set("allow_regionless", false);
|
||||
|
||||
config.Set("gridmode", false);
|
||||
config.Set("physics", "OpenDynamicsEngine");
|
||||
|
|
BIN
bin/Npgsql.dll
BIN
bin/Npgsql.dll
Binary file not shown.
|
@ -71,6 +71,11 @@
|
|||
;; in a <Regions> tag.
|
||||
; regionload_webserver_url = "http://example.com/regions.xml";
|
||||
|
||||
;# {allow_regionless} {} {Allow simulator to start up with no regions configured.} {true false} false
|
||||
;; Allow the simulator to start up if there are no region configuration available
|
||||
;; from the selected region_info_source.
|
||||
; allow_regionless = false
|
||||
|
||||
;# {NonPhysicalPrimMax} {} {Maximum size of nonphysical prims?} {} 256
|
||||
;; Maximum size for non-physical prims. Affects resizing of existing prims. This can be overriden in the region config file (as NonphysicalPrimMax!).
|
||||
; NonPhysicalPrimMax = 256
|
||||
|
@ -149,14 +154,13 @@
|
|||
|
||||
;; Choose one of the physics engines below
|
||||
;; OpenDynamicsEngine is by some distance the most developed physics engine
|
||||
;; basicphysics effectively does not model physics at all, making all
|
||||
;; objects phantom
|
||||
;; The Bullet plugins do not work properly right now. A better Bullet plugin is on the way.
|
||||
;; BulletSim is incomplete and experimental but in active development
|
||||
;; basicphysics effectively does not model physics at all, making all objects phantom
|
||||
;; Default is OpenDynamicsEngine
|
||||
; physics = OpenDynamicsEngine
|
||||
; physics = BulletSim
|
||||
; physics = basicphysics
|
||||
; physics = POS
|
||||
; physics = modified_BulletX
|
||||
|
||||
;# {permissionmodules} {} {Permission modules to use (may specify multiple modules, separated by space} {} DefaultPermissionsModule
|
||||
;; Permission modules to use, separated by space.
|
||||
|
@ -219,6 +223,13 @@
|
|||
;; server to send mail through.
|
||||
; emailmodule = DefaultEmailModule
|
||||
|
||||
; Controls whether previously compiled scripts are deleted on sim restart. If you disable this
|
||||
; then startup will be faster since scripts won't need to be recompiled. However, then it becomes your responsibility to delete the
|
||||
; compiled scripts if you're recompiling OpenSim from source code and internal interfaces used
|
||||
; by scripts have changed.
|
||||
; Default is false
|
||||
; DeleteScriptsOnStartup = true
|
||||
|
||||
|
||||
[SMTP]
|
||||
;; The SMTP server enabled the email module to send email to external
|
||||
|
@ -589,6 +600,25 @@
|
|||
;; VeryHigh, Severe
|
||||
OSFunctionThreatLevel = VeryLow
|
||||
|
||||
; OS Functions enable/disable
|
||||
; For each function, you can add one line, as shown
|
||||
; The default for all functions allows them if below threat level
|
||||
|
||||
; true allows the use of the function unconditionally
|
||||
; Allow_osSetRegionWaterHeight = true
|
||||
|
||||
; false disables the function completely
|
||||
; Allow_osSetRegionWaterHeight = false
|
||||
|
||||
; Comma separated list of UUIDS allows the function for that list of UUIDS
|
||||
; Allow_osSetRegionWaterHeight = 888760cb-a3cf-43ac-8ea4-8732fd3ee2bb
|
||||
|
||||
; You can also use script creators as the uuid
|
||||
; Creators_osSetRegionWaterHeight = <uuid>, ...
|
||||
|
||||
; If both Allow_ and Creators_ are given, effective permissions
|
||||
; are the union of the two.
|
||||
|
||||
;; Time a script can spend in an event handler before it is interrupted
|
||||
; EventLimit = 30
|
||||
|
||||
|
@ -740,7 +770,7 @@
|
|||
;; "config-include/StandaloneCommon.ini.example" to "config-include/StandaloneCommon.ini" before
|
||||
;; editing it to set the database and backend services that OpenSim will use.
|
||||
;;
|
||||
Include-Architecture = "config-include/Standalone.ini"
|
||||
; Include-Architecture = "config-include/Standalone.ini"
|
||||
; Include-Architecture = "config-include/StandaloneHypergrid.ini"
|
||||
; Include-Architecture = "config-include/Grid.ini"
|
||||
; Include-Architecture = "config-include/GridHypergrid.ini"
|
||||
|
|
|
@ -70,6 +70,10 @@
|
|||
; except that everything is also enclosed in a <Regions> tag.
|
||||
; regionload_webserver_url = "http://example.com/regions.xml";
|
||||
|
||||
;; Allow the simulator to start up if there are no region configuration available
|
||||
;; from the selected region_info_source.
|
||||
allow_regionless = false
|
||||
|
||||
; Maximum size of non physical prims. Affects resizing of existing prims. This can be overriden in the region config file (as NonphysicalPrimMax!).
|
||||
NonPhysicalPrimMax = 256
|
||||
|
||||
|
@ -511,6 +515,7 @@
|
|||
; so it is disabled by default.
|
||||
Cap_WebFetchInventoryDescendents = ""
|
||||
|
||||
|
||||
[Chat]
|
||||
; Controls whether the chat module is enabled. Default is true.
|
||||
enabled = true;
|
||||
|
@ -524,6 +529,7 @@
|
|||
; Distance in meters that shouts should travel. Default is 100m
|
||||
shout_distance = 100
|
||||
|
||||
|
||||
[EntityTransfer]
|
||||
; The maximum distance in regions that an agent is allowed to teleport along the x or y axis
|
||||
; This is set to 4095 because current viewers can't handle teleports that are greater than this distance
|
||||
|
@ -550,6 +556,12 @@
|
|||
CoalesceMultipleObjectsToInventory = true
|
||||
|
||||
|
||||
[Attachments]
|
||||
; Controls whether avatar attachments are enabled.
|
||||
; Defaults to true - only set to false for debugging purposes
|
||||
Enabled = true
|
||||
|
||||
|
||||
[Mesh]
|
||||
; enable / disable Collada mesh support
|
||||
; default is true
|
||||
|
@ -1124,6 +1136,25 @@
|
|||
; Threat level to allow, one of None, VeryLow, Low, Moderate, High, VeryHigh, Severe
|
||||
OSFunctionThreatLevel = VeryLow
|
||||
|
||||
; OS Functions enable/disable
|
||||
; For each function, you can add one line, as shown
|
||||
; The default for all functions allows them if below threat level
|
||||
|
||||
; true allows the use of the function unconditionally
|
||||
; Allow_osSetRegionWaterHeight = true
|
||||
|
||||
; false disables the function completely
|
||||
; Allow_osSetRegionWaterHeight = false
|
||||
|
||||
; Comma separated list of UUIDS allows the function for that list of UUIDS
|
||||
; Allow_osSetRegionWaterHeight = 888760cb-a3cf-43ac-8ea4-8732fd3ee2bb
|
||||
|
||||
; You can also use script creators as the uuid
|
||||
; Creators_osSetRegionWaterHeight = <uuid>, ...
|
||||
|
||||
; If both Allow_ and Creators_ are given, effective permissions
|
||||
; are the union of the two.
|
||||
|
||||
; Interval (s) between background save of script states
|
||||
SaveInterval = 120
|
||||
|
||||
|
@ -1151,25 +1182,6 @@
|
|||
SensorMaxRange = 96.0
|
||||
SensorMaxResults = 16
|
||||
|
||||
; OS Functions enable/disable
|
||||
; For each function, you can add one line, as shown
|
||||
; The default for all functions allows them if below threat level
|
||||
|
||||
; true allows the use of the function unconditionally
|
||||
; Allow_osSetRegionWaterHeight = true
|
||||
|
||||
; false disables the function completely
|
||||
; Allow_osSetRegionWaterHeight = false
|
||||
|
||||
; Comma separated list of UUIDS allows the function for that list of UUIDS
|
||||
; Allow_osSetRegionWaterHeight = 888760cb-a3cf-43ac-8ea4-8732fd3ee2bb
|
||||
|
||||
; You can also use script creators as the uuid
|
||||
; Creators_osSetRegionWaterHeight = <uuid>, ...
|
||||
|
||||
; If both Allow_ and Creators_ are given, effective permissions
|
||||
; are the union of the two.
|
||||
|
||||
; Allow for llCreateLink and llBreakLink to work without asking for permission
|
||||
; only enable this in a trusted environment otherwise you may be subject to hijacking
|
||||
; AutomaticLinkPermission = false
|
||||
|
@ -1182,11 +1194,12 @@
|
|||
;; Path to script assemblies
|
||||
; ScriptEnginesPath = "ScriptEngines"
|
||||
|
||||
; Whether to delete previously compiled scripts when the sim starts. If you disable this
|
||||
; then startup will be faster. However, then it becomes your responsibility to delete the
|
||||
; compiled scripts if OpenSim has changed enough that previously compiled scripts are no
|
||||
; longer compatible.
|
||||
DeleteScriptsOnStartup = true
|
||||
; Controls whether previously compiled scripts are deleted on sim restart. If you disable this
|
||||
; then startup will be faster since scripts won't need to be recompiled. However, then it becomes your responsibility to delete the
|
||||
; compiled scripts if you're recompiling OpenSim from source code and internal interfaces used
|
||||
; by scripts have changed.
|
||||
; Default is false
|
||||
; DeleteScriptsOnStartup = true
|
||||
|
||||
|
||||
[OpenGridProtocol]
|
||||
|
|
|
@ -166,6 +166,14 @@ ServiceConnectors = "8003/OpenSim.Server.Handlers.dll:AssetServiceConnector,8003
|
|||
PresenceService = "OpenSim.Services.PresenceService.dll:PresenceService"
|
||||
GridService = "OpenSim.Services.GridService.dll:GridService"
|
||||
InventoryService = "OpenSim.Services.InventoryService.dll:XInventoryService"
|
||||
; AvatarService = "OpenSim.Services.AvatarService.dll:AvatarService"
|
||||
|
||||
;; This switch creates the minimum set of body parts and avatar entries for a viewer 2
|
||||
;; to show a default "Ruth" avatar rather than a cloud for a newly created user.
|
||||
;; Default is false
|
||||
;; If you enable this you will also need to uncomment the AvatarService line above
|
||||
; CreateDefaultAvatarEntries = false
|
||||
|
||||
|
||||
[GridUserService]
|
||||
; for the server connector
|
||||
|
|
|
@ -149,6 +149,14 @@ ServiceConnectors = "8003/OpenSim.Server.Handlers.dll:AssetServiceConnector,8003
|
|||
PresenceService = "OpenSim.Services.PresenceService.dll:PresenceService"
|
||||
GridService = "OpenSim.Services.GridService.dll:GridService"
|
||||
InventoryService = "OpenSim.Services.InventoryService.dll:XInventoryService"
|
||||
; AvatarService = "OpenSim.Services.AvatarService.dll:AvatarService"
|
||||
|
||||
;; This switch creates the minimum set of body parts and avatar entries for a viewer 2
|
||||
;; to show a default "Ruth" avatar rather than a cloud for a newly created user.
|
||||
;; Default is false
|
||||
;; If you enable this you will also need to uncomment the AvatarService line above
|
||||
; CreateDefaultAvatarEntries = false
|
||||
|
||||
|
||||
[GridUserService]
|
||||
; for the server connector
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
<Key Name="assetID" Value="d342e6c0-b9d2-11dc-95ff-0800200c9a66"/>
|
||||
<Key Name="name" Value="Hair"/>
|
||||
<Key Name="assetType" Value="13" />
|
||||
<Key Name="fileName" Value="newhair.dat"/>
|
||||
<Key Name="fileName" Value="base_hair.dat"/>
|
||||
</Section>
|
||||
|
||||
<Section Name="Skin">
|
||||
|
@ -34,6 +34,14 @@
|
|||
<Key Name="assetType" Value="13" />
|
||||
<Key Name="fileName" Value="base_shape.dat"/>
|
||||
</Section>
|
||||
|
||||
<Section Name="Eyes">
|
||||
<Key Name="assetID" Value="4bb6fa4d-1cd2-498a-a84c-95c1a0e745a7"/>
|
||||
<Key Name="name" Value="Eyes"/>
|
||||
<Key Name="assetType" Value="13" />
|
||||
<Key Name="fileName" Value="base_eyes.dat"/>
|
||||
</Section>
|
||||
|
||||
<!--
|
||||
<Section Name="Jim Shape">
|
||||
<Key Name="assetID" Value="66c41e39-38f9-f75a-024e-585989bfab74"/>
|
||||
|
|
|
@ -0,0 +1,26 @@
|
|||
LLWearable version 22
|
||||
New Eyes
|
||||
|
||||
permissions 0
|
||||
{
|
||||
base_mask 7fffffff
|
||||
owner_mask 7fffffff
|
||||
group_mask 00000000
|
||||
everyone_mask 00000000
|
||||
next_owner_mask 00082000
|
||||
creator_id 11111111-1111-0000-0000-000100bba000
|
||||
owner_id 11111111-1111-0000-0000-000100bba000
|
||||
last_owner_id 00000000-0000-0000-0000-000000000000
|
||||
group_id 00000000-0000-0000-0000-000000000000
|
||||
}
|
||||
sale_info 0
|
||||
{
|
||||
sale_type not
|
||||
sale_price 10
|
||||
}
|
||||
type 3
|
||||
parameters 2
|
||||
98 0
|
||||
99 0
|
||||
textures 1
|
||||
3 6522e74d-1660-4e7f-b601-6f48c1659a77
|
|
@ -8,8 +8,8 @@ New Hair
|
|||
group_mask 00000000
|
||||
everyone_mask 00000000
|
||||
next_owner_mask 00082000
|
||||
creator_id a52db6d0-e96c-4454-85e5-3523722daa25
|
||||
owner_id a52db6d0-e96c-4454-85e5-3523722daa25
|
||||
creator_id 11111111-1111-0000-0000-000100bba000
|
||||
owner_id 11111111-1111-0000-0000-000100bba000
|
||||
last_owner_id 00000000-0000-0000-0000-000000000000
|
||||
group_id 00000000-0000-0000-0000-000000000000
|
||||
}
|
||||
|
@ -19,7 +19,7 @@ New Hair
|
|||
sale_price 10
|
||||
}
|
||||
type 2
|
||||
parameters 39
|
||||
parameters 90
|
||||
16 0
|
||||
31 .5
|
||||
112 0
|
||||
|
@ -38,26 +38,77 @@ parameters 39
|
|||
140 0
|
||||
141 0
|
||||
142 0
|
||||
143 .13
|
||||
143 .12
|
||||
144 .1
|
||||
145 0
|
||||
146 0
|
||||
147 0
|
||||
148 .22
|
||||
149 0
|
||||
166 0
|
||||
167 0
|
||||
168 0
|
||||
169 0
|
||||
171 0
|
||||
172 .5
|
||||
173 0
|
||||
174 0
|
||||
175 .3
|
||||
176 0
|
||||
177 0
|
||||
178 0
|
||||
179 0
|
||||
180 .13
|
||||
181 .14
|
||||
182 .7
|
||||
183 .05
|
||||
184 0
|
||||
190 0
|
||||
191 0
|
||||
192 0
|
||||
400 .75
|
||||
640 0
|
||||
641 0
|
||||
642 0
|
||||
643 0
|
||||
644 0
|
||||
645 0
|
||||
674 -.3
|
||||
750 .7
|
||||
751 0
|
||||
752 .5
|
||||
754 0
|
||||
755 .05
|
||||
757 -1
|
||||
761 0
|
||||
762 0
|
||||
763 .55
|
||||
771 0
|
||||
774 0
|
||||
782 0
|
||||
783 0
|
||||
784 0
|
||||
785 0
|
||||
786 0
|
||||
787 0
|
||||
788 0
|
||||
789 0
|
||||
790 0
|
||||
870 -.29
|
||||
871 0
|
||||
872 .25
|
||||
1000 .5
|
||||
1001 .5
|
||||
1002 .7
|
||||
1003 .7
|
||||
1004 0
|
||||
1005 0
|
||||
1006 0
|
||||
1007 0
|
||||
1008 0
|
||||
1009 0
|
||||
1010 0
|
||||
1011 0
|
||||
1012 .25
|
||||
textures 1
|
||||
4 7ca39b4c-bd19-4699-aff7-f93fd03d3e7b
|
|
@ -1,105 +1,165 @@
|
|||
LLWearable version 22
|
||||
Female Shape and Outfit 3 Shape
|
||||
Created by system from avatar's appearance.
|
||||
New Shape
|
||||
|
||||
permissions 0
|
||||
{
|
||||
base_mask 00000000
|
||||
owner_mask 00000000
|
||||
base_mask 7fffffff
|
||||
owner_mask 7fffffff
|
||||
group_mask 00000000
|
||||
everyone_mask 00000000
|
||||
next_owner_mask 00000000
|
||||
next_owner_mask 00082000
|
||||
creator_id 11111111-1111-0000-0000-000100bba000
|
||||
owner_id 11111111-1111-0000-0000-000100bba000
|
||||
last_owner_id 11111111-1111-0000-0000-000100bba000
|
||||
last_owner_id 00000000-0000-0000-0000-000000000000
|
||||
group_id 00000000-0000-0000-0000-000000000000
|
||||
}
|
||||
sale_info 0
|
||||
{
|
||||
sale_type not
|
||||
sale_price 0
|
||||
sale_price 10
|
||||
}
|
||||
type 0
|
||||
parameters 82
|
||||
1 .21
|
||||
2 -.5
|
||||
4 -.11
|
||||
5 -.1
|
||||
6 -.3
|
||||
7 -.4
|
||||
8 -.5
|
||||
10 .7
|
||||
11 .34
|
||||
12 -.5
|
||||
parameters 142
|
||||
1 0
|
||||
2 0
|
||||
4 0
|
||||
5 0
|
||||
6 0
|
||||
7 0
|
||||
8 0
|
||||
10 0
|
||||
11 0
|
||||
12 0
|
||||
13 0
|
||||
14 .04
|
||||
15 .58
|
||||
17 .56
|
||||
18 -.26
|
||||
19 -.73
|
||||
20 -.34
|
||||
21 -.01
|
||||
22 1
|
||||
23 -.5
|
||||
24 -.63
|
||||
25 .44
|
||||
27 .05
|
||||
33 -.24
|
||||
34 -.7
|
||||
35 -.16
|
||||
36 -.2
|
||||
37 -.98
|
||||
38 -.5
|
||||
14 0
|
||||
15 0
|
||||
17 0
|
||||
18 0
|
||||
19 0
|
||||
20 0
|
||||
21 0
|
||||
22 0
|
||||
23 0
|
||||
24 0
|
||||
25 0
|
||||
26 0
|
||||
27 0
|
||||
28 0
|
||||
29 .12
|
||||
30 .12
|
||||
32 0
|
||||
33 0
|
||||
34 0
|
||||
35 0
|
||||
36 -.5
|
||||
37 0
|
||||
38 0
|
||||
40 0
|
||||
80 0
|
||||
105 .07
|
||||
155 -.22
|
||||
100 0
|
||||
104 0
|
||||
105 .5
|
||||
106 0
|
||||
151 0
|
||||
152 0
|
||||
153 0
|
||||
155 0
|
||||
156 0
|
||||
157 0
|
||||
185 -1
|
||||
193 .86
|
||||
196 -.74
|
||||
505 .65
|
||||
506 .12
|
||||
507 -1.5
|
||||
185 0
|
||||
186 0
|
||||
187 0
|
||||
188 0
|
||||
189 0
|
||||
193 .5
|
||||
194 .67
|
||||
195 .33
|
||||
196 0
|
||||
505 .5
|
||||
506 0
|
||||
507 0
|
||||
515 0
|
||||
517 .16
|
||||
518 .8
|
||||
629 0
|
||||
517 0
|
||||
518 0
|
||||
626 0
|
||||
627 0
|
||||
629 .5
|
||||
630 0
|
||||
631 0
|
||||
633 0
|
||||
634 0
|
||||
635 0
|
||||
637 0
|
||||
646 .4
|
||||
647 1
|
||||
649 .36
|
||||
650 .85
|
||||
652 .49
|
||||
653 -1
|
||||
646 0
|
||||
647 0
|
||||
648 0
|
||||
649 .5
|
||||
650 0
|
||||
651 0
|
||||
652 .5
|
||||
653 0
|
||||
655 -.08
|
||||
656 0
|
||||
659 .65
|
||||
657 0
|
||||
658 0
|
||||
659 .5
|
||||
660 0
|
||||
661 0
|
||||
662 .5
|
||||
663 0
|
||||
664 0
|
||||
665 0
|
||||
675 -.15
|
||||
676 .26
|
||||
678 .28
|
||||
682 .27
|
||||
683 -.19
|
||||
684 -.09
|
||||
675 0
|
||||
676 0
|
||||
677 0
|
||||
678 .5
|
||||
679 -.08
|
||||
680 -.08
|
||||
681 -.08
|
||||
682 .5
|
||||
683 -.15
|
||||
684 0
|
||||
685 0
|
||||
690 .45
|
||||
692 .4
|
||||
693 -0
|
||||
753 -.5
|
||||
756 -.08
|
||||
758 .24
|
||||
759 .6
|
||||
760 .11
|
||||
764 -.38
|
||||
765 -.3
|
||||
769 .42
|
||||
773 .51
|
||||
795 .16
|
||||
796 .11
|
||||
799 .36
|
||||
686 0
|
||||
687 0
|
||||
688 0
|
||||
689 0
|
||||
690 .5
|
||||
691 0
|
||||
692 0
|
||||
693 .6
|
||||
694 -.08
|
||||
695 0
|
||||
753 0
|
||||
756 0
|
||||
758 0
|
||||
759 .5
|
||||
760 0
|
||||
764 0
|
||||
765 0
|
||||
767 0
|
||||
768 0
|
||||
769 .5
|
||||
770 0
|
||||
772 0
|
||||
773 .5
|
||||
794 .17
|
||||
795 .25
|
||||
796 0
|
||||
797 0
|
||||
798 0
|
||||
799 .5
|
||||
841 0
|
||||
842 -.82
|
||||
842 0
|
||||
843 0
|
||||
853 0
|
||||
854 0
|
||||
855 0
|
||||
879 0
|
||||
880 0
|
||||
1103 0
|
||||
1104 0
|
||||
1105 0
|
||||
1200 0
|
||||
1201 0
|
||||
textures 0
|
||||
|
|
|
@ -430,6 +430,13 @@
|
|||
<Key Name="fileName" Value="default_avatar.jp2" />
|
||||
</Section>
|
||||
|
||||
<Section Name="Default Iris">
|
||||
<Key Name="assetID" Value="6522e74d-1660-4e7f-b601-6f48c1659a77"/>
|
||||
<Key Name="name" Value="Default Iris"/>
|
||||
<Key Name="assetType" Value="0" />
|
||||
<Key Name="fileName" Value="default_iris.jp2" />
|
||||
</Section>
|
||||
|
||||
<Section Name="Cypress 1">
|
||||
<Key Name="assetID" Value="fb2ae204-3fd1-df33-594f-c9f882830e66"/>
|
||||
<Key Name="name" Value="Cypress 1"/>
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue