Merge branch 'master' into bulletsim
commit
b9cbe92f30
|
@ -111,6 +111,7 @@ what it is today.
|
|||
* Mircea Kitsune
|
||||
* mpallari
|
||||
* MrMonkE
|
||||
* Nebadon Izumi (Michael Cerquoni - http://OSgrid.org)
|
||||
* nornalbion
|
||||
* Omar Vera Ustariz (IBM)
|
||||
* openlifegrid.com
|
||||
|
|
|
@ -2201,6 +2201,10 @@ namespace OpenSim.ApplicationPlugins.RemoteController
|
|||
/// <description>UUID of the region</description></item>
|
||||
/// <item><term>region_name</term>
|
||||
/// <description>region name</description></item>
|
||||
/// <item><term>merge</term>
|
||||
/// <description>true if oar should be merged</description></item>
|
||||
/// <item><term>skip-assets</term>
|
||||
/// <description>true if assets should be skiped</description></item>
|
||||
/// </list>
|
||||
///
|
||||
/// <code>region_uuid</code> takes precedence over
|
||||
|
@ -2259,10 +2263,22 @@ namespace OpenSim.ApplicationPlugins.RemoteController
|
|||
throw new Exception(String.Format("failed to switch to region {0}", region_name));
|
||||
}
|
||||
else throw new Exception("neither region_name nor region_uuid given");
|
||||
|
||||
bool mergeOar = false;
|
||||
bool skipAssets = false;
|
||||
|
||||
if ((string)requestData["merge"] == "true")
|
||||
{
|
||||
mergeOar = true;
|
||||
}
|
||||
if ((string)requestData["skip-assets"] == "true")
|
||||
{
|
||||
skipAssets = true;
|
||||
}
|
||||
|
||||
IRegionArchiverModule archiver = scene.RequestModuleInterface<IRegionArchiverModule>();
|
||||
if (archiver != null)
|
||||
archiver.DearchiveRegion(filename);
|
||||
archiver.DearchiveRegion(filename, mergeOar, skipAssets, Guid.Empty);
|
||||
else
|
||||
throw new Exception("Archiver module not present for scene");
|
||||
|
||||
|
@ -2302,6 +2318,10 @@ 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>
|
||||
/// <description>profile url</description></item>
|
||||
/// <item><term>noassets</term>
|
||||
/// <description>true if no assets should be saved</description></item>
|
||||
/// </list>
|
||||
///
|
||||
/// <code>region_uuid</code> takes precedence over
|
||||
|
@ -2359,12 +2379,29 @@ namespace OpenSim.ApplicationPlugins.RemoteController
|
|||
}
|
||||
else throw new Exception("neither region_name nor region_uuid given");
|
||||
|
||||
Dictionary<string, object> options = new Dictionary<string, object>();
|
||||
|
||||
//if (requestData.Contains("version"))
|
||||
//{
|
||||
// options["version"] = (string)requestData["version"];
|
||||
//}
|
||||
|
||||
if (requestData.Contains("profile"))
|
||||
{
|
||||
options["profile"] = (string)requestData["profile"];
|
||||
}
|
||||
|
||||
if (requestData["noassets"] == "true")
|
||||
{
|
||||
options["noassets"] = (string)requestData["noassets"] ;
|
||||
}
|
||||
|
||||
IRegionArchiverModule archiver = scene.RequestModuleInterface<IRegionArchiverModule>();
|
||||
|
||||
if (archiver != null)
|
||||
{
|
||||
scene.EventManager.OnOarFileSaved += RemoteAdminOarSaveCompleted;
|
||||
archiver.ArchiveRegion(filename, new Dictionary<string, object>());
|
||||
archiver.ArchiveRegion(filename, options);
|
||||
lock (m_saveOarLock) Monitor.Wait(m_saveOarLock,5000);
|
||||
scene.EventManager.OnOarFileSaved -= RemoteAdminOarSaveCompleted;
|
||||
}
|
||||
|
|
|
@ -273,6 +273,7 @@ namespace OpenSim.Framework
|
|||
|
||||
return m_id;
|
||||
}
|
||||
|
||||
set
|
||||
{
|
||||
UUID uuid = UUID.Zero;
|
||||
|
|
|
@ -737,7 +737,7 @@ namespace OpenSim.Framework
|
|||
bool IsActive { get; set; }
|
||||
|
||||
/// <value>
|
||||
/// Determines whether the client is logging out or not.
|
||||
/// Determines whether the client is or has been removed from a given scene
|
||||
/// </value>
|
||||
bool IsLoggingOut { get; set; }
|
||||
|
||||
|
|
|
@ -213,6 +213,8 @@ namespace OpenSim.Framework
|
|||
/// <param name="prim"></param>
|
||||
public PrimitiveBaseShape(Primitive prim)
|
||||
{
|
||||
// m_log.DebugFormat("[PRIMITIVE BASE SHAPE]: Creating from {0}", prim.ID);
|
||||
|
||||
PCode = (byte)prim.PrimData.PCode;
|
||||
ExtraParams = new byte[1];
|
||||
|
||||
|
@ -376,7 +378,7 @@ namespace OpenSim.Framework
|
|||
_pathEnd = Primitive.PackEndCut(end);
|
||||
}
|
||||
|
||||
public void SetSculptData(byte sculptType, UUID SculptTextureUUID)
|
||||
public void SetSculptProperties(byte sculptType, UUID SculptTextureUUID)
|
||||
{
|
||||
_sculptType = sculptType;
|
||||
_sculptTexture = SculptTextureUUID;
|
||||
|
@ -613,29 +615,39 @@ namespace OpenSim.Framework
|
|||
}
|
||||
}
|
||||
|
||||
public byte SculptType {
|
||||
get {
|
||||
public byte SculptType
|
||||
{
|
||||
get
|
||||
{
|
||||
return _sculptType;
|
||||
}
|
||||
set {
|
||||
set
|
||||
{
|
||||
_sculptType = value;
|
||||
}
|
||||
}
|
||||
|
||||
public byte[] SculptData {
|
||||
get {
|
||||
public byte[] SculptData
|
||||
{
|
||||
get
|
||||
{
|
||||
return _sculptData;
|
||||
}
|
||||
set {
|
||||
set
|
||||
{
|
||||
// m_log.DebugFormat("[PRIMITIVE BASE SHAPE]: Setting SculptData to data with length {0}", value.Length);
|
||||
_sculptData = value;
|
||||
}
|
||||
}
|
||||
|
||||
public int FlexiSoftness {
|
||||
get {
|
||||
public int FlexiSoftness
|
||||
{
|
||||
get
|
||||
{
|
||||
return _flexiSoftness;
|
||||
}
|
||||
set {
|
||||
set
|
||||
{
|
||||
_flexiSoftness = value;
|
||||
}
|
||||
}
|
||||
|
@ -849,6 +861,8 @@ namespace OpenSim.Framework
|
|||
|
||||
public byte[] ExtraParamsToBytes()
|
||||
{
|
||||
// m_log.DebugFormat("[EXTRAPARAMS]: Called ExtraParamsToBytes()");
|
||||
|
||||
ushort FlexiEP = 0x10;
|
||||
ushort LightEP = 0x20;
|
||||
ushort SculptEP = 0x30;
|
||||
|
@ -864,18 +878,21 @@ namespace OpenSim.Framework
|
|||
TotalBytesLength += 16;// data
|
||||
TotalBytesLength += 2 + 4; // type
|
||||
}
|
||||
|
||||
if (_lightEntry)
|
||||
{
|
||||
ExtraParamsNum++;
|
||||
TotalBytesLength += 16;// data
|
||||
TotalBytesLength += 2 + 4; // type
|
||||
}
|
||||
|
||||
if (_sculptEntry)
|
||||
{
|
||||
ExtraParamsNum++;
|
||||
TotalBytesLength += 17;// data
|
||||
TotalBytesLength += 2 + 4; // type
|
||||
}
|
||||
|
||||
if (_projectionEntry)
|
||||
{
|
||||
ExtraParamsNum++;
|
||||
|
@ -885,7 +902,6 @@ namespace OpenSim.Framework
|
|||
|
||||
byte[] returnbytes = new byte[TotalBytesLength];
|
||||
|
||||
|
||||
// uint paramlength = ExtraParamsNum;
|
||||
|
||||
// Stick in the number of parameters
|
||||
|
@ -905,6 +921,7 @@ namespace OpenSim.Framework
|
|||
Array.Copy(FlexiData, 0, returnbytes, i, FlexiData.Length);
|
||||
i += FlexiData.Length;
|
||||
}
|
||||
|
||||
if (_lightEntry)
|
||||
{
|
||||
byte[] LightData = GetLightBytes();
|
||||
|
@ -919,6 +936,7 @@ namespace OpenSim.Framework
|
|||
Array.Copy(LightData, 0, returnbytes, i, LightData.Length);
|
||||
i += LightData.Length;
|
||||
}
|
||||
|
||||
if (_sculptEntry)
|
||||
{
|
||||
byte[] SculptData = GetSculptBytes();
|
||||
|
@ -933,6 +951,7 @@ namespace OpenSim.Framework
|
|||
Array.Copy(SculptData, 0, returnbytes, i, SculptData.Length);
|
||||
i += SculptData.Length;
|
||||
}
|
||||
|
||||
if (_projectionEntry)
|
||||
{
|
||||
byte[] ProjectionData = GetProjectionBytes();
|
||||
|
@ -946,6 +965,7 @@ namespace OpenSim.Framework
|
|||
Array.Copy(ProjectionData, 0, returnbytes, i, ProjectionData.Length);
|
||||
i += ProjectionData.Length;
|
||||
}
|
||||
|
||||
if (!_flexiEntry && !_lightEntry && !_sculptEntry && !_projectionEntry)
|
||||
{
|
||||
byte[] returnbyte = new byte[1];
|
||||
|
@ -953,10 +973,7 @@ namespace OpenSim.Framework
|
|||
return returnbyte;
|
||||
}
|
||||
|
||||
|
||||
return returnbytes;
|
||||
//m_log.Info("[EXTRAPARAMS]: Length = " + m_shape.ExtraParams.Length.ToString());
|
||||
|
||||
}
|
||||
|
||||
public void ReadInUpdateExtraParam(ushort type, bool inUse, byte[] data)
|
||||
|
@ -1027,7 +1044,6 @@ namespace OpenSim.Framework
|
|||
extraParamCount = data[i++];
|
||||
}
|
||||
|
||||
|
||||
for (int k = 0; k < extraParamCount; k++)
|
||||
{
|
||||
ushort epType = Utils.BytesToUInt16(data, i);
|
||||
|
@ -1071,7 +1087,6 @@ namespace OpenSim.Framework
|
|||
_sculptEntry = false;
|
||||
if (!lGotFilter)
|
||||
_projectionEntry = false;
|
||||
|
||||
}
|
||||
|
||||
public void ReadSculptData(byte[] data, int pos)
|
||||
|
@ -1100,6 +1115,7 @@ namespace OpenSim.Framework
|
|||
if (_sculptType != (byte)1 && _sculptType != (byte)2 && _sculptType != (byte)3 && _sculptType != (byte)4)
|
||||
_sculptType = 4;
|
||||
}
|
||||
|
||||
_sculptTexture = SculptUUID;
|
||||
_sculptType = SculptTypel;
|
||||
//m_log.Info("[SCULPT]:" + SculptUUID.ToString());
|
||||
|
|
|
@ -31,6 +31,7 @@ using System.Diagnostics;
|
|||
using System.IO;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Threading;
|
||||
using System.Timers;
|
||||
using log4net;
|
||||
|
@ -124,7 +125,6 @@ namespace OpenSim.Framework.Servers
|
|||
m_logFileAppender = appender;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -443,45 +443,68 @@ namespace OpenSim.Framework.Servers
|
|||
{
|
||||
string buildVersion = string.Empty;
|
||||
|
||||
// Add commit hash and date information if available
|
||||
// The commit hash and date are stored in a file bin/.version
|
||||
// This file can automatically created by a post
|
||||
// commit script in the opensim git master repository or
|
||||
// by issuing the follwoing command from the top level
|
||||
// directory of the opensim repository
|
||||
// git log -n 1 --pretty="format:%h: %ci" >bin/.version
|
||||
// For the full git commit hash use %H instead of %h
|
||||
//
|
||||
// The subversion information is deprecated and will be removed at a later date
|
||||
// Add subversion revision information if available
|
||||
// Try file "svn_revision" in the current directory first, then the .svn info.
|
||||
// This allows to make the revision available in simulators not running from the source tree.
|
||||
// FIXME: Making an assumption about the directory we're currently in - we do this all over the place
|
||||
// elsewhere as well
|
||||
string gitDir = "../.git/";
|
||||
string gitRefPointerPath = gitDir + "HEAD";
|
||||
|
||||
string svnRevisionFileName = "svn_revision";
|
||||
string svnFileName = ".svn/entries";
|
||||
string gitCommitFileName = ".version";
|
||||
string manualVersionFileName = ".version";
|
||||
string inputLine;
|
||||
int strcmp;
|
||||
|
||||
if (File.Exists(gitCommitFileName))
|
||||
if (File.Exists(manualVersionFileName))
|
||||
{
|
||||
StreamReader CommitFile = File.OpenText(gitCommitFileName);
|
||||
buildVersion = CommitFile.ReadLine();
|
||||
CommitFile.Close();
|
||||
using (StreamReader CommitFile = File.OpenText(manualVersionFileName))
|
||||
buildVersion = CommitFile.ReadLine();
|
||||
|
||||
m_version += buildVersion ?? "";
|
||||
}
|
||||
else if (File.Exists(gitRefPointerPath))
|
||||
{
|
||||
// m_log.DebugFormat("[OPENSIM]: Found {0}", gitRefPointerPath);
|
||||
|
||||
// Remove the else logic when subversion mirror is no longer used
|
||||
string rawPointer = "";
|
||||
|
||||
using (StreamReader pointerFile = File.OpenText(gitRefPointerPath))
|
||||
rawPointer = pointerFile.ReadLine();
|
||||
|
||||
// m_log.DebugFormat("[OPENSIM]: rawPointer [{0}]", rawPointer);
|
||||
|
||||
Match m = Regex.Match(rawPointer, "^ref: (.+)$");
|
||||
|
||||
if (m.Success)
|
||||
{
|
||||
// m_log.DebugFormat("[OPENSIM]: Matched [{0}]", m.Groups[1].Value);
|
||||
|
||||
string gitRef = m.Groups[1].Value;
|
||||
string gitRefPath = gitDir + gitRef;
|
||||
if (File.Exists(gitRefPath))
|
||||
{
|
||||
// m_log.DebugFormat("[OPENSIM]: Found gitRefPath [{0}]", gitRefPath);
|
||||
|
||||
using (StreamReader refFile = File.OpenText(gitRefPath))
|
||||
{
|
||||
string gitHash = refFile.ReadLine();
|
||||
m_version += gitHash.Substring(0, 7);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Remove the else logic when subversion mirror is no longer used
|
||||
if (File.Exists(svnRevisionFileName))
|
||||
{
|
||||
StreamReader RevisionFile = File.OpenText(svnRevisionFileName);
|
||||
buildVersion = RevisionFile.ReadLine();
|
||||
buildVersion.Trim();
|
||||
RevisionFile.Close();
|
||||
|
||||
}
|
||||
|
||||
if (string.IsNullOrEmpty(buildVersion) && File.Exists(svnFileName))
|
||||
|
|
|
@ -324,10 +324,25 @@ namespace OpenSim.Framework
|
|||
}
|
||||
|
||||
/// <summary>
|
||||
/// Debug utility function to convert unbroken strings of XML into something human readable for occasional debugging purposes.
|
||||
///
|
||||
/// Please don't delete me even if I appear currently unused!
|
||||
/// Debug utility function to convert OSD into formatted XML for debugging purposes.
|
||||
/// </summary>
|
||||
/// <param name="osd">
|
||||
/// A <see cref="OSD"/>
|
||||
/// </param>
|
||||
/// <returns>
|
||||
/// A <see cref="System.String"/>
|
||||
/// </returns>
|
||||
public static string GetFormattedXml(OSD osd)
|
||||
{
|
||||
return GetFormattedXml(OSDParser.SerializeLLSDXmlString(osd));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Debug utility function to convert unbroken strings of XML into something human readable for occasional debugging purposes.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Please don't delete me even if I appear currently unused!
|
||||
/// </remarks>
|
||||
/// <param name="rawXml"></param>
|
||||
/// <returns></returns>
|
||||
public static string GetFormattedXml(string rawXml)
|
||||
|
@ -425,20 +440,30 @@ namespace OpenSim.Framework
|
|||
}
|
||||
|
||||
/// <summary>
|
||||
/// Return an SHA1 hash of the given string
|
||||
/// Return an SHA1 hash
|
||||
/// </summary>
|
||||
/// <param name="data"></param>
|
||||
/// <returns></returns>
|
||||
public static string SHA1Hash(string data)
|
||||
{
|
||||
return SHA1Hash(Encoding.Default.GetBytes(data));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Return an SHA1 hash
|
||||
/// </summary>
|
||||
/// <param name="data"></param>
|
||||
/// <returns></returns>
|
||||
public static string SHA1Hash(byte[] data)
|
||||
{
|
||||
byte[] hash = ComputeSHA1Hash(data);
|
||||
return BitConverter.ToString(hash).Replace("-", String.Empty);
|
||||
}
|
||||
|
||||
private static byte[] ComputeSHA1Hash(string src)
|
||||
private static byte[] ComputeSHA1Hash(byte[] src)
|
||||
{
|
||||
SHA1CryptoServiceProvider SHA1 = new SHA1CryptoServiceProvider();
|
||||
return SHA1.ComputeHash(Encoding.Default.GetBytes(src));
|
||||
return SHA1.ComputeHash(src);
|
||||
}
|
||||
|
||||
public static int fast_distance2d(int x, int y)
|
||||
|
|
|
@ -328,7 +328,7 @@ namespace OpenSim
|
|||
config.Set("meshing", "Meshmerizer");
|
||||
config.Set("physical_prim", true);
|
||||
config.Set("see_into_this_sim_from_neighbor", true);
|
||||
config.Set("serverside_object_permissions", false);
|
||||
config.Set("serverside_object_permissions", true);
|
||||
config.Set("storage_plugin", "OpenSim.Data.SQLite.dll");
|
||||
config.Set("storage_connection_string", "URI=file:OpenSim.db,version=3");
|
||||
config.Set("storage_prim_inventories", true);
|
||||
|
|
|
@ -1,10 +1,39 @@
|
|||
using System;
|
||||
/*
|
||||
* 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;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
|
||||
using OpenMetaverse;
|
||||
using OpenMetaverse.StructuredData;
|
||||
using Nini.Config;
|
||||
using log4net;
|
||||
|
||||
|
@ -12,11 +41,14 @@ using OpenSim.Framework;
|
|||
using OpenSim.Framework.Capabilities;
|
||||
using OpenSim.Region.Framework;
|
||||
using OpenSim.Region.Framework.Scenes;
|
||||
using OpenSim.Region.Framework.Scenes.Serialization;
|
||||
using OpenSim.Framework.Servers;
|
||||
using OpenSim.Framework.Servers.HttpServer;
|
||||
using OpenSim.Services.Interfaces;
|
||||
|
||||
using Caps = OpenSim.Framework.Capabilities.Caps;
|
||||
using OSDArray = OpenMetaverse.StructuredData.OSDArray;
|
||||
using OSDMap = OpenMetaverse.StructuredData.OSDMap;
|
||||
|
||||
namespace OpenSim.Region.ClientStack.Linden
|
||||
{
|
||||
|
@ -79,7 +111,7 @@ namespace OpenSim.Region.ClientStack.Linden
|
|||
|
||||
private bool m_persistBakedTextures = false;
|
||||
private IAssetService m_assetService;
|
||||
private bool m_dumpAssetsToFile;
|
||||
private bool m_dumpAssetsToFile = false;
|
||||
private string m_regionName;
|
||||
|
||||
public BunchOfCaps(Scene scene, Caps caps)
|
||||
|
@ -439,7 +471,7 @@ namespace OpenSim.Region.ClientStack.Linden
|
|||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// Convert raw uploaded data into the appropriate asset and item.
|
||||
/// </summary>
|
||||
/// <param name="assetID"></param>
|
||||
/// <param name="inventoryItem"></param>
|
||||
|
@ -448,6 +480,10 @@ namespace OpenSim.Region.ClientStack.Linden
|
|||
UUID inventoryItem, UUID parentFolder, byte[] data, string inventoryType,
|
||||
string assetType)
|
||||
{
|
||||
m_log.DebugFormat(
|
||||
"Uploaded asset {0} for inventory item {1}, inv type {2}, asset type {3}",
|
||||
assetID, inventoryItem, inventoryType, assetType);
|
||||
|
||||
sbyte assType = 0;
|
||||
sbyte inType = 0;
|
||||
|
||||
|
@ -474,6 +510,160 @@ namespace OpenSim.Region.ClientStack.Linden
|
|||
break;
|
||||
}
|
||||
}
|
||||
else if (inventoryType == "object")
|
||||
{
|
||||
inType = (sbyte)InventoryType.Object;
|
||||
assType = (sbyte)AssetType.Object;
|
||||
|
||||
List<Vector3> positions = new List<Vector3>();
|
||||
List<Quaternion> rotations = new List<Quaternion>();
|
||||
OSDMap request = (OSDMap)OSDParser.DeserializeLLSDXml(data);
|
||||
OSDArray instance_list = (OSDArray)request["instance_list"];
|
||||
OSDArray mesh_list = (OSDArray)request["mesh_list"];
|
||||
OSDArray texture_list = (OSDArray)request["texture_list"];
|
||||
SceneObjectGroup grp = null;
|
||||
|
||||
List<UUID> textures = new List<UUID>();
|
||||
for (int i = 0; i < texture_list.Count; i++)
|
||||
{
|
||||
AssetBase textureAsset = new AssetBase(UUID.Random(), assetName, (sbyte)AssetType.Texture, "");
|
||||
textureAsset.Data = texture_list[i].AsBinary();
|
||||
m_assetService.Store(textureAsset);
|
||||
textures.Add(textureAsset.FullID);
|
||||
}
|
||||
|
||||
for (int i = 0; i < mesh_list.Count; i++)
|
||||
{
|
||||
PrimitiveBaseShape pbs = PrimitiveBaseShape.CreateBox();
|
||||
|
||||
Primitive.TextureEntry textureEntry
|
||||
= new Primitive.TextureEntry(Primitive.TextureEntry.WHITE_TEXTURE);
|
||||
OSDMap inner_instance_list = (OSDMap)instance_list[i];
|
||||
|
||||
OSDArray face_list = (OSDArray)inner_instance_list["face_list"];
|
||||
for (uint face = 0; face < face_list.Count; face++)
|
||||
{
|
||||
OSDMap faceMap = (OSDMap)face_list[(int)face];
|
||||
Primitive.TextureEntryFace f = pbs.Textures.CreateFace(face);
|
||||
if(faceMap.ContainsKey("fullbright"))
|
||||
f.Fullbright = faceMap["fullbright"].AsBoolean();
|
||||
if (faceMap.ContainsKey ("diffuse_color"))
|
||||
f.RGBA = faceMap["diffuse_color"].AsColor4();
|
||||
|
||||
int textureNum = faceMap["image"].AsInteger();
|
||||
float imagerot = faceMap["imagerot"].AsInteger();
|
||||
float offsets = (float)faceMap["offsets"].AsReal();
|
||||
float offsett = (float)faceMap["offsett"].AsReal();
|
||||
float scales = (float)faceMap["scales"].AsReal();
|
||||
float scalet = (float)faceMap["scalet"].AsReal();
|
||||
|
||||
if(imagerot != 0)
|
||||
f.Rotation = imagerot;
|
||||
|
||||
if(offsets != 0)
|
||||
f.OffsetU = offsets;
|
||||
|
||||
if (offsett != 0)
|
||||
f.OffsetV = offsett;
|
||||
|
||||
if (scales != 0)
|
||||
f.RepeatU = scales;
|
||||
|
||||
if (scalet != 0)
|
||||
f.RepeatV = scalet;
|
||||
|
||||
if (textures.Count > textureNum)
|
||||
f.TextureID = textures[textureNum];
|
||||
else
|
||||
f.TextureID = Primitive.TextureEntry.WHITE_TEXTURE;
|
||||
|
||||
textureEntry.FaceTextures[face] = f;
|
||||
}
|
||||
|
||||
pbs.TextureEntry = textureEntry.GetBytes();
|
||||
|
||||
AssetBase meshAsset = new AssetBase(UUID.Random(), assetName, (sbyte)AssetType.Mesh, "");
|
||||
meshAsset.Data = mesh_list[i].AsBinary();
|
||||
m_assetService.Store(meshAsset);
|
||||
|
||||
pbs.SculptEntry = true;
|
||||
pbs.SculptTexture = meshAsset.FullID;
|
||||
pbs.SculptType = (byte)SculptType.Mesh;
|
||||
pbs.SculptData = meshAsset.Data;
|
||||
|
||||
Vector3 position = inner_instance_list["position"].AsVector3();
|
||||
Vector3 scale = inner_instance_list["scale"].AsVector3();
|
||||
Quaternion rotation = inner_instance_list["rotation"].AsQuaternion();
|
||||
|
||||
// no longer used - begin ------------------------
|
||||
// int physicsShapeType = inner_instance_list["physics_shape_type"].AsInteger();
|
||||
// int material = inner_instance_list["material"].AsInteger();
|
||||
// int mesh = inner_instance_list["mesh"].AsInteger();
|
||||
|
||||
// OSDMap permissions = (OSDMap)inner_instance_list["permissions"];
|
||||
// int base_mask = permissions["base_mask"].AsInteger();
|
||||
// int everyone_mask = permissions["everyone_mask"].AsInteger();
|
||||
// UUID creator_id = permissions["creator_id"].AsUUID();
|
||||
// UUID group_id = permissions["group_id"].AsUUID();
|
||||
// int group_mask = permissions["group_mask"].AsInteger();
|
||||
// bool is_owner_group = permissions["is_owner_group"].AsBoolean();
|
||||
// UUID last_owner_id = permissions["last_owner_id"].AsUUID();
|
||||
// int next_owner_mask = permissions["next_owner_mask"].AsInteger();
|
||||
// UUID owner_id = permissions["owner_id"].AsUUID();
|
||||
// int owner_mask = permissions["owner_mask"].AsInteger();
|
||||
// no longer used - end ------------------------
|
||||
|
||||
UUID owner_id = m_HostCapsObj.AgentID;
|
||||
|
||||
SceneObjectPart prim
|
||||
= new SceneObjectPart(owner_id, pbs, position, Quaternion.Identity, Vector3.Zero);
|
||||
|
||||
prim.Scale = scale;
|
||||
prim.OffsetPosition = position;
|
||||
rotations.Add(rotation);
|
||||
positions.Add(position);
|
||||
prim.UUID = UUID.Random();
|
||||
prim.CreatorID = owner_id;
|
||||
prim.OwnerID = owner_id;
|
||||
prim.GroupID = UUID.Zero;
|
||||
prim.LastOwnerID = prim.OwnerID;
|
||||
prim.CreationDate = Util.UnixTimeSinceEpoch();
|
||||
prim.Name = assetName;
|
||||
prim.Description = "";
|
||||
|
||||
// prim.BaseMask = (uint)base_mask;
|
||||
// prim.EveryoneMask = (uint)everyone_mask;
|
||||
// prim.GroupMask = (uint)group_mask;
|
||||
// prim.NextOwnerMask = (uint)next_owner_mask;
|
||||
// prim.OwnerMask = (uint)owner_mask;
|
||||
|
||||
if (grp == null)
|
||||
grp = new SceneObjectGroup(prim);
|
||||
else
|
||||
grp.AddPart(prim);
|
||||
}
|
||||
|
||||
// Fix first link number
|
||||
if (grp.Parts.Length > 1)
|
||||
grp.RootPart.LinkNum++;
|
||||
|
||||
Vector3 rootPos = positions[0];
|
||||
grp.AbsolutePosition = rootPos;
|
||||
for (int i = 0; i < positions.Count; i++)
|
||||
{
|
||||
Vector3 offset = positions[i] - rootPos;
|
||||
grp.Parts[i].OffsetPosition = offset;
|
||||
}
|
||||
|
||||
for (int i = 0; i < rotations.Count; i++)
|
||||
{
|
||||
if (i != 0)
|
||||
grp.Parts[i].RotationOffset = rotations[i];
|
||||
}
|
||||
|
||||
grp.UpdateGroupRotationR(rotations[0]);
|
||||
data = ASCIIEncoding.ASCII.GetBytes(SceneObjectSerializer.ToOriginalXmlFormat(grp));
|
||||
}
|
||||
|
||||
AssetBase asset;
|
||||
asset = new AssetBase(assetID, assetName, assType, m_HostCapsObj.AgentID.ToString());
|
||||
|
@ -506,8 +696,6 @@ namespace OpenSim.Region.ClientStack.Linden
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
|
@ -632,7 +820,7 @@ namespace OpenSim.Region.ClientStack.Linden
|
|||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// Handle raw asset upload data via the capability.
|
||||
/// </summary>
|
||||
/// <param name="data"></param>
|
||||
/// <param name="path"></param>
|
||||
|
@ -670,6 +858,7 @@ namespace OpenSim.Region.ClientStack.Linden
|
|||
|
||||
return res;
|
||||
}
|
||||
|
||||
///Left this in and commented in case there are unforseen issues
|
||||
//private void SaveAssetToFile(string filename, byte[] data)
|
||||
//{
|
||||
|
@ -679,6 +868,7 @@ namespace OpenSim.Region.ClientStack.Linden
|
|||
// bw.Close();
|
||||
// fs.Close();
|
||||
//}
|
||||
|
||||
private static void SaveAssetToFile(string filename, byte[] data)
|
||||
{
|
||||
string assetPath = "UserAssets";
|
||||
|
@ -719,7 +909,7 @@ namespace OpenSim.Region.ClientStack.Linden
|
|||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// Handle raw uploaded asset data.
|
||||
/// </summary>
|
||||
/// <param name="data"></param>
|
||||
/// <param name="path"></param>
|
||||
|
@ -752,6 +942,7 @@ namespace OpenSim.Region.ClientStack.Linden
|
|||
|
||||
return res;
|
||||
}
|
||||
|
||||
///Left this in and commented in case there are unforseen issues
|
||||
//private void SaveAssetToFile(string filename, byte[] data)
|
||||
//{
|
||||
|
@ -761,6 +952,7 @@ namespace OpenSim.Region.ClientStack.Linden
|
|||
// bw.Close();
|
||||
// fs.Close();
|
||||
//}
|
||||
|
||||
private static void SaveAssetToFile(string filename, byte[] data)
|
||||
{
|
||||
string assetPath = "UserAssets";
|
||||
|
@ -839,7 +1031,7 @@ namespace OpenSim.Region.ClientStack.Linden
|
|||
uploadComplete.new_asset = inventoryItemID;
|
||||
uploadComplete.compiled = errors.Count > 0 ? false : true;
|
||||
uploadComplete.state = "complete";
|
||||
uploadComplete.errors = new OSDArray();
|
||||
uploadComplete.errors = new OpenSim.Framework.Capabilities.OSDArray();
|
||||
uploadComplete.errors.Array = errors;
|
||||
|
||||
res = LLSDHelpers.SerialiseLLSDReply(uploadComplete);
|
||||
|
@ -905,7 +1097,7 @@ namespace OpenSim.Region.ClientStack.Linden
|
|||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// Handle raw uploaded baked texture data.
|
||||
/// </summary>
|
||||
/// <param name="data"></param>
|
||||
/// <param name="path"></param>
|
||||
|
@ -935,4 +1127,4 @@ namespace OpenSim.Region.ClientStack.Linden
|
|||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,149 @@
|
|||
/*
|
||||
* 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;
|
||||
using System.Reflection;
|
||||
using log4net;
|
||||
using Nini.Config;
|
||||
using Mono.Addins;
|
||||
using OpenMetaverse;
|
||||
using OpenMetaverse.StructuredData;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Framework.Servers.HttpServer;
|
||||
using OpenSim.Region.Framework.Interfaces;
|
||||
using OpenSim.Region.Framework.Scenes;
|
||||
using OpenSim.Services.Interfaces;
|
||||
using Caps = OpenSim.Framework.Capabilities.Caps;
|
||||
|
||||
namespace OpenSim.Region.ClientStack.Linden
|
||||
{
|
||||
/// <summary>
|
||||
/// MeshUploadFlag capability. This is required for uploading Mesh.
|
||||
/// </summary>
|
||||
[Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule")]
|
||||
public class MeshUploadFlagModule : INonSharedRegionModule
|
||||
{
|
||||
private static readonly ILog m_log =
|
||||
LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
/// <summary>
|
||||
/// Is this module enabled?
|
||||
/// </summary>
|
||||
public bool Enabled { get; private set; }
|
||||
|
||||
private Scene m_scene;
|
||||
private UUID m_agentID;
|
||||
|
||||
#region ISharedRegionModule Members
|
||||
|
||||
public MeshUploadFlagModule()
|
||||
{
|
||||
Enabled = true;
|
||||
}
|
||||
|
||||
public void Initialise(IConfigSource source)
|
||||
{
|
||||
IConfig config = source.Configs["Mesh"];
|
||||
if (config == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
Enabled = config.GetBoolean("AllowMeshUpload", Enabled);
|
||||
}
|
||||
}
|
||||
|
||||
public void AddRegion(Scene s)
|
||||
{
|
||||
if (!Enabled)
|
||||
return;
|
||||
|
||||
m_scene = s;
|
||||
m_scene.EventManager.OnRegisterCaps += RegisterCaps;
|
||||
}
|
||||
|
||||
public void RemoveRegion(Scene s)
|
||||
{
|
||||
if (!Enabled)
|
||||
return;
|
||||
|
||||
m_scene.EventManager.OnRegisterCaps -= RegisterCaps;
|
||||
}
|
||||
|
||||
public void RegionLoaded(Scene s)
|
||||
{
|
||||
}
|
||||
|
||||
public void PostInitialise()
|
||||
{
|
||||
}
|
||||
|
||||
public void Close() { }
|
||||
|
||||
public string Name { get { return "MeshUploadFlagModule"; } }
|
||||
|
||||
public Type ReplaceableInterface
|
||||
{
|
||||
get { return null; }
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
public void RegisterCaps(UUID agentID, Caps caps)
|
||||
{
|
||||
IRequestHandler reqHandler = new RestHTTPHandler("GET", "/CAPS/" + UUID.Random(), MeshUploadFlag);
|
||||
caps.RegisterHandler("MeshUploadFlag", reqHandler);
|
||||
m_agentID = agentID;
|
||||
}
|
||||
|
||||
private Hashtable MeshUploadFlag(Hashtable mDhttpMethod)
|
||||
{
|
||||
m_log.DebugFormat("[SIMULATOR FEATURES MODULE]: MeshUploadFlag request");
|
||||
|
||||
OSDMap data = new OSDMap();
|
||||
ScenePresence sp = m_scene.GetScenePresence(m_agentID);
|
||||
data["username"] = sp.Firstname + "." + sp.Lastname;
|
||||
data["display_name_next_update"] = new OSDDate(DateTime.Now);
|
||||
data["legacy_first_name"] = sp.Firstname;
|
||||
data["mesh_upload_status"] = "valid";
|
||||
data["display_name"] = sp.Firstname + " " + sp.Lastname;
|
||||
data["legacy_last_name"] = sp.Lastname;
|
||||
data["id"] = m_agentID;
|
||||
data["is_display_name_default"] = true;
|
||||
|
||||
//Send back data
|
||||
Hashtable responsedata = new Hashtable();
|
||||
responsedata["int_response_code"] = 200;
|
||||
responsedata["content_type"] = "text/plain";
|
||||
responsedata["keepalive"] = false;
|
||||
responsedata["str_response_string"] = OSDParser.SerializeLLSDXmlString(data);
|
||||
return responsedata;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -250,11 +250,9 @@ namespace OpenSim.Region.ClientStack.Linden
|
|||
case 0x40:
|
||||
pbs.ReadProjectionData(extraParam.ExtraParamData, 0);
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
pbs.PathBegin = (ushort) obj.PathBegin;
|
||||
pbs.PathCurve = (byte) obj.PathCurve;
|
||||
pbs.PathEnd = (ushort) obj.PathEnd;
|
||||
|
|
|
@ -7548,13 +7548,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
|||
IInventoryAccessModule invAccess = m_scene.RequestModuleInterface<IInventoryAccessModule>();
|
||||
if (invAccess != null)
|
||||
{
|
||||
if (!invAccess.GetAgentInventoryItem(this, itemID, requestID))
|
||||
if (!invAccess.CanGetAgentInventoryItem(this, itemID, requestID))
|
||||
return false;
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -7568,7 +7568,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
|||
{
|
||||
AssetUploadRequestPacket request = (AssetUploadRequestPacket)Pack;
|
||||
|
||||
|
||||
// m_log.Debug("upload request " + request.ToString());
|
||||
// m_log.Debug("upload request was for assetid: " + request.AssetBlock.TransactionID.Combine(this.SecureSessionId).ToString());
|
||||
UUID temp = UUID.Combine(request.AssetBlock.TransactionID, SecureSessionId);
|
||||
|
|
|
@ -86,6 +86,8 @@ namespace Flotsam.RegionModules.AssetCache
|
|||
private List<string> m_CurrentlyWriting = new List<string>();
|
||||
#endif
|
||||
|
||||
private bool m_FileCacheEnabled = true;
|
||||
|
||||
private ExpiringCache<string, AssetBase> m_MemoryCache;
|
||||
private bool m_MemoryCacheEnabled = false;
|
||||
|
||||
|
@ -146,6 +148,7 @@ namespace Flotsam.RegionModules.AssetCache
|
|||
}
|
||||
else
|
||||
{
|
||||
m_FileCacheEnabled = assetConfig.GetBoolean("FileCacheEnabled", m_FileCacheEnabled);
|
||||
m_CacheDirectory = assetConfig.GetString("CacheDirectory", m_DefaultCacheDirectory);
|
||||
|
||||
m_MemoryCacheEnabled = assetConfig.GetBoolean("MemoryCacheEnabled", m_MemoryCacheEnabled);
|
||||
|
@ -173,7 +176,7 @@ namespace Flotsam.RegionModules.AssetCache
|
|||
|
||||
m_log.InfoFormat("[FLOTSAM ASSET CACHE]: Cache Directory {0}", m_CacheDirectory);
|
||||
|
||||
if ((m_FileExpiration > TimeSpan.Zero) && (m_FileExpirationCleanupTimer > TimeSpan.Zero))
|
||||
if (m_FileCacheEnabled && (m_FileExpiration > TimeSpan.Zero) && (m_FileExpirationCleanupTimer > TimeSpan.Zero))
|
||||
{
|
||||
m_CacheCleanTimer = new System.Timers.Timer(m_FileExpirationCleanupTimer.TotalMilliseconds);
|
||||
m_CacheCleanTimer.AutoReset = true;
|
||||
|
@ -226,7 +229,6 @@ namespace Flotsam.RegionModules.AssetCache
|
|||
if (m_AssetService == null)
|
||||
{
|
||||
m_AssetService = scene.RequestModuleInterface<IAssetService>();
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -250,8 +252,57 @@ namespace Flotsam.RegionModules.AssetCache
|
|||
|
||||
private void UpdateMemoryCache(string key, AssetBase asset)
|
||||
{
|
||||
if (m_MemoryCacheEnabled)
|
||||
m_MemoryCache.AddOrUpdate(key, asset, m_MemoryExpiration);
|
||||
m_MemoryCache.AddOrUpdate(key, asset, m_MemoryExpiration);
|
||||
}
|
||||
|
||||
private void UpdateFileCache(string key, AssetBase asset)
|
||||
{
|
||||
string filename = GetFileName(asset.ID);
|
||||
|
||||
try
|
||||
{
|
||||
// If the file is already cached, don't cache it, just touch it so access time is updated
|
||||
if (File.Exists(filename))
|
||||
{
|
||||
File.SetLastAccessTime(filename, DateTime.Now);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Once we start writing, make sure we flag that we're writing
|
||||
// that object to the cache so that we don't try to write the
|
||||
// same file multiple times.
|
||||
lock (m_CurrentlyWriting)
|
||||
{
|
||||
#if WAIT_ON_INPROGRESS_REQUESTS
|
||||
if (m_CurrentlyWriting.ContainsKey(filename))
|
||||
{
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_CurrentlyWriting.Add(filename, new ManualResetEvent(false));
|
||||
}
|
||||
|
||||
#else
|
||||
if (m_CurrentlyWriting.Contains(filename))
|
||||
{
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_CurrentlyWriting.Add(filename);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
Util.FireAndForget(
|
||||
delegate { WriteFileCache(filename, asset); });
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
LogException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public void Cache(AssetBase asset)
|
||||
|
@ -259,55 +310,101 @@ namespace Flotsam.RegionModules.AssetCache
|
|||
// TODO: Spawn this off to some seperate thread to do the actual writing
|
||||
if (asset != null)
|
||||
{
|
||||
UpdateMemoryCache(asset.ID, asset);
|
||||
//m_log.DebugFormat("[FLOTSAM ASSET CACHE]: Caching asset with id {0}", asset.ID);
|
||||
|
||||
string filename = GetFileName(asset.ID);
|
||||
if (m_MemoryCacheEnabled)
|
||||
UpdateMemoryCache(asset.ID, asset);
|
||||
|
||||
if (m_FileCacheEnabled)
|
||||
UpdateFileCache(asset.ID, asset);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Try to get an asset from the in-memory cache.
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
private AssetBase GetFromMemoryCache(string id)
|
||||
{
|
||||
AssetBase asset = null;
|
||||
|
||||
if (m_MemoryCache.TryGetValue(id, out asset))
|
||||
m_MemoryHits++;
|
||||
|
||||
return asset;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Try to get an asset from the file cache.
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
private AssetBase GetFromFileCache(string id)
|
||||
{
|
||||
AssetBase asset = null;
|
||||
|
||||
string filename = GetFileName(id);
|
||||
if (File.Exists(filename))
|
||||
{
|
||||
FileStream stream = null;
|
||||
try
|
||||
{
|
||||
// If the file is already cached, don't cache it, just touch it so access time is updated
|
||||
if (File.Exists(filename))
|
||||
{
|
||||
File.SetLastAccessTime(filename, DateTime.Now);
|
||||
} else {
|
||||
|
||||
// Once we start writing, make sure we flag that we're writing
|
||||
// that object to the cache so that we don't try to write the
|
||||
// same file multiple times.
|
||||
lock (m_CurrentlyWriting)
|
||||
{
|
||||
#if WAIT_ON_INPROGRESS_REQUESTS
|
||||
if (m_CurrentlyWriting.ContainsKey(filename))
|
||||
{
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_CurrentlyWriting.Add(filename, new ManualResetEvent(false));
|
||||
}
|
||||
stream = File.Open(filename, FileMode.Open, FileAccess.Read, FileShare.Read);
|
||||
BinaryFormatter bformatter = new BinaryFormatter();
|
||||
|
||||
#else
|
||||
if (m_CurrentlyWriting.Contains(filename))
|
||||
{
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_CurrentlyWriting.Add(filename);
|
||||
}
|
||||
#endif
|
||||
asset = (AssetBase)bformatter.Deserialize(stream);
|
||||
|
||||
}
|
||||
UpdateMemoryCache(id, asset);
|
||||
|
||||
Util.FireAndForget(
|
||||
delegate { WriteFileCache(filename, asset); });
|
||||
}
|
||||
m_DiskHits++;
|
||||
}
|
||||
catch (System.Runtime.Serialization.SerializationException e)
|
||||
{
|
||||
LogException(e);
|
||||
|
||||
// If there was a problem deserializing the asset, the asset may
|
||||
// either be corrupted OR was serialized under an old format
|
||||
// {different version of AssetBase} -- we should attempt to
|
||||
// delete it and re-cache
|
||||
File.Delete(filename);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
LogException(e);
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (stream != null)
|
||||
stream.Close();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#if WAIT_ON_INPROGRESS_REQUESTS
|
||||
// Check if we're already downloading this asset. If so, try to wait for it to
|
||||
// download.
|
||||
if (m_WaitOnInprogressTimeout > 0)
|
||||
{
|
||||
m_RequestsForInprogress++;
|
||||
|
||||
ManualResetEvent waitEvent;
|
||||
if (m_CurrentlyWriting.TryGetValue(filename, out waitEvent))
|
||||
{
|
||||
waitEvent.WaitOne(m_WaitOnInprogressTimeout);
|
||||
return Get(id);
|
||||
}
|
||||
}
|
||||
#else
|
||||
// Track how often we have the problem that an asset is requested while
|
||||
// it is still being downloaded by a previous request.
|
||||
if (m_CurrentlyWriting.Contains(filename))
|
||||
{
|
||||
m_RequestsForInprogress++;
|
||||
}
|
||||
#endif
|
||||
|
||||
return asset;
|
||||
}
|
||||
|
||||
public AssetBase Get(string id)
|
||||
|
@ -316,72 +413,10 @@ namespace Flotsam.RegionModules.AssetCache
|
|||
|
||||
AssetBase asset = null;
|
||||
|
||||
if (m_MemoryCacheEnabled && m_MemoryCache.TryGetValue(id, out asset))
|
||||
{
|
||||
m_MemoryHits++;
|
||||
}
|
||||
else
|
||||
{
|
||||
string filename = GetFileName(id);
|
||||
if (File.Exists(filename))
|
||||
{
|
||||
FileStream stream = null;
|
||||
try
|
||||
{
|
||||
stream = File.Open(filename, FileMode.Open, FileAccess.Read, FileShare.Read);
|
||||
BinaryFormatter bformatter = new BinaryFormatter();
|
||||
|
||||
asset = (AssetBase)bformatter.Deserialize(stream);
|
||||
|
||||
UpdateMemoryCache(id, asset);
|
||||
|
||||
m_DiskHits++;
|
||||
}
|
||||
catch (System.Runtime.Serialization.SerializationException e)
|
||||
{
|
||||
LogException(e);
|
||||
|
||||
// If there was a problem deserializing the asset, the asset may
|
||||
// either be corrupted OR was serialized under an old format
|
||||
// {different version of AssetBase} -- we should attempt to
|
||||
// delete it and re-cache
|
||||
File.Delete(filename);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
LogException(e);
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (stream != null)
|
||||
stream.Close();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#if WAIT_ON_INPROGRESS_REQUESTS
|
||||
// Check if we're already downloading this asset. If so, try to wait for it to
|
||||
// download.
|
||||
if (m_WaitOnInprogressTimeout > 0)
|
||||
{
|
||||
m_RequestsForInprogress++;
|
||||
|
||||
ManualResetEvent waitEvent;
|
||||
if (m_CurrentlyWriting.TryGetValue(filename, out waitEvent))
|
||||
{
|
||||
waitEvent.WaitOne(m_WaitOnInprogressTimeout);
|
||||
return Get(id);
|
||||
}
|
||||
}
|
||||
#else
|
||||
// Track how often we have the problem that an asset is requested while
|
||||
// it is still being downloaded by a previous request.
|
||||
if (m_CurrentlyWriting.Contains(filename))
|
||||
{
|
||||
m_RequestsForInprogress++;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
if (m_MemoryCacheEnabled)
|
||||
asset = GetFromMemoryCache(id);
|
||||
else if (m_FileCacheEnabled)
|
||||
asset = GetFromFileCache(id);
|
||||
|
||||
if (((m_LogLevel >= 1)) && (m_HitRateDisplay != 0) && (m_Requests % m_HitRateDisplay == 0))
|
||||
{
|
||||
|
@ -415,10 +450,13 @@ namespace Flotsam.RegionModules.AssetCache
|
|||
|
||||
try
|
||||
{
|
||||
string filename = GetFileName(id);
|
||||
if (File.Exists(filename))
|
||||
if (m_FileCacheEnabled)
|
||||
{
|
||||
File.Delete(filename);
|
||||
string filename = GetFileName(id);
|
||||
if (File.Exists(filename))
|
||||
{
|
||||
File.Delete(filename);
|
||||
}
|
||||
}
|
||||
|
||||
if (m_MemoryCacheEnabled)
|
||||
|
@ -433,11 +471,14 @@ namespace Flotsam.RegionModules.AssetCache
|
|||
public void Clear()
|
||||
{
|
||||
if (m_LogLevel >= 2)
|
||||
m_log.Debug("[FLOTSAM ASSET CACHE]: Clearing Cache.");
|
||||
m_log.Debug("[FLOTSAM ASSET CACHE]: Clearing caches.");
|
||||
|
||||
foreach (string dir in Directory.GetDirectories(m_CacheDirectory))
|
||||
if (m_FileCacheEnabled)
|
||||
{
|
||||
Directory.Delete(dir);
|
||||
foreach (string dir in Directory.GetDirectories(m_CacheDirectory))
|
||||
{
|
||||
Directory.Delete(dir);
|
||||
}
|
||||
}
|
||||
|
||||
if (m_MemoryCacheEnabled)
|
||||
|
@ -472,9 +513,9 @@ namespace Flotsam.RegionModules.AssetCache
|
|||
/// removes empty tier directories.
|
||||
/// </summary>
|
||||
/// <param name="dir"></param>
|
||||
/// <param name="purgeLine"></param>
|
||||
private void CleanExpiredFiles(string dir, DateTime purgeLine)
|
||||
{
|
||||
|
||||
foreach (string file in Directory.GetFiles(dir))
|
||||
{
|
||||
if (File.GetLastAccessTime(file) < purgeLine)
|
||||
|
@ -712,18 +753,28 @@ namespace Flotsam.RegionModules.AssetCache
|
|||
switch (cmd)
|
||||
{
|
||||
case "status":
|
||||
m_log.InfoFormat("[FLOTSAM ASSET CACHE] Memory Cache : {0} assets", m_MemoryCache.Count);
|
||||
if (m_MemoryCacheEnabled)
|
||||
m_log.InfoFormat("[FLOTSAM ASSET CACHE]: Memory Cache : {0} assets", m_MemoryCache.Count);
|
||||
else
|
||||
m_log.InfoFormat("[FLOTSAM ASSET CACHE]: Memory cache disabled");
|
||||
|
||||
int fileCount = GetFileCacheCount(m_CacheDirectory);
|
||||
m_log.InfoFormat("[FLOTSAM ASSET CACHE] File Cache : {0} assets", fileCount);
|
||||
|
||||
foreach (string s in Directory.GetFiles(m_CacheDirectory, "*.fac"))
|
||||
if (m_FileCacheEnabled)
|
||||
{
|
||||
m_log.Info("[FLOTSAM ASSET CACHE] Deep Scans were performed on the following regions:");
|
||||
|
||||
string RegionID = s.Remove(0,s.IndexOf("_")).Replace(".fac","");
|
||||
DateTime RegionDeepScanTMStamp = File.GetLastWriteTime(s);
|
||||
m_log.InfoFormat("[FLOTSAM ASSET CACHE] Region: {0}, {1}", RegionID, RegionDeepScanTMStamp.ToString("MM/dd/yyyy hh:mm:ss"));
|
||||
int fileCount = GetFileCacheCount(m_CacheDirectory);
|
||||
m_log.InfoFormat("[FLOTSAM ASSET CACHE]: File Cache : {0} assets", fileCount);
|
||||
|
||||
foreach (string s in Directory.GetFiles(m_CacheDirectory, "*.fac"))
|
||||
{
|
||||
m_log.Info("[FLOTSAM ASSET CACHE]: Deep Scans were performed on the following regions:");
|
||||
|
||||
string RegionID = s.Remove(0,s.IndexOf("_")).Replace(".fac","");
|
||||
DateTime RegionDeepScanTMStamp = File.GetLastWriteTime(s);
|
||||
m_log.InfoFormat("[FLOTSAM ASSET CACHE]: Region: {0}, {1}", RegionID, RegionDeepScanTMStamp.ToString("MM/dd/yyyy hh:mm:ss"));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
m_log.InfoFormat("[FLOTSAM ASSET CACHE]: File cache disabled");
|
||||
}
|
||||
|
||||
break;
|
||||
|
@ -731,7 +782,7 @@ namespace Flotsam.RegionModules.AssetCache
|
|||
case "clear":
|
||||
if (cmdparams.Length < 2)
|
||||
{
|
||||
m_log.Warn("[FLOTSAM ASSET CACHE] Usage is fcache clear [file] [memory]");
|
||||
m_log.Warn("[FLOTSAM ASSET CACHE]: Usage is fcache clear [file] [memory]");
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -752,36 +803,48 @@ namespace Flotsam.RegionModules.AssetCache
|
|||
|
||||
if (clearMemory)
|
||||
{
|
||||
m_MemoryCache.Clear();
|
||||
m_log.Info("[FLOTSAM ASSET CACHE] Memory cache cleared.");
|
||||
if (m_MemoryCacheEnabled)
|
||||
{
|
||||
m_MemoryCache.Clear();
|
||||
m_log.Info("[FLOTSAM ASSET CACHE]: Memory cache cleared.");
|
||||
}
|
||||
else
|
||||
{
|
||||
m_log.Info("[FLOTSAM ASSET CACHE]: Memory cache not enabled.");
|
||||
}
|
||||
}
|
||||
|
||||
if (clearFile)
|
||||
{
|
||||
ClearFileCache();
|
||||
m_log.Info("[FLOTSAM ASSET CACHE] File cache cleared.");
|
||||
if (m_FileCacheEnabled)
|
||||
{
|
||||
ClearFileCache();
|
||||
m_log.Info("[FLOTSAM ASSET CACHE]: File cache cleared.");
|
||||
}
|
||||
else
|
||||
{
|
||||
m_log.Info("[FLOTSAM ASSET CACHE]: File cache not enabled.");
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
|
||||
case "assets":
|
||||
m_log.Info("[FLOTSAM ASSET CACHE] Caching all assets, in all scenes.");
|
||||
m_log.Info("[FLOTSAM ASSET CACHE]: Caching all assets, in all scenes.");
|
||||
|
||||
Util.FireAndForget(delegate {
|
||||
int assetsCached = CacheScenes();
|
||||
m_log.InfoFormat("[FLOTSAM ASSET CACHE] Completed Scene Caching, {0} assets found.", assetsCached);
|
||||
m_log.InfoFormat("[FLOTSAM ASSET CACHE]: Completed Scene Caching, {0} assets found.", assetsCached);
|
||||
|
||||
});
|
||||
|
||||
break;
|
||||
|
||||
case "expire":
|
||||
|
||||
|
||||
if (cmdparams.Length < 3)
|
||||
{
|
||||
m_log.InfoFormat("[FLOTSAM ASSET CACHE] Invalid parameters for Expire, please specify a valid date & time", cmd);
|
||||
m_log.InfoFormat("[FLOTSAM ASSET CACHE]: Invalid parameters for Expire, please specify a valid date & time", cmd);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -799,26 +862,28 @@ namespace Flotsam.RegionModules.AssetCache
|
|||
|
||||
if (!DateTime.TryParse(s_expirationDate, out expirationDate))
|
||||
{
|
||||
m_log.InfoFormat("[FLOTSAM ASSET CACHE] {0} is not a valid date & time", cmd);
|
||||
m_log.InfoFormat("[FLOTSAM ASSET CACHE]: {0} is not a valid date & time", cmd);
|
||||
break;
|
||||
}
|
||||
|
||||
CleanExpiredFiles(m_CacheDirectory, expirationDate);
|
||||
if (m_FileCacheEnabled)
|
||||
CleanExpiredFiles(m_CacheDirectory, expirationDate);
|
||||
else
|
||||
m_log.InfoFormat("[FLOTSAM ASSET CACHE]: File cache not active, not clearing.");
|
||||
|
||||
break;
|
||||
default:
|
||||
m_log.InfoFormat("[FLOTSAM ASSET CACHE] Unknown command {0}", cmd);
|
||||
m_log.InfoFormat("[FLOTSAM ASSET CACHE]: Unknown command {0}", cmd);
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (cmdparams.Length == 1)
|
||||
{
|
||||
m_log.InfoFormat("[FLOTSAM ASSET CACHE] flotsamcache status - Display cache status");
|
||||
m_log.InfoFormat("[FLOTSAM ASSET CACHE] flotsamcache clearmem - Remove all assets cached in memory");
|
||||
m_log.InfoFormat("[FLOTSAM ASSET CACHE] flotsamcache clearfile - Remove all assets cached on disk");
|
||||
m_log.InfoFormat("[FLOTSAM ASSET CACHE] flotsamcache cachescenes - Attempt a deep cache of all assets in all scenes");
|
||||
m_log.InfoFormat("[FLOTSAM ASSET CACHE] flotsamcache <datetime> - Purge assets older then the specified date & time");
|
||||
|
||||
m_log.InfoFormat("[FLOTSAM ASSET CACHE]: fcache status - Display cache status");
|
||||
m_log.InfoFormat("[FLOTSAM ASSET CACHE]: fcache clearmem - Remove all assets cached in memory");
|
||||
m_log.InfoFormat("[FLOTSAM ASSET CACHE]: fcache clearfile - Remove all assets cached on disk");
|
||||
m_log.InfoFormat("[FLOTSAM ASSET CACHE]: fcache cachescenes - Attempt a deep cache of all assets in all scenes");
|
||||
m_log.InfoFormat("[FLOTSAM ASSET CACHE]: fcache <datetime> - Purge assets older then the specified date & time");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,127 @@
|
|||
/*
|
||||
* 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.IO;
|
||||
using System.Reflection;
|
||||
using System.Threading;
|
||||
using log4net.Config;
|
||||
using Nini.Config;
|
||||
using NUnit.Framework;
|
||||
using OpenMetaverse;
|
||||
using OpenMetaverse.Assets;
|
||||
using Flotsam.RegionModules.AssetCache;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Region.Framework.Scenes;
|
||||
using OpenSim.Region.Framework.Scenes.Serialization;
|
||||
using OpenSim.Tests.Common;
|
||||
using OpenSim.Tests.Common.Mock;
|
||||
|
||||
namespace OpenSim.Region.CoreModules.Asset.Tests
|
||||
{
|
||||
/// <summary>
|
||||
/// At the moment we're only test the in-memory part of the FlotsamAssetCache. This is a considerable weakness.
|
||||
/// </summary>
|
||||
[TestFixture]
|
||||
public class FlotsamAssetCacheTests
|
||||
{
|
||||
protected TestScene m_scene;
|
||||
protected FlotsamAssetCache m_cache;
|
||||
|
||||
[SetUp]
|
||||
public void SetUp()
|
||||
{
|
||||
IConfigSource config = new IniConfigSource();
|
||||
|
||||
config.AddConfig("Modules");
|
||||
config.Configs["Modules"].Set("AssetCaching", "FlotsamAssetCache");
|
||||
config.AddConfig("AssetCache");
|
||||
config.Configs["AssetCache"].Set("FileCacheEnabled", "false");
|
||||
config.Configs["AssetCache"].Set("MemoryCacheEnabled", "true");
|
||||
|
||||
m_cache = new FlotsamAssetCache();
|
||||
m_scene = SceneSetupHelpers.SetupScene();
|
||||
SceneSetupHelpers.SetupSceneModules(m_scene, config, m_cache);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestCacheAsset()
|
||||
{
|
||||
TestHelper.InMethod();
|
||||
// log4net.Config.XmlConfigurator.Configure();
|
||||
|
||||
AssetBase asset = AssetHelpers.CreateAsset();
|
||||
asset.ID = TestHelper.ParseTail(0x1).ToString();
|
||||
|
||||
// Check we don't get anything before the asset is put in the cache
|
||||
AssetBase retrievedAsset = m_cache.Get(asset.ID.ToString());
|
||||
Assert.That(retrievedAsset, Is.Null);
|
||||
|
||||
m_cache.Store(asset);
|
||||
|
||||
// Check that asset is now in cache
|
||||
retrievedAsset = m_cache.Get(asset.ID.ToString());
|
||||
Assert.That(retrievedAsset, Is.Not.Null);
|
||||
Assert.That(retrievedAsset.ID, Is.EqualTo(asset.ID));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestExpireAsset()
|
||||
{
|
||||
TestHelper.InMethod();
|
||||
// log4net.Config.XmlConfigurator.Configure();
|
||||
|
||||
AssetBase asset = AssetHelpers.CreateAsset();
|
||||
asset.ID = TestHelper.ParseTail(0x2).ToString();
|
||||
|
||||
m_cache.Store(asset);
|
||||
|
||||
m_cache.Expire(asset.ID);
|
||||
|
||||
AssetBase retrievedAsset = m_cache.Get(asset.ID.ToString());
|
||||
Assert.That(retrievedAsset, Is.Null);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestClearCache()
|
||||
{
|
||||
TestHelper.InMethod();
|
||||
// log4net.Config.XmlConfigurator.Configure();
|
||||
|
||||
AssetBase asset = AssetHelpers.CreateAsset();
|
||||
asset.ID = TestHelper.ParseTail(0x2).ToString();
|
||||
|
||||
m_cache.Store(asset);
|
||||
|
||||
m_cache.Clear();
|
||||
|
||||
AssetBase retrievedAsset = m_cache.Get(asset.ID.ToString());
|
||||
Assert.That(retrievedAsset, Is.Null);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -115,17 +115,21 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
|
|||
|
||||
#endregion
|
||||
|
||||
/// <summary>
|
||||
/// Check for the existence of the baked texture assets.
|
||||
/// </summary>
|
||||
/// <param name="client"></param>
|
||||
public bool ValidateBakedTextureCache(IClientAPI client)
|
||||
{
|
||||
return ValidateBakedTextureCache(client, true);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Check for the existence of the baked texture assets. Request a rebake
|
||||
/// unless checkonly is true.
|
||||
/// </summary>
|
||||
/// <param name="client"></param>
|
||||
/// <param name="checkonly"></param>
|
||||
public bool ValidateBakedTextureCache(IClientAPI client)
|
||||
{
|
||||
return ValidateBakedTextureCache(client, true);
|
||||
}
|
||||
|
||||
private bool ValidateBakedTextureCache(IClientAPI client, bool checkonly)
|
||||
{
|
||||
ScenePresence sp = m_scene.GetScenePresence(client.AgentId);
|
||||
|
@ -156,18 +160,20 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
|
|||
|
||||
defonly = false; // found a non-default texture reference
|
||||
|
||||
if (! CheckBakedTextureAsset(client,face.TextureID,idx))
|
||||
if (!CheckBakedTextureAsset(client, face.TextureID, idx))
|
||||
{
|
||||
// the asset didn't exist if we are only checking, then we found a bad
|
||||
// one and we're done otherwise, ask for a rebake
|
||||
if (checkonly) return false;
|
||||
if (checkonly)
|
||||
return false;
|
||||
|
||||
m_log.InfoFormat("[AVFACTORY]: missing baked texture {0}, requesting rebake",face.TextureID);
|
||||
m_log.InfoFormat("[AVFACTORY]: missing baked texture {0}, requesting rebake", face.TextureID);
|
||||
|
||||
client.SendRebakeAvatarTextures(face.TextureID);
|
||||
}
|
||||
}
|
||||
|
||||
m_log.DebugFormat("[AVFACTORY]: completed texture check for {0}", client.AgentId);
|
||||
m_log.DebugFormat("[AVFACTORY]: Completed texture check for {0}", client.AgentId);
|
||||
|
||||
// If we only found default textures, then the appearance is not cached
|
||||
return (defonly ? false : true);
|
||||
|
@ -183,7 +189,7 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
|
|||
ScenePresence sp = m_scene.GetScenePresence(client.AgentId);
|
||||
if (sp == null)
|
||||
{
|
||||
m_log.WarnFormat("[AVFACTORY]: SetAppearance unable to find presence for {0}",client.AgentId);
|
||||
m_log.WarnFormat("[AVFACTORY]: SetAppearance unable to find presence for {0}", client.AgentId);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -211,7 +217,7 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
|
|||
changed = sp.Appearance.SetTextureEntries(textureEntry) || changed;
|
||||
|
||||
m_log.InfoFormat("[AVFACTORY]: received texture update for {0}", client.AgentId);
|
||||
Util.FireAndForget(delegate(object o) { ValidateBakedTextureCache(client,false); });
|
||||
Util.FireAndForget(delegate(object o) { ValidateBakedTextureCache(client, false); });
|
||||
|
||||
// This appears to be set only in the final stage of the appearance
|
||||
// update transaction. In theory, we should be able to do an immediate
|
||||
|
@ -220,9 +226,9 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
|
|||
// save only if there were changes, send no matter what (doesn't hurt to send twice)
|
||||
if (changed)
|
||||
QueueAppearanceSave(client.AgentId);
|
||||
|
||||
QueueAppearanceSend(client.AgentId);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// m_log.WarnFormat("[AVFACTORY]: complete SetAppearance for {0}:\n{1}",client.AgentId,sp.Appearance.ToString());
|
||||
|
|
|
@ -0,0 +1,69 @@
|
|||
/*
|
||||
* 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 NUnit.Framework;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Region.Framework.Scenes;
|
||||
using OpenSim.Tests.Common;
|
||||
using OpenSim.Tests.Common.Mock;
|
||||
|
||||
namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
|
||||
{
|
||||
[TestFixture]
|
||||
public class AvatarFactoryModuleTests
|
||||
{
|
||||
/// <summary>
|
||||
/// Only partial right now since we don't yet test that it's ended up in the avatar appearance service.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void TestSetAppearance()
|
||||
{
|
||||
TestHelper.InMethod();
|
||||
// log4net.Config.XmlConfigurator.Configure();
|
||||
|
||||
UUID userId = TestHelper.ParseTail(0x1);
|
||||
|
||||
AvatarFactoryModule afm = new AvatarFactoryModule();
|
||||
TestScene scene = SceneSetupHelpers.SetupScene();
|
||||
SceneSetupHelpers.SetupSceneModules(scene, afm);
|
||||
TestClient tc = SceneSetupHelpers.AddClient(scene, userId);
|
||||
|
||||
byte[] visualParams = new byte[AvatarAppearance.VISUALPARAM_COUNT];
|
||||
for (byte i = 0; i < visualParams.Length; i++)
|
||||
visualParams[i] = i;
|
||||
|
||||
afm.SetAppearance(tc, new Primitive.TextureEntry(TestHelper.ParseTail(0x10)), visualParams);
|
||||
|
||||
ScenePresence sp = scene.GetScenePresence(userId);
|
||||
|
||||
// TODO: Check baked texture
|
||||
Assert.AreEqual(visualParams, sp.Appearance.VisualParams);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -830,7 +830,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
|
|||
|
||||
public bool LocalStatusNotification(UUID userID, UUID friendID, bool online)
|
||||
{
|
||||
m_log.DebugFormat("[FRIENDS]: Local Status Notify {0} that user {1} is {2}", friendID, userID, online);
|
||||
// m_log.DebugFormat("[FRIENDS]: Local Status Notify {0} that user {1} is {2}", friendID, userID, online);
|
||||
IClientAPI friendClient = LocateClientObject(friendID);
|
||||
if (friendClient != null)
|
||||
{
|
||||
|
|
|
@ -50,6 +50,17 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
|||
{
|
||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
/// <summary>
|
||||
/// The maximum distance, in standard region units (256m) that an agent is allowed to transfer.
|
||||
/// </summary>
|
||||
private int m_MaxTransferDistance = 4095;
|
||||
public int MaxTransferDistance
|
||||
{
|
||||
get { return m_MaxTransferDistance; }
|
||||
set { m_MaxTransferDistance = value; }
|
||||
}
|
||||
|
||||
|
||||
protected bool m_Enabled = false;
|
||||
protected Scene m_aScene;
|
||||
protected List<Scene> m_Scenes = new List<Scene>();
|
||||
|
@ -78,13 +89,26 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
|||
string name = moduleConfig.GetString("EntityTransferModule", "");
|
||||
if (name == Name)
|
||||
{
|
||||
m_agentsInTransit = new List<UUID>();
|
||||
m_Enabled = true;
|
||||
m_log.InfoFormat("[ENTITY TRANSFER MODULE]: {0} enabled.", Name);
|
||||
InitialiseCommon(source);
|
||||
m_log.DebugFormat("[ENTITY TRANSFER MODULE]: {0} enabled.", Name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Initialize config common for this module and any descendents.
|
||||
/// </summary>
|
||||
/// <param name="source"></param>
|
||||
protected virtual void InitialiseCommon(IConfigSource source)
|
||||
{
|
||||
IConfig transferConfig = source.Configs["EntityTransfer"];
|
||||
if (transferConfig != null)
|
||||
MaxTransferDistance = transferConfig.GetInt("max_distance", 4095);
|
||||
|
||||
m_agentsInTransit = new List<UUID>();
|
||||
m_Enabled = true;
|
||||
}
|
||||
|
||||
public virtual void PostInitialise()
|
||||
{
|
||||
}
|
||||
|
@ -114,7 +138,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
|||
return;
|
||||
}
|
||||
|
||||
|
||||
public virtual void RemoveRegion(Scene scene)
|
||||
{
|
||||
if (!m_Enabled)
|
||||
|
@ -129,7 +152,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
|||
{
|
||||
if (!m_Enabled)
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
@ -204,8 +226,18 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
|||
sp.ControllingClient.SendTeleportFailed("Problem at destination");
|
||||
return;
|
||||
}
|
||||
m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Final destination is x={0} y={1} {2}@{3}",
|
||||
finalDestination.RegionLocX / Constants.RegionSize, finalDestination.RegionLocY / Constants.RegionSize, finalDestination.RegionID, finalDestination.ServerURI);
|
||||
|
||||
uint curX = 0, curY = 0;
|
||||
Utils.LongToUInts(sp.Scene.RegionInfo.RegionHandle, out curX, out curY);
|
||||
int curCellX = (int)(curX / Constants.RegionSize);
|
||||
int curCellY = (int)(curY / Constants.RegionSize);
|
||||
int destCellX = (int)(finalDestination.RegionLocX / Constants.RegionSize);
|
||||
int destCellY = (int)(finalDestination.RegionLocY / Constants.RegionSize);
|
||||
|
||||
// m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Source co-ords are x={0} y={1}", curRegionX, curRegionY);
|
||||
//
|
||||
// m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Final dest is x={0} y={1} {2}@{3}",
|
||||
// destRegionX, destRegionY, finalDestination.RegionID, finalDestination.ServerURI);
|
||||
|
||||
// Check that these are not the same coordinates
|
||||
if (finalDestination.RegionLocX == sp.Scene.RegionInfo.RegionLocX &&
|
||||
|
@ -216,6 +248,18 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
|||
return;
|
||||
}
|
||||
|
||||
if (Math.Abs(curCellX - destCellX) > MaxTransferDistance || Math.Abs(curCellY - destCellY) > MaxTransferDistance)
|
||||
{
|
||||
sp.ControllingClient.SendTeleportFailed(
|
||||
string.Format(
|
||||
"Can't teleport to {0} ({1},{2}) from {3} ({4},{5}), destination is more than {6} regions way",
|
||||
finalDestination.RegionName, destCellX, destCellY,
|
||||
sp.Scene.RegionInfo.RegionName, curCellX, curCellY,
|
||||
MaxTransferDistance));
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
// This is it
|
||||
//
|
||||
|
|
|
@ -67,10 +67,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
|||
string name = moduleConfig.GetString("EntityTransferModule", "");
|
||||
if (name == Name)
|
||||
{
|
||||
m_agentsInTransit = new List<UUID>();
|
||||
|
||||
m_Enabled = true;
|
||||
m_log.InfoFormat("[HG ENTITY TRANSFER MODULE]: {0} enabled.", Name);
|
||||
InitialiseCommon(source);
|
||||
m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: {0} enabled.", Name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -978,7 +978,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
|
|||
{
|
||||
}
|
||||
|
||||
public virtual bool GetAgentInventoryItem(IClientAPI remoteClient, UUID itemID, UUID requestID)
|
||||
public virtual bool CanGetAgentInventoryItem(IClientAPI remoteClient, UUID itemID, UUID requestID)
|
||||
{
|
||||
InventoryItemBase assetRequestItem = GetItem(remoteClient.AgentId, itemID);
|
||||
if (assetRequestItem == null)
|
||||
|
@ -1057,7 +1057,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
|
|||
InventoryItemBase item = new InventoryItemBase(itemID, agentID);
|
||||
item = invService.GetItem(item);
|
||||
|
||||
if (item.CreatorData != null && item.CreatorData != string.Empty)
|
||||
if (item != null && item.CreatorData != null && item.CreatorData != string.Empty)
|
||||
UserManagementModule.AddUser(item.CreatorIdAsUuid, item.CreatorData);
|
||||
|
||||
return item;
|
||||
|
@ -1065,4 +1065,4 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
|
|||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
}
|
|
@ -297,9 +297,10 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement
|
|||
if (m_UserCache.ContainsKey(id))
|
||||
return;
|
||||
|
||||
// m_log.DebugFormat("[USER MANAGEMENT MODULE]: Adding user with id {0}, craetorData {1}", id, creatorData);
|
||||
|
||||
UserData user = new UserData();
|
||||
user.Id = id;
|
||||
|
||||
UserAccount account = m_Scenes[0].UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, id);
|
||||
|
||||
if (account != null)
|
||||
|
|
|
@ -284,9 +284,9 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
|
|||
|
||||
item = m_InventoryService.GetItem(item);
|
||||
|
||||
if (null == item)
|
||||
m_log.ErrorFormat(
|
||||
"[LOCAL INVENTORY SERVICES CONNECTOR]: Could not find item with id {0}", requestedItemId);
|
||||
// if (null == item)
|
||||
// m_log.ErrorFormat(
|
||||
// "[LOCAL INVENTORY SERVICES CONNECTOR]: Could not find item with id {0}", requestedItemId);
|
||||
|
||||
return item;
|
||||
}
|
||||
|
|
|
@ -418,7 +418,7 @@ namespace OpenSim.Region.CoreModules.World.Land
|
|||
|
||||
public bool IsBannedFromLand(UUID avatar)
|
||||
{
|
||||
if (m_scene.Permissions.IsAdministrator(avatar))
|
||||
if (m_scene.Permissions.CanEditParcelProperties(avatar, this, 0))
|
||||
return false;
|
||||
|
||||
if ((LandData.Flags & (uint) ParcelFlags.UseBanList) > 0)
|
||||
|
@ -429,7 +429,7 @@ namespace OpenSim.Region.CoreModules.World.Land
|
|||
if (e.AgentID == avatar && e.Flags == AccessList.Ban)
|
||||
return true;
|
||||
return false;
|
||||
}) != -1 && LandData.OwnerID != avatar)
|
||||
}) != -1)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
@ -439,7 +439,7 @@ namespace OpenSim.Region.CoreModules.World.Land
|
|||
|
||||
public bool IsRestrictedFromLand(UUID avatar)
|
||||
{
|
||||
if (m_scene.Permissions.IsAdministrator(avatar))
|
||||
if (m_scene.Permissions.CanEditParcelProperties(avatar, this, 0))
|
||||
return false;
|
||||
|
||||
if ((LandData.Flags & (uint) ParcelFlags.UseAccessList) > 0)
|
||||
|
@ -450,7 +450,7 @@ namespace OpenSim.Region.CoreModules.World.Land
|
|||
if (e.AgentID == avatar && e.Flags == AccessList.Access)
|
||||
return true;
|
||||
return false;
|
||||
}) == -1 && LandData.OwnerID != avatar)
|
||||
}) == -1)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -134,7 +134,7 @@ namespace OpenSim.Region.CoreModules.World.Permissions
|
|||
return;
|
||||
|
||||
m_allowGridGods = myConfig.GetBoolean("allow_grid_gods", false);
|
||||
m_bypassPermissions = !myConfig.GetBoolean("serverside_object_permissions", false);
|
||||
m_bypassPermissions = !myConfig.GetBoolean("serverside_object_permissions", true);
|
||||
m_propagatePermissions = myConfig.GetBoolean("propagate_permissions", true);
|
||||
m_RegionOwnerIsGod = myConfig.GetBoolean("region_owner_is_god", true);
|
||||
m_RegionManagerIsGod = myConfig.GetBoolean("region_manager_is_god", false);
|
||||
|
|
|
@ -91,6 +91,8 @@ namespace OpenSim.Region.CoreModules.World.WorldMap
|
|||
remoteClient.SendAlertMessage("Use a search string with at least 3 characters");
|
||||
return;
|
||||
}
|
||||
|
||||
m_log.DebugFormat("MAP NAME=({0})", mapName);
|
||||
|
||||
// try to fetch from GridServer
|
||||
List<GridRegion> regionInfos = m_scene.GridService.GetRegionsByName(m_scene.RegionInfo.ScopeID, mapName, 20);
|
||||
|
@ -103,7 +105,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap
|
|||
if (info != null)
|
||||
regionInfos.Add(info);
|
||||
}
|
||||
else if (regionInfos.Count == 0 && mapName.StartsWith("http://"))
|
||||
else if (regionInfos.Count == 0)
|
||||
remoteClient.SendAlertMessage("Hyperlink could not be established.");
|
||||
|
||||
m_log.DebugFormat("[MAPSEARCHMODULE]: search {0} returned {1} regions. Flags={2}", mapName, regionInfos.Count, flags);
|
||||
|
|
|
@ -36,4 +36,4 @@ namespace OpenSim.Region.Framework.Interfaces
|
|||
void QueueAppearanceSend(UUID agentid);
|
||||
void QueueAppearanceSave(UUID agentid);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -59,7 +59,15 @@ namespace OpenSim.Region.Framework.Interfaces
|
|||
UUID RayTargetID, byte BypassRayCast, bool RayEndIsIntersection,
|
||||
bool RezSelected, bool RemoveItem, UUID fromTaskID, bool attachment);
|
||||
void TransferInventoryAssets(InventoryItemBase item, UUID sender, UUID receiver);
|
||||
bool GetAgentInventoryItem(IClientAPI remoteClient, UUID itemID, UUID requestID);
|
||||
|
||||
/// <summary>
|
||||
/// Does the client have sufficient permissions to retrieve the inventory item?
|
||||
/// </summary>
|
||||
/// <param name="remoteClient"></param>
|
||||
/// <param name="itemID"></param>
|
||||
/// <param name="requestID"></param>
|
||||
/// <returns></returns>
|
||||
bool CanGetAgentInventoryItem(IClientAPI remoteClient, UUID itemID, UUID requestID);
|
||||
|
||||
// Must be here because of textures in user's inventory
|
||||
bool IsForeignUser(UUID userID, out string assetServerURL);
|
||||
|
|
|
@ -28,7 +28,7 @@
|
|||
using OpenMetaverse;
|
||||
using OpenSim.Region.Framework.Scenes;
|
||||
|
||||
namespace OpenSim.Region.CoreModules.Avatar.NPC
|
||||
namespace OpenSim.Region.Framework.Interfaces
|
||||
{
|
||||
public interface INPCModule
|
||||
{
|
|
@ -0,0 +1,156 @@
|
|||
/*
|
||||
* 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.Threading;
|
||||
using log4net;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Region.Framework.Interfaces;
|
||||
|
||||
namespace OpenSim.Region.Framework.Scenes
|
||||
{
|
||||
class FetchHolder
|
||||
{
|
||||
public IClientAPI Client { get; private set; }
|
||||
public UUID ItemID { get; private set; }
|
||||
|
||||
public FetchHolder(IClientAPI client, UUID itemID)
|
||||
{
|
||||
Client = client;
|
||||
ItemID = itemID;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Send FetchInventoryReply information to clients asynchronously on a single thread rather than asynchronously via
|
||||
/// multiple threads.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// If the main root inventory is right-clicked on a version 1 viewer for a user with a large inventory, a very
|
||||
/// very large number of FetchInventory requests are sent to the simulator. Each is handled on a separate thread
|
||||
/// by the IClientAPI, but the sheer number of requests overwhelms the number of threads available and ends up
|
||||
/// freezing the inbound packet handling.
|
||||
///
|
||||
/// This class makes the first FetchInventory packet thread process the queue. If new requests come
|
||||
/// in while it is processing, then the subsequent threads just add the requests and leave it to the original
|
||||
/// thread to process them.
|
||||
///
|
||||
/// This might slow down outbound packets but these are limited by the IClientAPI outbound queues
|
||||
/// anyway.
|
||||
///
|
||||
/// It might be possible to ignore FetchInventory requests altogether, particularly as they are redundant wrt to
|
||||
/// FetchInventoryDescendents requests, but this would require more investigation.
|
||||
/// </remarks>
|
||||
public class AsyncInventorySender
|
||||
{
|
||||
// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
protected Scene m_scene;
|
||||
|
||||
/// <summary>
|
||||
/// Queues fetch requests
|
||||
/// </summary>
|
||||
Queue<FetchHolder> m_fetchHolder = new Queue<FetchHolder>();
|
||||
|
||||
/// <summary>
|
||||
/// Signal whether a queue is currently being processed or not.
|
||||
/// </summary>
|
||||
protected volatile bool m_processing;
|
||||
|
||||
public AsyncInventorySender(Scene scene)
|
||||
{
|
||||
m_processing = false;
|
||||
m_scene = scene;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Handle a fetch inventory request from the client
|
||||
/// </summary>
|
||||
/// <param name="remoteClient"></param>
|
||||
/// <param name="itemID"></param>
|
||||
/// <param name="ownerID"></param>
|
||||
public void HandleFetchInventory(IClientAPI remoteClient, UUID itemID, UUID ownerID)
|
||||
{
|
||||
lock (m_fetchHolder)
|
||||
{
|
||||
// m_log.DebugFormat(
|
||||
// "[ASYNC INVENTORY SENDER]: Putting request from {0} for {1} on queue", remoteClient.Name, itemID);
|
||||
|
||||
m_fetchHolder.Enqueue(new FetchHolder(remoteClient, itemID));
|
||||
}
|
||||
|
||||
if (!m_processing)
|
||||
{
|
||||
m_processing = true;
|
||||
ProcessQueue();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Process the queue of fetches
|
||||
/// </summary>
|
||||
protected void ProcessQueue()
|
||||
{
|
||||
FetchHolder fh = null;
|
||||
|
||||
while (true)
|
||||
{
|
||||
lock (m_fetchHolder)
|
||||
{
|
||||
// m_log.DebugFormat("[ASYNC INVENTORY SENDER]: {0} items left to process", m_fetchHolder.Count);
|
||||
|
||||
if (m_fetchHolder.Count == 0)
|
||||
{
|
||||
m_processing = false;
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
fh = m_fetchHolder.Dequeue();
|
||||
}
|
||||
}
|
||||
|
||||
if (fh.Client.IsLoggingOut)
|
||||
continue;
|
||||
|
||||
// m_log.DebugFormat(
|
||||
// "[ASYNC INVENTORY SENDER]: Handling request from {0} for {1} on queue", fh.Client.Name, fh.ItemID);
|
||||
|
||||
InventoryItemBase item = new InventoryItemBase(fh.ItemID, fh.Client.AgentId);
|
||||
item = m_scene.InventoryService.GetItem(item);
|
||||
|
||||
if (item != null)
|
||||
fh.Client.SendInventoryItemDetails(item.Owner, item);
|
||||
|
||||
// TODO: Possibly log any failure
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -51,6 +51,11 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
/// </summary>
|
||||
protected AsyncSceneObjectGroupDeleter m_asyncSceneObjectDeleter;
|
||||
|
||||
/// <summary>
|
||||
/// Allows inventory details to be sent to clients asynchronously
|
||||
/// </summary>
|
||||
protected AsyncInventorySender m_asyncInventorySender;
|
||||
|
||||
/// <summary>
|
||||
/// Start all the scripts in the scene which should be started.
|
||||
/// </summary>
|
||||
|
@ -1328,7 +1333,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
// m_log.DebugFormat("[AGENT INVENTORY]: Sending inventory folder contents ({0} nodes) for \"{1}\" to {2} {3}",
|
||||
// contents.Folders.Count + contents.Items.Count, containingFolder.Name, client.FirstName, client.LastName);
|
||||
|
||||
if (containingFolder != null && containingFolder != null)
|
||||
if (containingFolder != null)
|
||||
{
|
||||
// If the folder requested contains links, then we need to send those folders first, otherwise the links
|
||||
// will be broken in the viewer.
|
||||
|
@ -1340,15 +1345,25 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
InventoryItemBase linkedItem = InventoryService.GetItem(new InventoryItemBase(item.AssetID));
|
||||
|
||||
// Take care of genuinely broken links where the target doesn't exist
|
||||
if (linkedItem != null)
|
||||
linkedItemFolderIdsToSend.Add(linkedItem.Folder);
|
||||
// HACK: Also, don't follow up links that just point to other links. In theory this is legitimate,
|
||||
// but no viewer has been observed to set these up and this is the lazy way of avoiding cycles
|
||||
// rather than having to keep track of every folder requested in the recursion.
|
||||
if (linkedItem != null && linkedItem.AssetType != (int)AssetType.Link)
|
||||
{
|
||||
// We don't need to send the folder if source and destination of the link are in the same
|
||||
// folder.
|
||||
if (linkedItem.Folder != containingFolder.ID)
|
||||
linkedItemFolderIdsToSend.Add(linkedItem.Folder);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
foreach (UUID linkedItemFolderId in linkedItemFolderIdsToSend)
|
||||
SendInventoryUpdate(client, new InventoryFolderBase(linkedItemFolderId), false, true);
|
||||
|
||||
client.SendInventoryFolderDetails(client.AgentId, folder.ID, contents.Items, contents.Folders, containingFolder.Version, fetchFolders, fetchItems);
|
||||
client.SendInventoryFolderDetails(
|
||||
client.AgentId, folder.ID, contents.Items, contents.Folders,
|
||||
containingFolder.Version, fetchFolders, fetchItems);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -461,31 +461,6 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
}
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Handle a fetch inventory request from the client
|
||||
/// </summary>
|
||||
/// <param name="remoteClient"></param>
|
||||
/// <param name="itemID"></param>
|
||||
/// <param name="ownerID"></param>
|
||||
public void HandleFetchInventory(IClientAPI remoteClient, UUID itemID, UUID ownerID)
|
||||
{
|
||||
if (LibraryService != null && LibraryService.LibraryRootFolder != null && ownerID == LibraryService.LibraryRootFolder.Owner)
|
||||
{
|
||||
//m_log.Debug("request info for library item");
|
||||
return;
|
||||
}
|
||||
|
||||
InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId);
|
||||
item = InventoryService.GetItem(item);
|
||||
|
||||
if (item != null)
|
||||
{
|
||||
remoteClient.SendInventoryItemDetails(ownerID, item);
|
||||
}
|
||||
// else shouldn't we send an alert message?
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Tell the client about the various child items and folders contained in the requested folder.
|
||||
|
|
|
@ -583,6 +583,8 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
m_asyncSceneObjectDeleter = new AsyncSceneObjectGroupDeleter(this);
|
||||
m_asyncSceneObjectDeleter.Enabled = true;
|
||||
|
||||
m_asyncInventorySender = new AsyncInventorySender(this);
|
||||
|
||||
#region Region Settings
|
||||
|
||||
// Load region settings
|
||||
|
@ -1724,6 +1726,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
/// <summary>
|
||||
/// Loads the World's objects
|
||||
/// </summary>
|
||||
/// <param name="regionID"></param>
|
||||
public virtual void LoadPrimsFromStorage(UUID regionID)
|
||||
{
|
||||
LoadingPrims = true;
|
||||
|
@ -2593,8 +2596,10 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
{
|
||||
string homeURL = string.Empty;
|
||||
string first = aCircuit.firstname, last = aCircuit.lastname;
|
||||
|
||||
if (aCircuit.ServiceURLs.ContainsKey("HomeURI"))
|
||||
homeURL = aCircuit.ServiceURLs["HomeURI"].ToString();
|
||||
|
||||
if (aCircuit.lastname.StartsWith("@"))
|
||||
{
|
||||
string[] parts = aCircuit.firstname.Split('.');
|
||||
|
@ -2604,6 +2609,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
last = parts[1];
|
||||
}
|
||||
}
|
||||
|
||||
uMan.AddUser(aCircuit.AgentID, first, last, homeURL);
|
||||
}
|
||||
}
|
||||
|
@ -2757,14 +2763,13 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
|
||||
public virtual void SubscribeToClientInventoryEvents(IClientAPI client)
|
||||
{
|
||||
|
||||
client.OnLinkInventoryItem += HandleLinkInventoryItem;
|
||||
client.OnCreateNewInventoryFolder += HandleCreateInventoryFolder;
|
||||
client.OnUpdateInventoryFolder += HandleUpdateInventoryFolder;
|
||||
client.OnMoveInventoryFolder += HandleMoveInventoryFolder; // 2; //!!
|
||||
client.OnFetchInventoryDescendents += HandleFetchInventoryDescendents;
|
||||
client.OnPurgeInventoryDescendents += HandlePurgeInventoryDescendents; // 2; //!!
|
||||
client.OnFetchInventory += HandleFetchInventory;
|
||||
client.OnFetchInventory += m_asyncInventorySender.HandleFetchInventory;
|
||||
client.OnUpdateInventoryItem += UpdateInventoryItemAsset;
|
||||
client.OnCopyInventoryItem += CopyInventoryItem;
|
||||
client.OnMoveInventoryItem += MoveInventoryItem;
|
||||
|
@ -2883,13 +2888,12 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
|
||||
public virtual void UnSubscribeToClientInventoryEvents(IClientAPI client)
|
||||
{
|
||||
|
||||
client.OnCreateNewInventoryFolder -= HandleCreateInventoryFolder;
|
||||
client.OnUpdateInventoryFolder -= HandleUpdateInventoryFolder;
|
||||
client.OnMoveInventoryFolder -= HandleMoveInventoryFolder; // 2; //!!
|
||||
client.OnFetchInventoryDescendents -= HandleFetchInventoryDescendents;
|
||||
client.OnPurgeInventoryDescendents -= HandlePurgeInventoryDescendents; // 2; //!!
|
||||
client.OnFetchInventory -= HandleFetchInventory;
|
||||
client.OnFetchInventory -= m_asyncInventorySender.HandleFetchInventory;
|
||||
client.OnUpdateInventoryItem -= UpdateInventoryItemAsset;
|
||||
client.OnCopyInventoryItem -= CopyInventoryItem;
|
||||
client.OnMoveInventoryItem -= MoveInventoryItem;
|
||||
|
@ -3389,7 +3393,6 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
// In all cases, add or update the circuit data with the new agent circuit data and teleport flags
|
||||
agent.teleportFlags = teleportFlags;
|
||||
m_authenticateHandler.AddNewCircuit(agent.circuitcode, agent);
|
||||
|
|
|
@ -1401,21 +1401,26 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// Update the flags on a scene object. This covers properties such as phantom, physics and temporary.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// This is currently handling the incoming call from the client stack (e.g. LLClientView).
|
||||
/// </remarks>
|
||||
/// <param name="localID"></param>
|
||||
/// <param name="packet"></param>
|
||||
/// <param name="UsePhysics"></param>
|
||||
/// <param name="SetTemporary"></param>
|
||||
/// <param name="SetPhantom"></param>
|
||||
/// <param name="remoteClient"></param>
|
||||
/// This routine seems to get called when a user changes object settings in the viewer.
|
||||
/// If some one can confirm that, please change the comment according.
|
||||
protected internal void UpdatePrimFlags(uint localID, bool UsePhysics, bool IsTemporary, bool IsPhantom, IClientAPI remoteClient)
|
||||
protected internal void UpdatePrimFlags(
|
||||
uint localID, bool UsePhysics, bool SetTemporary, bool SetPhantom, IClientAPI remoteClient)
|
||||
{
|
||||
SceneObjectGroup group = GetGroupByPrim(localID);
|
||||
if (group != null)
|
||||
{
|
||||
if (m_parentScene.Permissions.CanEditObject(group.UUID, remoteClient.AgentId))
|
||||
{
|
||||
group.UpdatePrimFlags(localID, UsePhysics, IsTemporary, IsPhantom, false); // VolumeDetect can't be set via UI and will always be off when a change is made there
|
||||
// VolumeDetect can't be set via UI and will always be off when a change is made there
|
||||
group.UpdatePrimFlags(localID, UsePhysics, SetTemporary, SetPhantom, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2513,14 +2513,15 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
/// Update prim flags for this group.
|
||||
/// </summary>
|
||||
/// <param name="localID"></param>
|
||||
/// <param name="type"></param>
|
||||
/// <param name="inUse"></param>
|
||||
/// <param name="data"></param>
|
||||
public void UpdatePrimFlags(uint localID, bool UsePhysics, bool IsTemporary, bool IsPhantom, bool IsVolumeDetect)
|
||||
/// <param name="UsePhysics"></param>
|
||||
/// <param name="SetTemporary"></param>
|
||||
/// <param name="SetPhantom"></param>
|
||||
/// <param name="SetVolumeDetect"></param>
|
||||
public void UpdatePrimFlags(uint localID, bool UsePhysics, bool SetTemporary, bool SetPhantom, bool SetVolumeDetect)
|
||||
{
|
||||
SceneObjectPart selectionPart = GetChildPart(localID);
|
||||
|
||||
if (IsTemporary)
|
||||
if (SetTemporary)
|
||||
{
|
||||
DetachFromBackup();
|
||||
// Remove from database and parcel prim count
|
||||
|
@ -2545,7 +2546,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
}
|
||||
|
||||
for (int i = 0; i < parts.Length; i++)
|
||||
parts[i].UpdatePrimFlags(UsePhysics, IsTemporary, IsPhantom, IsVolumeDetect);
|
||||
parts[i].UpdatePrimFlags(UsePhysics, SetTemporary, SetPhantom, SetVolumeDetect);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3287,34 +3288,36 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
|
||||
return retmass;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// If the object is a sculpt/mesh, retrieve the mesh data for each part and reinsert it into each shape so that
|
||||
/// the physics engine can use it.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// When the physics engine has finished with it, the sculpt data is discarded to save memory.
|
||||
/// </remarks>
|
||||
public void CheckSculptAndLoad()
|
||||
{
|
||||
if (IsDeleted)
|
||||
return;
|
||||
|
||||
if ((RootPart.GetEffectiveObjectFlags() & (uint)PrimFlags.Phantom) != 0)
|
||||
return;
|
||||
|
||||
// m_log.Debug("Processing CheckSculptAndLoad for {0} {1}", Name, LocalId);
|
||||
|
||||
SceneObjectPart[] parts = m_parts.GetArray();
|
||||
|
||||
for (int i = 0; i < parts.Length; i++)
|
||||
{
|
||||
SceneObjectPart part = parts[i];
|
||||
if (part.Shape.SculptEntry && part.Shape.SculptTexture != UUID.Zero)
|
||||
{
|
||||
// check if a previously decoded sculpt map has been cached
|
||||
if (File.Exists(System.IO.Path.Combine("j2kDecodeCache", "smap_" + part.Shape.SculptTexture.ToString())))
|
||||
{
|
||||
part.SculptTextureCallback(part.Shape.SculptTexture, null);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_scene.AssetService.Get(
|
||||
part.Shape.SculptTexture.ToString(), part, AssetReceived);
|
||||
}
|
||||
}
|
||||
}
|
||||
parts[i].CheckSculptAndLoad();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Handle an asset received asynchronously from the asset service.
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <param name="sender"></param>
|
||||
/// <param name="asset"></param>
|
||||
protected void AssetReceived(string id, Object sender, AssetBase asset)
|
||||
{
|
||||
SceneObjectPart sop = (SceneObjectPart)sender;
|
||||
|
|
|
@ -28,6 +28,7 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.IO;
|
||||
using System.Reflection;
|
||||
using System.Runtime.Serialization;
|
||||
using System.Security.Permissions;
|
||||
|
@ -800,7 +801,8 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
actor.Orientation = GetWorldRotation();
|
||||
|
||||
// Tell the physics engines that this prim changed.
|
||||
m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(actor);
|
||||
if (m_parentGroup.Scene != null)
|
||||
m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(actor);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1067,7 +1069,6 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
public bool CreateSelected
|
||||
{
|
||||
get { return m_createSelected; }
|
||||
|
@ -1085,11 +1086,13 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
|
||||
public Vector3 AbsolutePosition
|
||||
{
|
||||
get {
|
||||
get
|
||||
{
|
||||
if (IsAttachment)
|
||||
return GroupPosition;
|
||||
|
||||
return m_offsetPosition + m_groupPosition; }
|
||||
return m_offsetPosition + m_groupPosition;
|
||||
}
|
||||
}
|
||||
|
||||
public SceneObjectGroup ParentGroup
|
||||
|
@ -1238,7 +1241,9 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
/// <summary>
|
||||
/// Property flags. See OpenMetaverse.PrimFlags
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Example properties are PrimFlags.Phantom and PrimFlags.DieAtEdge
|
||||
/// </remarks>
|
||||
public PrimFlags Flags
|
||||
{
|
||||
get { return _flags; }
|
||||
|
@ -1561,6 +1566,8 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
/// <param name="m_physicalPrim"></param>
|
||||
public void ApplyPhysics(uint rootObjectFlags, bool VolumeDetectActive, bool m_physicalPrim)
|
||||
{
|
||||
// m_log.DebugFormat("[SCENE OBJECT PART]: Applying physics to {0} {1} {2}", Name, LocalId, UUID);
|
||||
|
||||
bool isPhysical = (((rootObjectFlags & (uint) PrimFlags.Physics) != 0) && m_physicalPrim);
|
||||
bool isPhantom = ((rootObjectFlags & (uint) PrimFlags.Phantom) != 0);
|
||||
|
||||
|
@ -1581,6 +1588,8 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
// or flexible
|
||||
if (!isPhantom && !IsAttachment && !(Shape.PathCurve == (byte) Extrusion.Flexible))
|
||||
{
|
||||
// m_log.DebugFormat("[SCENE OBJECT PART]: Creating PhysActor for {0} {1} {2}", Name, LocalId, UUID);
|
||||
|
||||
PhysActor = m_parentGroup.Scene.PhysicsScene.AddPrimShape(
|
||||
LocalId,
|
||||
string.Format("{0}/{1}", Name, UUID),
|
||||
|
@ -1802,7 +1811,6 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
{
|
||||
ParentGroup.Scene.jointErrorMessage(joint, "warning: tracked body name not found! joint location will not be updated properly. joint: " + Name);
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -1864,7 +1872,6 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
|
||||
PhysActor.IsPhysical = UsePhysics;
|
||||
|
||||
|
||||
// If we're not what we're supposed to be in the physics scene, recreate ourselves.
|
||||
//m_parentGroup.Scene.PhysicsScene.RemovePrim(PhysActor);
|
||||
/// that's not wholesome. Had to make Scene public
|
||||
|
@ -1888,6 +1895,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor);
|
||||
}
|
||||
}
|
||||
|
@ -2823,6 +2831,12 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
StoreUndoState();
|
||||
m_shape.Scale = scale;
|
||||
|
||||
// If we're a mesh/sculpt, then we need to tell the physics engine about our new size. To do this, we
|
||||
// need to reinsert the sculpt data into the shape, since the physics engine deletes it when done to
|
||||
// save memory
|
||||
if (PhysActor != null)
|
||||
CheckSculptAndLoad();
|
||||
|
||||
ParentGroup.HasGroupChanged = true;
|
||||
ScheduleFullUpdate();
|
||||
}
|
||||
|
@ -2951,7 +2965,6 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
public void SculptTextureCallback(UUID textureID, AssetBase texture)
|
||||
{
|
||||
if (m_shape.SculptEntry)
|
||||
|
@ -2960,14 +2973,17 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
//if (texture != null)
|
||||
{
|
||||
if (texture != null)
|
||||
{
|
||||
// m_log.DebugFormat(
|
||||
// "[SCENE OBJECT PART]: Setting sculpt data for {0} on SculptTextureCallback()", Name);
|
||||
|
||||
m_shape.SculptData = texture.Data;
|
||||
}
|
||||
|
||||
if (PhysActor != null)
|
||||
{
|
||||
// Tricks physics engine into thinking we've changed the part shape.
|
||||
PrimitiveBaseShape m_newshape = m_shape.Copy();
|
||||
PhysActor.Shape = m_newshape;
|
||||
m_shape = m_newshape;
|
||||
// Update the physics actor with the new loaded sculpt data and set the taint signal.
|
||||
PhysActor.Shape = m_shape;
|
||||
|
||||
m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor);
|
||||
}
|
||||
|
@ -3263,11 +3279,14 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
{
|
||||
m_parentGroup.SetAxisRotation(axis, rotate);
|
||||
}
|
||||
|
||||
//Cannot use ScriptBaseClass constants as no referance to it currently.
|
||||
if (axis == 2)//STATUS_ROTATE_X
|
||||
STATUS_ROTATE_X = rotate;
|
||||
|
||||
if (axis == 4)//STATUS_ROTATE_Y
|
||||
STATUS_ROTATE_Y = rotate;
|
||||
|
||||
if (axis == 8)//STATUS_ROTATE_Z
|
||||
STATUS_ROTATE_Z = rotate;
|
||||
}
|
||||
|
@ -4318,14 +4337,21 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
}
|
||||
}
|
||||
|
||||
public void UpdatePrimFlags(bool UsePhysics, bool IsTemporary, bool IsPhantom, bool IsVD)
|
||||
/// <summary>
|
||||
/// Update the flags on this prim. This covers properties such as phantom, physics and temporary.
|
||||
/// </summary>
|
||||
/// <param name="UsePhysics"></param>
|
||||
/// <param name="SetTemporary"></param>
|
||||
/// <param name="SetPhantom"></param>
|
||||
/// <param name="SetVD"></param>
|
||||
public void UpdatePrimFlags(bool UsePhysics, bool SetTemporary, bool SetPhantom, bool SetVD)
|
||||
{
|
||||
bool wasUsingPhysics = ((Flags & PrimFlags.Physics) != 0);
|
||||
bool wasTemporary = ((Flags & PrimFlags.TemporaryOnRez) != 0);
|
||||
bool wasPhantom = ((Flags & PrimFlags.Phantom) != 0);
|
||||
bool wasVD = VolumeDetectActive;
|
||||
|
||||
if ((UsePhysics == wasUsingPhysics) && (wasTemporary == IsTemporary) && (wasPhantom == IsPhantom) && (IsVD==wasVD))
|
||||
if ((UsePhysics == wasUsingPhysics) && (wasTemporary == SetTemporary) && (wasPhantom == SetPhantom) && (SetVD == wasVD))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
@ -4335,32 +4361,31 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
// that...
|
||||
// ... if VD is changed, all others are not.
|
||||
// ... if one of the others is changed, VD is not.
|
||||
if (IsVD) // VD is active, special logic applies
|
||||
if (SetVD) // VD is active, special logic applies
|
||||
{
|
||||
// State machine logic for VolumeDetect
|
||||
// More logic below
|
||||
bool phanReset = (IsPhantom != wasPhantom) && !IsPhantom;
|
||||
bool phanReset = (SetPhantom != wasPhantom) && !SetPhantom;
|
||||
|
||||
if (phanReset) // Phantom changes from on to off switch VD off too
|
||||
{
|
||||
IsVD = false; // Switch it of for the course of this routine
|
||||
SetVD = false; // Switch it of for the course of this routine
|
||||
VolumeDetectActive = false; // and also permanently
|
||||
if (PhysActor != null)
|
||||
PhysActor.SetVolumeDetect(0); // Let physics know about it too
|
||||
}
|
||||
else
|
||||
{
|
||||
IsPhantom = false;
|
||||
// If volumedetect is active we don't want phantom to be applied.
|
||||
// If this is a new call to VD out of the state "phantom"
|
||||
// this will also cause the prim to be visible to physics
|
||||
SetPhantom = false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (UsePhysics && IsJoint())
|
||||
{
|
||||
IsPhantom = true;
|
||||
SetPhantom = true;
|
||||
}
|
||||
|
||||
if (UsePhysics)
|
||||
|
@ -4390,8 +4415,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
if (IsPhantom || IsAttachment || (Shape.PathCurve == (byte)Extrusion.Flexible)) // note: this may have been changed above in the case of joints
|
||||
if (SetPhantom || IsAttachment || (Shape.PathCurve == (byte)Extrusion.Flexible)) // note: this may have been changed above in the case of joints
|
||||
{
|
||||
AddFlag(PrimFlags.Phantom);
|
||||
if (PhysActor != null)
|
||||
|
@ -4406,6 +4430,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
RemFlag(PrimFlags.Phantom);
|
||||
|
||||
PhysicsActor pa = PhysActor;
|
||||
|
||||
if (pa == null)
|
||||
{
|
||||
// It's not phantom anymore. So make sure the physics engine get's knowledge of it
|
||||
|
@ -4422,6 +4447,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
if (pa != null)
|
||||
{
|
||||
DoPhysicsPropertyUpdate(UsePhysics, true);
|
||||
|
||||
if (m_parentGroup != null)
|
||||
{
|
||||
if (!m_parentGroup.IsDeleted)
|
||||
|
@ -4432,6 +4458,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (
|
||||
((AggregateScriptEvents & scriptEvents.collision) != 0) ||
|
||||
((AggregateScriptEvents & scriptEvents.collision_end) != 0) ||
|
||||
|
@ -4442,8 +4469,8 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
(CollisionSound != UUID.Zero)
|
||||
)
|
||||
{
|
||||
PhysActor.OnCollisionUpdate += PhysicsCollision;
|
||||
PhysActor.SubscribeEvents(1000);
|
||||
PhysActor.OnCollisionUpdate += PhysicsCollision;
|
||||
PhysActor.SubscribeEvents(1000);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -4465,7 +4492,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
}
|
||||
}
|
||||
|
||||
if (IsVD)
|
||||
if (SetVD)
|
||||
{
|
||||
// If the above logic worked (this is urgent candidate to unit tests!)
|
||||
// we now have a physicsactor.
|
||||
|
@ -4480,18 +4507,19 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
}
|
||||
}
|
||||
else
|
||||
{ // Remove VolumeDetect in any case. Note, it's safe to call SetVolumeDetect as often as you like
|
||||
{
|
||||
// Remove VolumeDetect in any case. Note, it's safe to call SetVolumeDetect as often as you like
|
||||
// (mumbles, well, at least if you have infinte CPU powers :-))
|
||||
PhysicsActor pa = this.PhysActor;
|
||||
if (pa != null)
|
||||
{
|
||||
PhysActor.SetVolumeDetect(0);
|
||||
}
|
||||
|
||||
this.VolumeDetectActive = false;
|
||||
}
|
||||
|
||||
|
||||
if (IsTemporary)
|
||||
if (SetTemporary)
|
||||
{
|
||||
AddFlag(PrimFlags.TemporaryOnRez);
|
||||
}
|
||||
|
@ -4542,6 +4570,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
m_shape.PathTaperY = shapeBlock.PathTaperY;
|
||||
m_shape.PathTwist = shapeBlock.PathTwist;
|
||||
m_shape.PathTwistBegin = shapeBlock.PathTwistBegin;
|
||||
|
||||
if (PhysActor != null)
|
||||
{
|
||||
PhysActor.Shape = m_shape;
|
||||
|
@ -4562,12 +4591,45 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
ScheduleFullUpdate();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// If the part is a sculpt/mesh, retrieve the mesh data and reinsert it into the shape so that the physics
|
||||
/// engine can use it.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// When the physics engine has finished with it, the sculpt data is discarded to save memory.
|
||||
/// </remarks>
|
||||
public void CheckSculptAndLoad()
|
||||
{
|
||||
// m_log.Debug("Processing CheckSculptAndLoad for {0} {1}", Name, LocalId);
|
||||
|
||||
if (ParentGroup.IsDeleted)
|
||||
return;
|
||||
|
||||
if ((ParentGroup.RootPart.GetEffectiveObjectFlags() & (uint)PrimFlags.Phantom) != 0)
|
||||
return;
|
||||
|
||||
if (Shape.SculptEntry && Shape.SculptTexture != UUID.Zero)
|
||||
{
|
||||
// check if a previously decoded sculpt map has been cached
|
||||
if (File.Exists(System.IO.Path.Combine("j2kDecodeCache", "smap_" + Shape.SculptTexture.ToString())))
|
||||
{
|
||||
SculptTextureCallback(Shape.SculptTexture, null);
|
||||
}
|
||||
else
|
||||
{
|
||||
ParentGroup.Scene.AssetService.Get(Shape.SculptTexture.ToString(), this, AssetReceived);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Update the textures on the part.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Added to handle bug in libsecondlife's TextureEntry.ToBytes()
|
||||
/// not handling RGBA properly. Cycles through, and "fixes" the color
|
||||
/// info
|
||||
/// </remarks>
|
||||
/// <param name="tex"></param>
|
||||
public void UpdateTexture(Primitive.TextureEntry tex)
|
||||
{
|
||||
|
@ -4798,6 +4860,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
|
||||
Inventory.ApplyNextOwnerPermissions();
|
||||
}
|
||||
|
||||
public void UpdateLookAt()
|
||||
{
|
||||
try
|
||||
|
|
|
@ -1944,10 +1944,9 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
m_log.Warn("Sit requested on unknown object: " + targetID.ToString());
|
||||
}
|
||||
|
||||
|
||||
|
||||
SendSitResponse(remoteClient, targetID, offset, Quaternion.Identity);
|
||||
}
|
||||
|
||||
/*
|
||||
public void SitRayCastAvatarPosition(SceneObjectPart part)
|
||||
{
|
||||
|
@ -2380,7 +2379,6 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
/// <param name="remoteClient"></param>
|
||||
public void SendTerseUpdateToClient(IClientAPI remoteClient)
|
||||
{
|
||||
|
||||
// If the client is inactive, it's getting its updates from another
|
||||
// server.
|
||||
if (remoteClient.IsActive)
|
||||
|
@ -2495,7 +2493,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
}
|
||||
|
||||
// If we aren't using a cached appearance, then clear out the baked textures
|
||||
if (! cachedappearance)
|
||||
if (!cachedappearance)
|
||||
{
|
||||
m_appearance.ResetAppearance();
|
||||
if (m_scene.AvatarFactory != null)
|
||||
|
|
|
@ -1001,6 +1001,8 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
|
|||
|
||||
private static void ProcessShpSculptData(PrimitiveBaseShape shp, XmlTextReader reader)
|
||||
{
|
||||
// m_log.DebugFormat("[SCENE OBJECT SERIALIZER]: Setting sculpt data length {0}", shp.SculptData.Length);
|
||||
|
||||
shp.SculptData = Convert.FromBase64String(reader.ReadElementString("SculptData"));
|
||||
}
|
||||
|
||||
|
|
|
@ -83,7 +83,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
|
|||
region1 = scene.RegionInfo.RegionHandle;
|
||||
region2 = scene2.RegionInfo.RegionHandle;
|
||||
|
||||
SceneSetupHelpers.AddRootAgent(scene, agent1);
|
||||
SceneSetupHelpers.AddClient(scene, agent1);
|
||||
}
|
||||
|
||||
[Test]
|
||||
|
|
|
@ -139,7 +139,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
|
|||
|
||||
SceneObjectPart part = SceneSetupHelpers.AddSceneObject(scene);
|
||||
|
||||
IClientAPI client = SceneSetupHelpers.AddRootAgent(scene, agentId);
|
||||
IClientAPI client = SceneSetupHelpers.AddClient(scene, agentId);
|
||||
scene.DeRezObjects(client, new System.Collections.Generic.List<uint>() { part.LocalId }, UUID.Zero, DeRezAction.Delete, UUID.Zero);
|
||||
|
||||
SceneObjectPart retrievedPart = scene.GetSceneObjectPart(part.LocalId);
|
||||
|
|
|
@ -66,7 +66,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
|
|||
IConfig config = configSource.AddConfig("Startup");
|
||||
config.Set("serverside_object_permissions", true);
|
||||
SceneSetupHelpers.SetupSceneModules(scene, configSource, new object[] { new PermissionsModule() });
|
||||
TestClient client = SceneSetupHelpers.AddRootAgent(scene, userId);
|
||||
TestClient client = SceneSetupHelpers.AddClient(scene, userId);
|
||||
|
||||
// Turn off the timer on the async sog deleter - we'll crank it by hand for this test.
|
||||
AsyncSceneObjectGroupDeleter sogd = scene.SceneObjectGroupDeleter;
|
||||
|
@ -105,7 +105,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
|
|||
IConfig config = configSource.AddConfig("Startup");
|
||||
config.Set("serverside_object_permissions", true);
|
||||
SceneSetupHelpers.SetupSceneModules(scene, configSource, new object[] { new PermissionsModule() });
|
||||
TestClient client = SceneSetupHelpers.AddRootAgent(scene, userId);
|
||||
TestClient client = SceneSetupHelpers.AddClient(scene, userId);
|
||||
|
||||
// Turn off the timer on the async sog deleter - we'll crank it by hand for this test.
|
||||
AsyncSceneObjectGroupDeleter sogd = scene.SceneObjectGroupDeleter;
|
||||
|
|
|
@ -75,7 +75,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
|
|||
new GroupsModule(),
|
||||
new MockGroupsServicesConnector() });
|
||||
|
||||
TestClient client = SceneSetupHelpers.AddRootAgent(scene, userId);
|
||||
TestClient client = SceneSetupHelpers.AddClient(scene, userId);
|
||||
|
||||
IGroupsModule groupsModule = scene.RequestModuleInterface<IGroupsModule>();
|
||||
|
||||
|
|
|
@ -212,7 +212,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
|
|||
|
||||
SceneSetupHelpers.SetupSceneModules(myScene1, configSource, etm);
|
||||
|
||||
SceneSetupHelpers.AddRootAgent(myScene1, agent1Id);
|
||||
SceneSetupHelpers.AddClient(myScene1, agent1Id);
|
||||
ScenePresence childPresence = myScene2.GetScenePresence(agent1);
|
||||
|
||||
// TODO: Need to do a fair amount of work to allow synchronous establishment of child agents
|
||||
|
|
|
@ -125,7 +125,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
|
|||
sceneA.RegisterRegionWithGrid();
|
||||
|
||||
UUID agentId = UUID.Parse("00000000-0000-0000-0000-000000000041");
|
||||
TestClient client = SceneSetupHelpers.AddRootAgent(sceneA, agentId);
|
||||
TestClient client = SceneSetupHelpers.AddClient(sceneA, agentId);
|
||||
|
||||
ICapabilitiesModule sceneACapsModule = sceneA.RequestModuleInterface<ICapabilitiesModule>();
|
||||
|
||||
|
|
|
@ -113,7 +113,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.Appearance
|
|||
{
|
||||
bool bakedTextureValid = scene.AvatarFactory.ValidateBakedTextureCache(client);
|
||||
MainConsole.Instance.OutputFormat(
|
||||
"{0} baked apperance texture is {1}", client.Name, bakedTextureValid ? "OK" : "corrupt");
|
||||
"{0} baked appearance texture is {1}", client.Name, bakedTextureValid ? "OK" : "corrupt");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
|
@ -417,9 +417,9 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice
|
|||
public string ParcelVoiceInfoRequest(Scene scene, string request, string path, string param,
|
||||
UUID agentID, Caps caps)
|
||||
{
|
||||
// m_log.DebugFormat(
|
||||
// "[FreeSwitchVoice][PARCELVOICE]: ParcelVoiceInfoRequest() on {0} for {1}",
|
||||
// scene.RegionInfo.RegionName, agentID);
|
||||
m_log.DebugFormat(
|
||||
"[FreeSwitchVoice][PARCELVOICE]: ParcelVoiceInfoRequest() on {0} for {1}",
|
||||
scene.RegionInfo.RegionName, agentID);
|
||||
|
||||
ScenePresence avatar = scene.GetScenePresence(agentID);
|
||||
string avatarName = avatar.Name;
|
||||
|
@ -885,4 +885,4 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice
|
|||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -70,7 +70,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
|||
// if groups aren't enabled, we're not needed.
|
||||
// if we're not specified as the connector to use, then we're not wanted
|
||||
if ((groupsConfig.GetBoolean("Enabled", false) == false)
|
||||
|| (groupsConfig.GetString("MessagingModule", "Default") != Name))
|
||||
|| (groupsConfig.GetString("MessagingModule", "GroupsMessagingModule") != Name))
|
||||
{
|
||||
m_groupMessagingEnabled = false;
|
||||
return;
|
||||
|
|
|
@ -200,7 +200,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
|||
// if groups aren't enabled, we're not needed.
|
||||
// if we're not specified as the connector to use, then we're not wanted
|
||||
if ((groupsConfig.GetBoolean("Enabled", false) == false)
|
||||
|| (groupsConfig.GetString("ServicesConnectorModule", "Default") != Name))
|
||||
|| (groupsConfig.GetString("ServicesConnectorModule", "XmlRpcGroupsServicesConnector") != Name))
|
||||
{
|
||||
m_connectorEnabled = false;
|
||||
return;
|
||||
|
|
|
@ -109,7 +109,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
|||
// if groups aren't enabled, we're not needed.
|
||||
// if we're not specified as the connector to use, then we're not wanted
|
||||
if ((groupsConfig.GetBoolean("Enabled", false) == false)
|
||||
|| (groupsConfig.GetString("ServicesConnectorModule", "Default") != Name))
|
||||
|| (groupsConfig.GetString("ServicesConnectorModule", "XmlRpcGroupsServicesConnector") != Name))
|
||||
{
|
||||
m_connectorEnabled = false;
|
||||
return;
|
||||
|
|
|
@ -801,7 +801,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
|
|||
// retain pathcurve
|
||||
shapeBlock.PathCurve = part.Shape.PathCurve;
|
||||
|
||||
part.Shape.SetSculptData((byte)type, sculptId);
|
||||
part.Shape.SetSculptProperties((byte)type, sculptId);
|
||||
part.Shape.SculptEntry = true;
|
||||
part.UpdateShape(shapeBlock);
|
||||
}
|
||||
|
|
|
@ -36,6 +36,7 @@ using log4net;
|
|||
using Nini.Config;
|
||||
using OpenMetaverse;
|
||||
using OpenMetaverse.StructuredData;
|
||||
using OpenSim.Services.Interfaces;
|
||||
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Region.Framework.Interfaces;
|
||||
|
@ -175,6 +176,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.RegionReady
|
|||
|
||||
m_scene.EventManager.TriggerOnChatBroadcast(this, c);
|
||||
m_scene.EventManager.TriggerLoginsEnabled(m_scene.RegionInfo.RegionName);
|
||||
m_scene.SceneGridService.InformNeighborsThatRegionisUp(m_scene.RequestModuleInterface<INeighbourService>(), m_scene.RegionInfo);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -25,13 +25,15 @@
|
|||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Reflection;
|
||||
using System.Threading;
|
||||
using OpenMetaverse;
|
||||
using log4net;
|
||||
using Nini.Config;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Region.Framework.Interfaces;
|
||||
using OpenSim.Region.Framework.Scenes;
|
||||
using OpenSim.Region.CoreModules.Avatar.NPC;
|
||||
using OpenSim.Framework;
|
||||
using Timer=System.Timers.Timer;
|
||||
using OpenSim.Services.Interfaces;
|
||||
|
@ -40,24 +42,17 @@ namespace OpenSim.Region.OptionalModules.World.NPC
|
|||
{
|
||||
public class NPCModule : IRegionModule, INPCModule
|
||||
{
|
||||
// private const bool m_enabled = false;
|
||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
private Mutex m_createMutex;
|
||||
private Timer m_timer;
|
||||
// private const bool m_enabled = false;
|
||||
|
||||
private Dictionary<UUID,NPCAvatar> m_avatars = new Dictionary<UUID, NPCAvatar>();
|
||||
private Dictionary<UUID,AvatarAppearance> m_appearanceCache = new Dictionary<UUID, AvatarAppearance>();
|
||||
|
||||
// Timer vars.
|
||||
private bool p_inUse = false;
|
||||
private readonly object p_lock = new object();
|
||||
// Private Temporary Variables.
|
||||
private string p_firstname;
|
||||
private string p_lastname;
|
||||
private Vector3 p_position;
|
||||
private Scene p_scene;
|
||||
private UUID p_cloneAppearanceFrom;
|
||||
private UUID p_returnUuid;
|
||||
public void Initialise(Scene scene, IConfigSource source)
|
||||
{
|
||||
scene.RegisterModuleInterface<INPCModule>(this);
|
||||
}
|
||||
|
||||
private AvatarAppearance GetAppearance(UUID target, Scene scene)
|
||||
{
|
||||
|
@ -74,31 +69,53 @@ namespace OpenSim.Region.OptionalModules.World.NPC
|
|||
return new AvatarAppearance();
|
||||
}
|
||||
|
||||
public UUID CreateNPC(string firstname, string lastname,Vector3 position, Scene scene, UUID cloneAppearanceFrom)
|
||||
public UUID CreateNPC(string firstname, string lastname, Vector3 position, Scene scene, UUID cloneAppearanceFrom)
|
||||
{
|
||||
// Block.
|
||||
m_createMutex.WaitOne();
|
||||
NPCAvatar npcAvatar = new NPCAvatar(firstname, lastname, position, scene);
|
||||
npcAvatar.CircuitCode = (uint)Util.RandomClass.Next(0, int.MaxValue);
|
||||
|
||||
// Copy Temp Variables for Timer to pick up.
|
||||
lock (p_lock)
|
||||
m_log.DebugFormat(
|
||||
"[NPC MODULE]: Creating NPC {0} {1} {2} at {3} in {4}",
|
||||
firstname, lastname, npcAvatar.AgentId, position, scene.RegionInfo.RegionName);
|
||||
|
||||
AgentCircuitData acd = new AgentCircuitData();
|
||||
acd.AgentID = npcAvatar.AgentId;
|
||||
acd.firstname = firstname;
|
||||
acd.lastname = lastname;
|
||||
acd.ServiceURLs = new Dictionary<string, object>();
|
||||
|
||||
AvatarAppearance originalAppearance = GetAppearance(cloneAppearanceFrom, scene);
|
||||
AvatarAppearance npcAppearance = new AvatarAppearance(originalAppearance, true);
|
||||
acd.Appearance = npcAppearance;
|
||||
|
||||
scene.AuthenticateHandler.AddNewCircuit(npcAvatar.CircuitCode, acd);
|
||||
scene.AddNewClient(npcAvatar);
|
||||
|
||||
ScenePresence sp;
|
||||
if (scene.TryGetScenePresence(npcAvatar.AgentId, out sp))
|
||||
{
|
||||
p_firstname = firstname;
|
||||
p_lastname = lastname;
|
||||
p_position = position;
|
||||
p_scene = scene;
|
||||
p_cloneAppearanceFrom = cloneAppearanceFrom;
|
||||
p_inUse = true;
|
||||
p_returnUuid = UUID.Zero;
|
||||
m_log.DebugFormat(
|
||||
"[NPC MODULE]: Successfully retrieved scene presence for NPC {0} {1}", sp.Name, sp.UUID);
|
||||
|
||||
// Shouldn't call this - temporary.
|
||||
sp.CompleteMovement(npcAvatar);
|
||||
|
||||
// sp.SendAppearanceToAllOtherAgents();
|
||||
//
|
||||
// // Send animations back to the avatar as well
|
||||
// sp.Animator.SendAnimPack();
|
||||
}
|
||||
else
|
||||
{
|
||||
m_log.WarnFormat("[NPC MODULE]: Could not find scene presence for NPC {0} {1}", sp.Name, sp.UUID);
|
||||
}
|
||||
|
||||
while (p_returnUuid == UUID.Zero)
|
||||
{
|
||||
Thread.Sleep(250);
|
||||
}
|
||||
lock (m_avatars)
|
||||
m_avatars.Add(npcAvatar.AgentId, npcAvatar);
|
||||
|
||||
m_createMutex.ReleaseMutex();
|
||||
m_log.DebugFormat("[NPC MODULE]: Created NPC with id {0}", npcAvatar.AgentId);
|
||||
|
||||
return p_returnUuid;
|
||||
return npcAvatar.AgentId;
|
||||
}
|
||||
|
||||
public void Autopilot(UUID agentID, Scene scene, Vector3 pos)
|
||||
|
@ -137,48 +154,6 @@ namespace OpenSim.Region.OptionalModules.World.NPC
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
public void Initialise(Scene scene, IConfigSource source)
|
||||
{
|
||||
m_createMutex = new Mutex(false);
|
||||
|
||||
m_timer = new Timer(500);
|
||||
m_timer.Elapsed += m_timer_Elapsed;
|
||||
m_timer.Start();
|
||||
|
||||
scene.RegisterModuleInterface<INPCModule>(this);
|
||||
}
|
||||
|
||||
void m_timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
|
||||
{
|
||||
lock (p_lock)
|
||||
{
|
||||
if (p_inUse)
|
||||
{
|
||||
p_inUse = false;
|
||||
|
||||
NPCAvatar npcAvatar = new NPCAvatar(p_firstname, p_lastname, p_position, p_scene);
|
||||
npcAvatar.CircuitCode = (uint) Util.RandomClass.Next(0, int.MaxValue);
|
||||
|
||||
p_scene.AddNewClient(npcAvatar);
|
||||
|
||||
ScenePresence sp;
|
||||
if (p_scene.TryGetScenePresence(npcAvatar.AgentId, out sp))
|
||||
{
|
||||
AvatarAppearance x = GetAppearance(p_cloneAppearanceFrom, p_scene);
|
||||
|
||||
sp.Appearance.SetTextureEntries(x.Texture);
|
||||
sp.Appearance.SetVisualParams((byte[])x.VisualParams.Clone());
|
||||
sp.SendAppearanceToAllOtherAgents();
|
||||
}
|
||||
|
||||
m_avatars.Add(npcAvatar.AgentId, npcAvatar);
|
||||
|
||||
p_returnUuid = npcAvatar.AgentId;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void PostInitialise()
|
||||
{
|
||||
}
|
||||
|
@ -197,4 +172,4 @@ namespace OpenSim.Region.OptionalModules.World.NPC
|
|||
get { return true; }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,71 @@
|
|||
/*
|
||||
* 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.Reflection;
|
||||
using Nini.Config;
|
||||
using NUnit.Framework;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Framework.Communications;
|
||||
using OpenSim.Region.CoreModules.ServiceConnectorsOut.Avatar;
|
||||
using OpenSim.Region.Framework.Interfaces;
|
||||
using OpenSim.Region.Framework.Scenes;
|
||||
using OpenSim.Services.AvatarService;
|
||||
using OpenSim.Tests.Common;
|
||||
using OpenSim.Tests.Common.Mock;
|
||||
|
||||
namespace OpenSim.Region.OptionalModules.World.NPC.Tests
|
||||
{
|
||||
[TestFixture]
|
||||
public class NPCModuleTests
|
||||
{
|
||||
[Test]
|
||||
public void TestCreate()
|
||||
{
|
||||
TestHelper.InMethod();
|
||||
// log4net.Config.XmlConfigurator.Configure();
|
||||
|
||||
IConfigSource config = new IniConfigSource();
|
||||
|
||||
config.AddConfig("Modules");
|
||||
config.Configs["Modules"].Set("AvatarServices", "LocalAvatarServicesConnector");
|
||||
config.AddConfig("AvatarService");
|
||||
config.Configs["AvatarService"].Set("LocalServiceModule", "OpenSim.Services.AvatarService.dll:AvatarService");
|
||||
config.Configs["AvatarService"].Set("StorageProvider", "OpenSim.Data.Null.dll");
|
||||
|
||||
TestScene scene = SceneSetupHelpers.SetupScene();
|
||||
SceneSetupHelpers.SetupSceneModules(scene, config, new NPCModule(), new LocalAvatarServicesConnector());
|
||||
|
||||
INPCModule npcModule = scene.RequestModuleInterface<INPCModule>();
|
||||
UUID npcId = npcModule.CreateNPC("John", "Smith", new Vector3(128, 128, 30), scene, UUID.Zero);
|
||||
|
||||
ScenePresence npc = scene.GetScenePresence(npcId);
|
||||
Assert.That(npc, Is.Not.Null);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -86,7 +86,10 @@ namespace OpenSim.Region.Physics.Manager
|
|||
Vector3 size, Quaternion rotation, bool isPhysical)
|
||||
{
|
||||
PhysicsActor ret = AddPrimShape(primName, pbs, position, size, rotation, isPhysical);
|
||||
if (ret != null) ret.LocalID = localID;
|
||||
|
||||
if (ret != null)
|
||||
ret.LocalID = localID;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
@ -100,7 +100,6 @@ namespace OpenSim.Region.Physics.Meshing
|
|||
{
|
||||
m_log.WarnFormat("[SCULPT]: Unable to create {0} directory: ", decodedSculptMapPath, e.Message);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -156,7 +155,6 @@ namespace OpenSim.Region.Physics.Meshing
|
|||
return box;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Creates a simple bounding box mesh for a complex input mesh
|
||||
/// </summary>
|
||||
|
@ -193,7 +191,6 @@ namespace OpenSim.Region.Physics.Meshing
|
|||
m_log.Error(message);
|
||||
m_log.Error("\nPrim Name: " + primName);
|
||||
m_log.Error("****** PrimMesh Parameters ******\n" + primMesh.ParamsToDisplayString());
|
||||
|
||||
}
|
||||
|
||||
private ulong GetMeshKey(PrimitiveBaseShape pbs, Vector3 size, float lod)
|
||||
|
@ -257,6 +254,52 @@ namespace OpenSim.Region.Physics.Meshing
|
|||
return ((hash << 5) + hash) + (ulong)(c >> 8);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Add a submesh to an existing list of coords and faces.
|
||||
/// </summary>
|
||||
/// <param name="subMeshData"></param>
|
||||
/// <param name="size">Size of entire object</param>
|
||||
/// <param name="coords"></param>
|
||||
/// <param name="faces"></param>
|
||||
private void AddSubMesh(OSDMap subMeshData, Vector3 size, List<Coord> coords, List<Face> faces)
|
||||
{
|
||||
// Console.WriteLine("subMeshMap for {0} - {1}", primName, Util.GetFormattedXml((OSD)subMeshMap));
|
||||
|
||||
// As per http://wiki.secondlife.com/wiki/Mesh/Mesh_Asset_Format, some Mesh Level
|
||||
// of Detail Blocks (maps) contain just a NoGeometry key to signal there is no
|
||||
// geometry for this submesh.
|
||||
if (subMeshData.ContainsKey("NoGeometry") && ((OSDBoolean)subMeshData["NoGeometry"]))
|
||||
return;
|
||||
|
||||
OpenMetaverse.Vector3 posMax = ((OSDMap)subMeshData["PositionDomain"])["Max"].AsVector3();
|
||||
OpenMetaverse.Vector3 posMin = ((OSDMap)subMeshData["PositionDomain"])["Min"].AsVector3();
|
||||
ushort faceIndexOffset = (ushort)coords.Count;
|
||||
|
||||
byte[] posBytes = subMeshData["Position"].AsBinary();
|
||||
for (int i = 0; i < posBytes.Length; i += 6)
|
||||
{
|
||||
ushort uX = Utils.BytesToUInt16(posBytes, i);
|
||||
ushort uY = Utils.BytesToUInt16(posBytes, i + 2);
|
||||
ushort uZ = Utils.BytesToUInt16(posBytes, i + 4);
|
||||
|
||||
Coord c = new Coord(
|
||||
Utils.UInt16ToFloat(uX, posMin.X, posMax.X) * size.X,
|
||||
Utils.UInt16ToFloat(uY, posMin.Y, posMax.Y) * size.Y,
|
||||
Utils.UInt16ToFloat(uZ, posMin.Z, posMax.Z) * size.Z);
|
||||
|
||||
coords.Add(c);
|
||||
}
|
||||
|
||||
byte[] triangleBytes = subMeshData["TriangleList"].AsBinary();
|
||||
for (int i = 0; i < triangleBytes.Length; i += 6)
|
||||
{
|
||||
ushort v1 = (ushort)(Utils.BytesToUInt16(triangleBytes, i) + faceIndexOffset);
|
||||
ushort v2 = (ushort)(Utils.BytesToUInt16(triangleBytes, i + 2) + faceIndexOffset);
|
||||
ushort v3 = (ushort)(Utils.BytesToUInt16(triangleBytes, i + 4) + faceIndexOffset);
|
||||
Face f = new Face(v1, v2, v3);
|
||||
faces.Add(f);
|
||||
}
|
||||
}
|
||||
|
||||
private Mesh CreateMeshFromPrimMesher(string primName, PrimitiveBaseShape primShape, Vector3 size, float lod)
|
||||
{
|
||||
|
@ -276,7 +319,7 @@ namespace OpenSim.Region.Physics.Meshing
|
|||
if (!useMeshiesPhysicsMesh)
|
||||
return null;
|
||||
|
||||
m_log.Debug("[MESH]: experimental mesh proxy generation");
|
||||
m_log.DebugFormat("[MESH]: experimental mesh proxy generation for {0}", primName);
|
||||
|
||||
OSD meshOsd = null;
|
||||
|
||||
|
@ -291,23 +334,38 @@ namespace OpenSim.Region.Physics.Meshing
|
|||
{
|
||||
try
|
||||
{
|
||||
meshOsd = (OSDMap)OSDParser.DeserializeLLSDBinary(data);
|
||||
OSD osd = OSDParser.DeserializeLLSDBinary(data);
|
||||
if (osd is OSDMap)
|
||||
meshOsd = (OSDMap)osd;
|
||||
else
|
||||
{
|
||||
m_log.Warn("[Mesh}: unable to cast mesh asset to OSDMap");
|
||||
return null;
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
m_log.Error("[MESH]: Exception deserializing mesh asset header:" + e.ToString());
|
||||
}
|
||||
|
||||
start = data.Position;
|
||||
}
|
||||
|
||||
if (meshOsd is OSDMap)
|
||||
{
|
||||
OSDMap physicsParms = null;
|
||||
OSDMap map = (OSDMap)meshOsd;
|
||||
OSDMap physicsParms = (OSDMap)map["physics_shape"]; // old asset format
|
||||
|
||||
if (physicsParms.Count == 0)
|
||||
if (map.ContainsKey("physics_shape"))
|
||||
physicsParms = (OSDMap)map["physics_shape"]; // old asset format
|
||||
else if (map.ContainsKey("physics_mesh"))
|
||||
physicsParms = (OSDMap)map["physics_mesh"]; // new asset format
|
||||
|
||||
if (physicsParms == null)
|
||||
{
|
||||
m_log.Warn("[MESH]: no recognized physics mesh found in mesh asset");
|
||||
return null;
|
||||
}
|
||||
|
||||
int physOffset = physicsParms["offset"].AsInteger() + (int)start;
|
||||
int physSize = physicsParms["size"].AsInteger();
|
||||
|
||||
|
@ -353,42 +411,13 @@ namespace OpenSim.Region.Physics.Meshing
|
|||
// physics_shape is an array of OSDMaps, one for each submesh
|
||||
if (decodedMeshOsd is OSDArray)
|
||||
{
|
||||
// Console.WriteLine("decodedMeshOsd for {0} - {1}", primName, Util.GetFormattedXml(decodedMeshOsd));
|
||||
|
||||
decodedMeshOsdArray = (OSDArray)decodedMeshOsd;
|
||||
foreach (OSD subMeshOsd in decodedMeshOsdArray)
|
||||
{
|
||||
if (subMeshOsd is OSDMap)
|
||||
{
|
||||
OSDMap subMeshMap = (OSDMap)subMeshOsd;
|
||||
|
||||
OpenMetaverse.Vector3 posMax = ((OSDMap)subMeshMap["PositionDomain"])["Max"].AsVector3();
|
||||
OpenMetaverse.Vector3 posMin = ((OSDMap)subMeshMap["PositionDomain"])["Min"].AsVector3();
|
||||
ushort faceIndexOffset = (ushort)coords.Count;
|
||||
|
||||
byte[] posBytes = subMeshMap["Position"].AsBinary();
|
||||
for (int i = 0; i < posBytes.Length; i += 6)
|
||||
{
|
||||
ushort uX = Utils.BytesToUInt16(posBytes, i);
|
||||
ushort uY = Utils.BytesToUInt16(posBytes, i + 2);
|
||||
ushort uZ = Utils.BytesToUInt16(posBytes, i + 4);
|
||||
|
||||
Coord c = new Coord(
|
||||
Utils.UInt16ToFloat(uX, posMin.X, posMax.X) * size.X,
|
||||
Utils.UInt16ToFloat(uY, posMin.Y, posMax.Y) * size.Y,
|
||||
Utils.UInt16ToFloat(uZ, posMin.Z, posMax.Z) * size.Z);
|
||||
|
||||
coords.Add(c);
|
||||
}
|
||||
|
||||
byte[] triangleBytes = subMeshMap["TriangleList"].AsBinary();
|
||||
for (int i = 0; i < triangleBytes.Length; i += 6)
|
||||
{
|
||||
ushort v1 = (ushort)(Utils.BytesToUInt16(triangleBytes, i) + faceIndexOffset);
|
||||
ushort v2 = (ushort)(Utils.BytesToUInt16(triangleBytes, i + 2) + faceIndexOffset);
|
||||
ushort v3 = (ushort)(Utils.BytesToUInt16(triangleBytes, i + 4) + faceIndexOffset);
|
||||
Face f = new Face(v1, v2, v3);
|
||||
faces.Add(f);
|
||||
}
|
||||
}
|
||||
AddSubMesh(subMeshOsd as OSDMap, size, coords, faces);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -511,7 +540,6 @@ namespace OpenSim.Region.Physics.Meshing
|
|||
|
||||
profileBegin = 0.5f * profileBegin + 0.5f;
|
||||
profileEnd = 0.5f * profileEnd + 0.5f;
|
||||
|
||||
}
|
||||
|
||||
int hollowSides = sides;
|
||||
|
@ -620,6 +648,7 @@ namespace OpenSim.Region.Physics.Meshing
|
|||
Face f = faces[i];
|
||||
mesh.Add(new Triangle(vertices[f.v1], vertices[f.v2], vertices[f.v3]));
|
||||
}
|
||||
|
||||
return mesh;
|
||||
}
|
||||
|
||||
|
@ -630,6 +659,10 @@ namespace OpenSim.Region.Physics.Meshing
|
|||
|
||||
public IMesh CreateMesh(String primName, PrimitiveBaseShape primShape, Vector3 size, float lod, bool isPhysical)
|
||||
{
|
||||
#if SPAM
|
||||
m_log.DebugFormat("[MESH]: Creating mesh for {0}", primName);
|
||||
#endif
|
||||
|
||||
Mesh mesh = null;
|
||||
ulong key = 0;
|
||||
|
||||
|
|
|
@ -38,6 +38,9 @@
|
|||
* switch between 'VEHICLE' parameter use and general dynamics
|
||||
* settings use.
|
||||
*/
|
||||
|
||||
//#define SPAM
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Reflection;
|
||||
|
@ -54,7 +57,6 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
/// <summary>
|
||||
/// Various properties that ODE uses for AMotors but isn't exposed in ODE.NET so we must define them ourselves.
|
||||
/// </summary>
|
||||
|
||||
public class OdePrim : PhysicsActor
|
||||
{
|
||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
@ -279,14 +281,14 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
|
||||
public override bool Selected
|
||||
{
|
||||
set {
|
||||
|
||||
|
||||
set
|
||||
{
|
||||
// This only makes the object not collidable if the object
|
||||
// is physical or the object is modified somehow *IN THE FUTURE*
|
||||
// without this, if an avatar selects prim, they can walk right
|
||||
// through it while it's selected
|
||||
m_collisionscore = 0;
|
||||
|
||||
if ((m_isphysical && !_zeroFlag) || !value)
|
||||
{
|
||||
m_taintselected = value;
|
||||
|
@ -297,7 +299,9 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
m_taintselected = value;
|
||||
m_isSelected = value;
|
||||
}
|
||||
if (m_isSelected) disableBodySoft();
|
||||
|
||||
if (m_isSelected)
|
||||
disableBodySoft();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -324,8 +328,6 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
//m_log.Warn("Setting Geom to: " + prim_geom);
|
||||
}
|
||||
|
||||
|
||||
|
||||
public void enableBodySoft()
|
||||
{
|
||||
if (!childPrim)
|
||||
|
@ -626,8 +628,6 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
break;
|
||||
}
|
||||
|
||||
|
||||
|
||||
float taperX1;
|
||||
float taperY1;
|
||||
float taperX;
|
||||
|
@ -682,9 +682,6 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
// else if (returnMass > _parent_scene.maximumMassObject)
|
||||
// returnMass = _parent_scene.maximumMassObject;
|
||||
|
||||
|
||||
|
||||
|
||||
// Recursively calculate mass
|
||||
bool HasChildPrim = false;
|
||||
lock (childrenPrim)
|
||||
|
@ -693,8 +690,8 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
{
|
||||
HasChildPrim = true;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (HasChildPrim)
|
||||
{
|
||||
OdePrim[] childPrimArr = new OdePrim[0];
|
||||
|
@ -711,10 +708,12 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (returnMass > _parent_scene.maximumMassObject)
|
||||
returnMass = _parent_scene.maximumMassObject;
|
||||
|
||||
return returnMass;
|
||||
}// end CalculateMass
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
|
@ -750,7 +749,6 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags);
|
||||
}
|
||||
|
||||
|
||||
d.BodyDestroy(Body);
|
||||
lock (childrenPrim)
|
||||
{
|
||||
|
@ -779,7 +777,6 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags);
|
||||
}
|
||||
|
||||
|
||||
Body = IntPtr.Zero;
|
||||
}
|
||||
}
|
||||
|
@ -791,6 +788,8 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
|
||||
public void setMesh(OdeScene parent_scene, IMesh mesh)
|
||||
{
|
||||
// m_log.DebugFormat("[ODE PRIM]: Setting mesh on {0} to {1}", Name, mesh);
|
||||
|
||||
// This sleeper is there to moderate how long it takes between
|
||||
// setting up the mesh and pre-processing it when we get rapid fire mesh requests on a single object
|
||||
|
||||
|
@ -869,7 +868,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
if (prim_geom != IntPtr.Zero)
|
||||
{
|
||||
if (!_position.ApproxEquals(m_taintposition, 0f))
|
||||
changemove(timestep);
|
||||
changemove(timestep);
|
||||
|
||||
if (m_taintrot != _orientation)
|
||||
{
|
||||
|
@ -887,19 +886,15 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
rotate(timestep);
|
||||
}
|
||||
}
|
||||
//
|
||||
|
||||
if (m_taintPhysics != m_isphysical && !(m_taintparent != _parent))
|
||||
changePhysicsStatus(timestep);
|
||||
//
|
||||
|
||||
if (!_size.ApproxEquals(m_taintsize,0f))
|
||||
if (!_size.ApproxEquals(m_taintsize, 0f))
|
||||
changesize(timestep);
|
||||
//
|
||||
|
||||
if (m_taintshape)
|
||||
changeshape(timestep);
|
||||
//
|
||||
|
||||
if (m_taintforce)
|
||||
changeAddForce(timestep);
|
||||
|
@ -927,7 +922,6 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
|
||||
if (!m_angularlock.ApproxEquals(m_taintAngularLock,0f))
|
||||
changeAngularLock(timestep);
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -935,7 +929,6 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
private void changeAngularLock(float timestep)
|
||||
{
|
||||
// do we have a Physical object?
|
||||
|
@ -963,7 +956,6 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
}
|
||||
// Store this for later in case we get turned into a separate body
|
||||
m_angularlock = m_taintAngularLock;
|
||||
|
||||
}
|
||||
|
||||
private void changelink(float timestep)
|
||||
|
@ -1102,7 +1094,6 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
m_log.DebugFormat("[PHYSICS]: {0} ain't got no boooooooooddy, no body", Name);
|
||||
}
|
||||
|
||||
|
||||
prm.m_interpenetrationcount = 0;
|
||||
prm.m_collisionscore = 0;
|
||||
prm.m_disabled = false;
|
||||
|
@ -1162,7 +1153,6 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void ChildSetGeom(OdePrim odePrim)
|
||||
|
@ -1223,17 +1213,12 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
//Console.WriteLine("childrenPrim.Remove " + odePrim);
|
||||
childrenPrim.Remove(odePrim);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
if (Body != IntPtr.Zero)
|
||||
{
|
||||
_parent_scene.remActivePrim(this);
|
||||
}
|
||||
|
||||
|
||||
|
||||
lock (childrenPrim)
|
||||
{
|
||||
foreach (OdePrim prm in childrenPrim)
|
||||
|
@ -1242,8 +1227,6 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
ParentPrim(prm);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
private void changeSelectedStatus(float timestep)
|
||||
|
@ -1398,7 +1381,6 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
_parent_scene.waitForSpaceUnlock(m_targetSpace);
|
||||
|
@ -1438,10 +1420,11 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
lock (_parent_scene.OdeLock)
|
||||
{
|
||||
//Console.WriteLine("changeadd 1");
|
||||
#if SPAM
|
||||
Console.WriteLine("changeadd 1");
|
||||
#endif
|
||||
CreateGeom(m_targetSpace, _mesh);
|
||||
|
||||
if (prim_geom != IntPtr.Zero)
|
||||
|
@ -1684,13 +1667,11 @@ Console.WriteLine(" JointCreateFixed");
|
|||
{
|
||||
PID_G = m_PIDTau + 1;
|
||||
}
|
||||
|
||||
|
||||
// Where are we, and where are we headed?
|
||||
d.Vector3 pos = d.BodyGetPosition(Body);
|
||||
d.Vector3 vel = d.BodyGetLinearVel(Body);
|
||||
|
||||
|
||||
// Non-Vehicles have a limited set of Hover options.
|
||||
// determine what our target height really is based on HoverType
|
||||
switch (m_PIDHoverType)
|
||||
|
@ -1796,8 +1777,6 @@ Console.WriteLine(" JointCreateFixed");
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
public void rotate(float timestep)
|
||||
{
|
||||
d.Quaternion myrot = new d.Quaternion();
|
||||
|
@ -1908,7 +1887,10 @@ Console.WriteLine(" JointCreateFixed");
|
|||
|
||||
public void changesize(float timestamp)
|
||||
{
|
||||
|
||||
#if SPAM
|
||||
m_log.DebugFormat("[ODE PRIM]: Called changesize");
|
||||
#endif
|
||||
|
||||
string oldname = _parent_scene.geom_name_map[prim_geom];
|
||||
|
||||
if (_size.X <= 0) _size.X = 0.01f;
|
||||
|
@ -1918,8 +1900,9 @@ Console.WriteLine(" JointCreateFixed");
|
|||
// Cleanup of old prim geometry
|
||||
if (_mesh != null)
|
||||
{
|
||||
// Cleanup meshing here
|
||||
// TODO: Cleanup meshing here
|
||||
}
|
||||
|
||||
//kill body to rebuild
|
||||
if (IsPhysical && Body != IntPtr.Zero)
|
||||
{
|
||||
|
@ -1936,11 +1919,13 @@ Console.WriteLine(" JointCreateFixed");
|
|||
disableBody();
|
||||
}
|
||||
}
|
||||
|
||||
if (d.SpaceQuery(m_targetSpace, prim_geom))
|
||||
{
|
||||
_parent_scene.waitForSpaceUnlock(m_targetSpace);
|
||||
d.SpaceRemove(m_targetSpace, prim_geom);
|
||||
}
|
||||
|
||||
d.GeomDestroy(prim_geom);
|
||||
prim_geom = IntPtr.Zero;
|
||||
// we don't need to do space calculation because the client sends a position update also.
|
||||
|
@ -1960,15 +1945,19 @@ Console.WriteLine(" JointCreateFixed");
|
|||
mesh = _parent_scene.mesher.CreateMesh(oldname, _pbs, _size, meshlod, IsPhysical);
|
||||
|
||||
//IMesh mesh = _parent_scene.mesher.CreateMesh(oldname, _pbs, _size, meshlod, IsPhysical);
|
||||
//Console.WriteLine("changesize 1");
|
||||
#if SPAM
|
||||
Console.WriteLine("changesize 1");
|
||||
#endif
|
||||
CreateGeom(m_targetSpace, mesh);
|
||||
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
_mesh = null;
|
||||
//Console.WriteLine("changesize 2");
|
||||
|
||||
#if SPAM
|
||||
Console.WriteLine("changesize 2");
|
||||
#endif
|
||||
|
||||
CreateGeom(m_targetSpace, _mesh);
|
||||
}
|
||||
|
||||
|
@ -2004,8 +1993,6 @@ Console.WriteLine(" JointCreateFixed");
|
|||
m_taintsize = _size;
|
||||
}
|
||||
|
||||
|
||||
|
||||
public void changefloatonwater(float timestep)
|
||||
{
|
||||
m_collidesWater = m_taintCollidesWater;
|
||||
|
@ -2053,6 +2040,7 @@ Console.WriteLine(" JointCreateFixed");
|
|||
prim_geom = IntPtr.Zero;
|
||||
m_log.ErrorFormat("[PHYSICS]: PrimGeom dead for {0}", Name);
|
||||
}
|
||||
|
||||
prim_geom = IntPtr.Zero;
|
||||
// we don't need to do space calculation because the client sends a position update also.
|
||||
if (_size.X <= 0) _size.X = 0.01f;
|
||||
|
@ -2062,7 +2050,7 @@ Console.WriteLine(" JointCreateFixed");
|
|||
|
||||
if (_parent_scene.needsMeshing(_pbs))
|
||||
{
|
||||
// Don't need to re-enable body.. it's done in SetMesh
|
||||
// Don't need to re-enable body.. it's done in CreateMesh
|
||||
float meshlod = _parent_scene.meshSculptLOD;
|
||||
|
||||
if (IsPhysical)
|
||||
|
@ -2070,12 +2058,18 @@ Console.WriteLine(" JointCreateFixed");
|
|||
|
||||
IMesh mesh = _parent_scene.mesher.CreateMesh(oldname, _pbs, _size, meshlod, IsPhysical);
|
||||
// createmesh returns null when it doesn't mesh.
|
||||
#if SPAM
|
||||
Console.WriteLine("changeshape needed meshing");
|
||||
#endif
|
||||
CreateGeom(m_targetSpace, mesh);
|
||||
}
|
||||
else
|
||||
{
|
||||
_mesh = null;
|
||||
//Console.WriteLine("changeshape");
|
||||
|
||||
#if SPAM
|
||||
Console.WriteLine("changeshape not need meshing");
|
||||
#endif
|
||||
CreateGeom(m_targetSpace, null);
|
||||
}
|
||||
|
||||
|
@ -2110,6 +2104,7 @@ Console.WriteLine(" JointCreateFixed");
|
|||
parent.ChildSetGeom(this);
|
||||
}
|
||||
}
|
||||
|
||||
resetCollisionAccounting();
|
||||
m_taintshape = false;
|
||||
}
|
||||
|
@ -2160,11 +2155,8 @@ Console.WriteLine(" JointCreateFixed");
|
|||
}
|
||||
|
||||
m_taintforce = false;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
public void changeSetTorque(float timestamp)
|
||||
{
|
||||
if (!m_isSelected)
|
||||
|
@ -2352,7 +2344,7 @@ Console.WriteLine(" JointCreateFixed");
|
|||
{
|
||||
lock (_parent_scene.OdeLock)
|
||||
{
|
||||
m_isVolumeDetect = (param!=0);
|
||||
m_isVolumeDetect = (param != 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2833,7 +2825,6 @@ Console.WriteLine(" JointCreateFixed");
|
|||
|
||||
public override float APIDDamping{ set { return; } }
|
||||
|
||||
|
||||
private void createAMotor(Vector3 axis)
|
||||
{
|
||||
if (Body == IntPtr.Zero)
|
||||
|
@ -2953,7 +2944,6 @@ Console.WriteLine(" JointCreateFixed");
|
|||
//d.JointSetAMotorParam(Amotor, (int) dParam.Vel, 9000f);
|
||||
d.JointSetAMotorParam(Amotor, (int)dParam.FudgeFactor, 0f);
|
||||
d.JointSetAMotorParam(Amotor, (int)dParam.FMax, Mass * 50f);//
|
||||
|
||||
}
|
||||
|
||||
public Matrix4 FromDMass(d.Mass pMass)
|
||||
|
@ -3038,8 +3028,6 @@ Console.WriteLine(" JointCreateFixed");
|
|||
return Matrix4.Identity; // should probably throw an error. singluar matrix inverse not possible
|
||||
}
|
||||
|
||||
|
||||
|
||||
return (Adjoint(pMat) / determinant3x3(pMat));
|
||||
}
|
||||
|
||||
|
@ -3076,6 +3064,7 @@ Console.WriteLine(" JointCreateFixed");
|
|||
}
|
||||
m++;
|
||||
}
|
||||
|
||||
return minor;
|
||||
}
|
||||
|
||||
|
@ -3178,7 +3167,6 @@ Console.WriteLine(" JointCreateFixed");
|
|||
|
||||
det = diag1 + diag2 + diag3 - (diag4 + diag5 + diag6);
|
||||
return det;
|
||||
|
||||
}
|
||||
|
||||
private static void DMassCopy(ref d.Mass src, ref d.Mass dst)
|
||||
|
@ -3203,6 +3191,5 @@ Console.WriteLine(" JointCreateFixed");
|
|||
{
|
||||
m_material = pMaterial;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -5050,7 +5050,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
}
|
||||
}
|
||||
|
||||
result.Add(src.Substring(start,length).Trim());
|
||||
result.Add(new LSL_String(src.Substring(start,length).Trim()));
|
||||
|
||||
return result;
|
||||
}
|
||||
|
@ -6900,7 +6900,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
// retain pathcurve
|
||||
shapeBlock.PathCurve = part.Shape.PathCurve;
|
||||
|
||||
part.Shape.SetSculptData((byte)type, sculptId);
|
||||
part.Shape.SetSculptProperties((byte)type, sculptId);
|
||||
part.Shape.SculptEntry = true;
|
||||
part.UpdateShape(shapeBlock);
|
||||
}
|
||||
|
@ -7391,7 +7391,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
UUID[] anims;
|
||||
anims = av.Animator.GetAnimationArray();
|
||||
foreach (UUID foo in anims)
|
||||
l.Add(foo.ToString());
|
||||
l.Add(new LSL_Key(foo.ToString()));
|
||||
return l;
|
||||
}
|
||||
|
||||
|
@ -7926,17 +7926,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
|
||||
case (int)ScriptBaseClass.PRIM_TEXT:
|
||||
Color4 textColor = part.GetTextColor();
|
||||
res.Add(part.Text);
|
||||
res.Add(new LSL_String(part.Text));
|
||||
res.Add(new LSL_Vector(textColor.R,
|
||||
textColor.G,
|
||||
textColor.B));
|
||||
res.Add(new LSL_Float(textColor.A));
|
||||
break;
|
||||
case (int)ScriptBaseClass.PRIM_NAME:
|
||||
res.Add(part.Name);
|
||||
res.Add(new LSL_String(part.Name));
|
||||
break;
|
||||
case (int)ScriptBaseClass.PRIM_DESC:
|
||||
res.Add(part.Description);
|
||||
res.Add(new LSL_String(part.Description));
|
||||
break;
|
||||
case (int)ScriptBaseClass.PRIM_ROT_LOCAL:
|
||||
res.Add(new LSL_Rotation(part.RotationOffset.X, part.RotationOffset.Y, part.RotationOffset.Z, part.RotationOffset.W));
|
||||
|
@ -9895,8 +9895,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
{
|
||||
foreach (KeyValuePair<UUID, int> detectedParams in land.GetLandObjectOwners())
|
||||
{
|
||||
ret.Add(detectedParams.Key.ToString());
|
||||
ret.Add(detectedParams.Value);
|
||||
ret.Add(new LSL_String(detectedParams.Key.ToString()));
|
||||
ret.Add(new LSL_Integer(detectedParams.Value));
|
||||
}
|
||||
}
|
||||
ScriptSleep(2000);
|
||||
|
@ -9946,25 +9946,25 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
switch (o.ToString())
|
||||
{
|
||||
case "0":
|
||||
ret = ret + new LSL_List(land.Name);
|
||||
ret.Add(new LSL_String(land.Name));
|
||||
break;
|
||||
case "1":
|
||||
ret = ret + new LSL_List(land.Description);
|
||||
ret.Add(new LSL_String(land.Description));
|
||||
break;
|
||||
case "2":
|
||||
ret = ret + new LSL_List(land.OwnerID.ToString());
|
||||
ret.Add(new LSL_Key(land.OwnerID.ToString()));
|
||||
break;
|
||||
case "3":
|
||||
ret = ret + new LSL_List(land.GroupID.ToString());
|
||||
ret.Add(new LSL_Key(land.GroupID.ToString()));
|
||||
break;
|
||||
case "4":
|
||||
ret = ret + new LSL_List(land.Area);
|
||||
ret.Add(new LSL_Integer(land.Area));
|
||||
break;
|
||||
case "5":
|
||||
ret = ret + new LSL_List(land.GlobalID);
|
||||
ret.Add(new LSL_Key(land.GlobalID.ToString()));
|
||||
break;
|
||||
default:
|
||||
ret = ret + new LSL_List(0);
|
||||
ret.Add(new LSL_Integer(0));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -9996,10 +9996,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
switch (o.ToString())
|
||||
{
|
||||
case "1":
|
||||
ret.Add(av.Firstname + " " + av.Lastname);
|
||||
ret.Add(new LSL_String(av.Firstname + " " + av.Lastname));
|
||||
break;
|
||||
case "2":
|
||||
ret.Add("");
|
||||
ret.Add(new LSL_String(""));
|
||||
break;
|
||||
case "3":
|
||||
ret.Add(new LSL_Vector((double)av.AbsolutePosition.X, (double)av.AbsolutePosition.Y, (double)av.AbsolutePosition.Z));
|
||||
|
@ -10011,13 +10011,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
ret.Add(new LSL_Vector(av.Velocity.X, av.Velocity.Y, av.Velocity.Z));
|
||||
break;
|
||||
case "6":
|
||||
ret.Add(id);
|
||||
ret.Add(new LSL_String(id));
|
||||
break;
|
||||
case "7":
|
||||
ret.Add(UUID.Zero.ToString());
|
||||
ret.Add(new LSL_String(UUID.Zero.ToString()));
|
||||
break;
|
||||
case "8":
|
||||
ret.Add(UUID.Zero.ToString());
|
||||
ret.Add(new LSL_String(UUID.Zero.ToString()));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -10031,10 +10031,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
switch (o.ToString())
|
||||
{
|
||||
case "1":
|
||||
ret.Add(obj.Name);
|
||||
ret.Add(new LSL_String(obj.Name));
|
||||
break;
|
||||
case "2":
|
||||
ret.Add(obj.Description);
|
||||
ret.Add(new LSL_String(obj.Description));
|
||||
break;
|
||||
case "3":
|
||||
ret.Add(new LSL_Vector(obj.AbsolutePosition.X, obj.AbsolutePosition.Y, obj.AbsolutePosition.Z));
|
||||
|
@ -10046,13 +10046,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
ret.Add(new LSL_Vector(obj.Velocity.X, obj.Velocity.Y, obj.Velocity.Z));
|
||||
break;
|
||||
case "6":
|
||||
ret.Add(obj.OwnerID.ToString());
|
||||
ret.Add(new LSL_String(obj.OwnerID.ToString()));
|
||||
break;
|
||||
case "7":
|
||||
ret.Add(obj.GroupID.ToString());
|
||||
ret.Add(new LSL_String(obj.GroupID.ToString()));
|
||||
break;
|
||||
case "8":
|
||||
ret.Add(obj.CreatorID.ToString());
|
||||
ret.Add(new LSL_String(obj.CreatorID.ToString()));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -130,7 +130,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
int idx = 0;
|
||||
while (idx < rules.Length)
|
||||
{
|
||||
uint rule = (uint)rules.GetLSLIntegerItem(idx);
|
||||
LSL_Integer ruleInt = rules.GetLSLIntegerItem(idx);
|
||||
uint rule = (uint)ruleInt;
|
||||
LSL_List toadd = new LSL_List();
|
||||
|
||||
switch (rule)
|
||||
|
@ -247,7 +248,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
|
||||
if (toadd.Length > 0)
|
||||
{
|
||||
values.Add(rule);
|
||||
values.Add(ruleInt);
|
||||
values.Add(toadd.Data[0]);
|
||||
}
|
||||
idx++;
|
||||
|
|
|
@ -38,7 +38,6 @@ using OpenSim;
|
|||
using OpenSim.Framework;
|
||||
|
||||
using OpenSim.Framework.Console;
|
||||
using OpenSim.Region.CoreModules.Avatar.NPC;
|
||||
using OpenSim.Region.Framework.Interfaces;
|
||||
using OpenSim.Region.Framework.Scenes;
|
||||
using OpenSim.Region.ScriptEngine.Shared;
|
||||
|
@ -812,7 +811,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
World.ForEachScenePresence(delegate(ScenePresence sp)
|
||||
{
|
||||
if (!sp.IsChildAgent)
|
||||
result.Add(sp.Name);
|
||||
result.Add(new LSL_String(sp.Name));
|
||||
});
|
||||
return result;
|
||||
}
|
||||
|
@ -970,7 +969,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
|
||||
public string osDrawPolygon(string drawList, LSL_List x, LSL_List y)
|
||||
{
|
||||
CheckThreatLevel(ThreatLevel.None, "osDrawFilledPolygon");
|
||||
CheckThreatLevel(ThreatLevel.None, "osDrawPolygon");
|
||||
|
||||
m_host.AddScriptLPS(1);
|
||||
|
||||
|
@ -1241,7 +1240,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
return String.Empty;
|
||||
}
|
||||
|
||||
public void osSetWindParam(string plugin, string param, float value)
|
||||
public void osSetWindParam(string plugin, string param, LSL_Float value)
|
||||
{
|
||||
CheckThreatLevel(ThreatLevel.VeryLow, "osSetWindParam");
|
||||
m_host.AddScriptLPS(1);
|
||||
|
@ -1251,13 +1250,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
{
|
||||
try
|
||||
{
|
||||
module.WindParamSet(plugin, param, value);
|
||||
module.WindParamSet(plugin, param, (float)value);
|
||||
}
|
||||
catch (Exception) { }
|
||||
}
|
||||
}
|
||||
|
||||
public float osGetWindParam(string plugin, string param)
|
||||
public LSL_Float osGetWindParam(string plugin, string param)
|
||||
{
|
||||
CheckThreatLevel(ThreatLevel.VeryLow, "osGetWindParam");
|
||||
m_host.AddScriptLPS(1);
|
||||
|
@ -1409,7 +1408,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
{
|
||||
// What actually is the difference to the LL function?
|
||||
//
|
||||
CheckThreatLevel(ThreatLevel.VeryLow, "osSetParcelMediaURL");
|
||||
CheckThreatLevel(ThreatLevel.VeryLow, "osSetParcelSIPAddress");
|
||||
|
||||
m_host.AddScriptLPS(1);
|
||||
|
||||
|
@ -1910,8 +1909,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
};
|
||||
|
||||
return NotecardCache.GetLines(assetID);
|
||||
|
||||
|
||||
}
|
||||
|
||||
public string osAvatarName2Key(string firstname, string lastname)
|
||||
|
@ -2025,16 +2022,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
// Find matches beginning at start position
|
||||
Regex matcher = new Regex(pattern);
|
||||
Match match = matcher.Match(src, start);
|
||||
if (match.Success)
|
||||
while (match.Success)
|
||||
{
|
||||
foreach (System.Text.RegularExpressions.Group g in match.Groups)
|
||||
{
|
||||
if (g.Success)
|
||||
{
|
||||
result.Add(g.Value);
|
||||
result.Add(g.Index);
|
||||
result.Add(new LSL_String(g.Value));
|
||||
result.Add(new LSL_Integer(g.Index));
|
||||
}
|
||||
}
|
||||
|
||||
match = match.NextMatch();
|
||||
}
|
||||
|
||||
return result;
|
||||
|
@ -2209,12 +2208,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
return (int)pws;
|
||||
}
|
||||
|
||||
public void osSetSpeed(string UUID, float SpeedModifier)
|
||||
public void osSetSpeed(string UUID, LSL_Float SpeedModifier)
|
||||
{
|
||||
CheckThreatLevel(ThreatLevel.Moderate, "osSetSpeed");
|
||||
m_host.AddScriptLPS(1);
|
||||
ScenePresence avatar = World.GetScenePresence(new UUID(UUID));
|
||||
avatar.SpeedModifier = SpeedModifier;
|
||||
avatar.SpeedModifier = (float)SpeedModifier;
|
||||
}
|
||||
|
||||
public void osKickAvatar(string FirstName,string SurName,string alert)
|
||||
|
@ -2295,14 +2294,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
{
|
||||
CheckThreatLevel(ThreatLevel.High, "osGetPrimitiveParams");
|
||||
m_host.AddScriptLPS(1);
|
||||
InitLSL();
|
||||
|
||||
return m_LSL_Api.GetLinkPrimitiveParamsEx(prim, rules);
|
||||
}
|
||||
|
||||
public void osSetPrimitiveParams(LSL_Key prim, LSL_List rules)
|
||||
{
|
||||
CheckThreatLevel(ThreatLevel.High, "osGetPrimitiveParams");
|
||||
CheckThreatLevel(ThreatLevel.High, "osSetPrimitiveParams");
|
||||
m_host.AddScriptLPS(1);
|
||||
InitLSL();
|
||||
|
||||
m_LSL_Api.SetPrimitiveParamsEx(prim, rules);
|
||||
}
|
||||
|
@ -2364,9 +2365,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
{
|
||||
if (avatar.IsChildAgent == false)
|
||||
{
|
||||
result.Add(avatar.UUID);
|
||||
result.Add(avatar.AbsolutePosition);
|
||||
result.Add(avatar.Name);
|
||||
result.Add(new LSL_String(avatar.UUID.ToString()));
|
||||
OpenMetaverse.Vector3 ap = avatar.AbsolutePosition;
|
||||
result.Add(new LSL_Vector(ap.X, ap.Y, ap.Z));
|
||||
result.Add(new LSL_String(avatar.Name));
|
||||
}
|
||||
}
|
||||
});
|
||||
|
|
|
@ -129,8 +129,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
|
|||
|
||||
// Wind Module Functions
|
||||
string osWindActiveModelPluginName();
|
||||
void osSetWindParam(string plugin, string param, float value);
|
||||
float osGetWindParam(string plugin, string param);
|
||||
void osSetWindParam(string plugin, string param, LSL_Float value);
|
||||
LSL_Float osGetWindParam(string plugin, string param);
|
||||
|
||||
// Parcel commands
|
||||
void osParcelJoin(vector pos1, vector pos2);
|
||||
|
@ -180,7 +180,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
|
|||
|
||||
int osGetSimulatorMemory();
|
||||
void osKickAvatar(string FirstName,string SurName,string alert);
|
||||
void osSetSpeed(string UUID, float SpeedModifier);
|
||||
void osSetSpeed(string UUID, LSL_Float SpeedModifier);
|
||||
void osCauseHealing(string avatar, double healing);
|
||||
void osCauseDamage(string avatar, double damage);
|
||||
LSL_List osGetPrimitiveParams(LSL_Key prim, LSL_List rules);
|
||||
|
|
|
@ -106,16 +106,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
|
|||
return m_OSSL_Functions.osWindActiveModelPluginName();
|
||||
}
|
||||
|
||||
// Not yet plugged in as available OSSL functions, so commented out
|
||||
// void osSetWindParam(string plugin, string param, float value)
|
||||
// {
|
||||
// m_OSSL_Functions.osSetWindParam(plugin, param, value);
|
||||
// }
|
||||
//
|
||||
// float osGetWindParam(string plugin, string param)
|
||||
// {
|
||||
// return m_OSSL_Functions.osGetWindParam(plugin, param);
|
||||
// }
|
||||
public void osSetWindParam(string plugin, string param, LSL_Float value)
|
||||
{
|
||||
m_OSSL_Functions.osSetWindParam(plugin, param, value);
|
||||
}
|
||||
|
||||
public LSL_Float osGetWindParam(string plugin, string param)
|
||||
{
|
||||
return m_OSSL_Functions.osGetWindParam(plugin, param);
|
||||
}
|
||||
|
||||
public void osParcelJoin(vector pos1, vector pos2)
|
||||
{
|
||||
|
@ -714,7 +713,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
|
|||
m_OSSL_Functions.osKickAvatar(FirstName, SurName, alert);
|
||||
}
|
||||
|
||||
public void osSetSpeed(string UUID, float SpeedModifier)
|
||||
public void osSetSpeed(string UUID, LSL_Float SpeedModifier)
|
||||
{
|
||||
m_OSSL_Functions.osSetSpeed(UUID, SpeedModifier);
|
||||
}
|
||||
|
|
|
@ -106,6 +106,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
|
|||
// Get some config
|
||||
WriteScriptSourceToDebugFile = m_scriptEngine.Config.GetBoolean("WriteScriptSourceToDebugFile", false);
|
||||
CompileWithDebugInformation = m_scriptEngine.Config.GetBoolean("CompileWithDebugInformation", true);
|
||||
bool DeleteScriptsOnStartup = m_scriptEngine.Config.GetBoolean("DeleteScriptsOnStartup", true);
|
||||
|
||||
// Get file prefix from scriptengine name and make it file system safe:
|
||||
FilePrefix = "CommonCompiler";
|
||||
|
@ -114,11 +115,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
|
|||
FilePrefix = FilePrefix.Replace(c, '_');
|
||||
}
|
||||
|
||||
// First time we start? Delete old files
|
||||
if (in_startup)
|
||||
{
|
||||
in_startup = false;
|
||||
DeleteOldFiles();
|
||||
CreateScriptsDirectory();
|
||||
|
||||
// First time we start? Delete old files
|
||||
if (DeleteScriptsOnStartup)
|
||||
DeleteOldFiles();
|
||||
}
|
||||
|
||||
// Map name and enum type of our supported languages
|
||||
|
@ -187,11 +191,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
|
|||
}
|
||||
|
||||
/// <summary>
|
||||
/// Delete old script files
|
||||
/// Create the directory where compiled scripts are stored.
|
||||
/// </summary>
|
||||
private void DeleteOldFiles()
|
||||
private void CreateScriptsDirectory()
|
||||
{
|
||||
// CREATE FOLDER IF IT DOESNT EXIST
|
||||
if (!Directory.Exists(ScriptEnginesPath))
|
||||
{
|
||||
try
|
||||
|
@ -218,7 +221,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
|
|||
m_scriptEngine.World.RegionInfo.RegionID.ToString()) + "\": " + ex.ToString());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Delete old script files
|
||||
/// </summary>
|
||||
private void DeleteOldFiles()
|
||||
{
|
||||
foreach (string file in Directory.GetFiles(Path.Combine(ScriptEnginesPath,
|
||||
m_scriptEngine.World.RegionInfo.RegionID.ToString()), FilePrefix + "_compiled*"))
|
||||
{
|
||||
|
|
|
@ -1379,7 +1379,9 @@ namespace OpenSim.Region.ScriptEngine.Shared
|
|||
public struct LSLString
|
||||
{
|
||||
public string m_string;
|
||||
|
||||
#region Constructors
|
||||
|
||||
public LSLString(string s)
|
||||
{
|
||||
m_string = s;
|
||||
|
@ -1387,22 +1389,24 @@ namespace OpenSim.Region.ScriptEngine.Shared
|
|||
|
||||
public LSLString(double d)
|
||||
{
|
||||
string s=String.Format(Culture.FormatProvider, "{0:0.000000}", d);
|
||||
m_string=s;
|
||||
string s = String.Format(Culture.FormatProvider, "{0:0.000000}", d);
|
||||
m_string = s;
|
||||
}
|
||||
|
||||
public LSLString(LSLFloat f)
|
||||
{
|
||||
string s = String.Format(Culture.FormatProvider, "{0:0.000000}", f.value);
|
||||
m_string=s;
|
||||
m_string = s;
|
||||
}
|
||||
|
||||
public LSLString(LSLInteger i)
|
||||
|
||||
public LSLString(int i)
|
||||
{
|
||||
string s = String.Format("{0}", i);
|
||||
m_string = s;
|
||||
}
|
||||
|
||||
public LSLString(LSLInteger i) : this(i.value) {}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Operators
|
||||
|
@ -1469,6 +1473,11 @@ namespace OpenSim.Region.ScriptEngine.Shared
|
|||
{
|
||||
return new LSLString(d);
|
||||
}
|
||||
|
||||
static public explicit operator LSLString(int i)
|
||||
{
|
||||
return new LSLString(i);
|
||||
}
|
||||
|
||||
public static explicit operator LSLString(LSLFloat f)
|
||||
{
|
||||
|
@ -1742,7 +1751,17 @@ namespace OpenSim.Region.ScriptEngine.Shared
|
|||
public override bool Equals(Object o)
|
||||
{
|
||||
if (!(o is LSLInteger))
|
||||
return false;
|
||||
{
|
||||
if (o is int)
|
||||
{
|
||||
return value == (int)o;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return value == ((LSLInteger)o).value;
|
||||
}
|
||||
|
||||
|
|
|
@ -84,11 +84,20 @@ namespace OpenSim.Services.AssetService
|
|||
if (assetLoaderEnabled)
|
||||
{
|
||||
m_log.InfoFormat("[ASSET]: Loading default asset set from {0}", loaderArgs);
|
||||
m_AssetLoader.ForEachDefaultXmlAsset(loaderArgs,
|
||||
delegate(AssetBase a)
|
||||
|
||||
m_AssetLoader.ForEachDefaultXmlAsset(
|
||||
loaderArgs,
|
||||
delegate(AssetBase a)
|
||||
{
|
||||
AssetBase existingAsset = Get(a.ID);
|
||||
// AssetMetadata existingMetadata = GetMetadata(a.ID);
|
||||
|
||||
if (existingAsset == null || Util.SHA1Hash(existingAsset.Data) != Util.SHA1Hash(a.Data))
|
||||
{
|
||||
// m_log.DebugFormat("[ASSET]: Storing {0} {1}", a.Name, a.ID);
|
||||
Store(a);
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
m_log.Info("[ASSET SERVICE]: Local asset service enabled");
|
||||
|
|
|
@ -63,7 +63,7 @@ namespace OpenSim.Services.GridService
|
|||
protected GatekeeperServiceConnector m_GatekeeperConnector;
|
||||
|
||||
protected UUID m_ScopeID = UUID.Zero;
|
||||
protected bool m_Check4096 = true;
|
||||
// protected bool m_Check4096 = true;
|
||||
protected string m_MapTileDirectory = string.Empty;
|
||||
protected string m_ThisGatekeeper = string.Empty;
|
||||
protected Uri m_ThisGatekeeperURI = null;
|
||||
|
@ -121,7 +121,7 @@ namespace OpenSim.Services.GridService
|
|||
if (scope != string.Empty)
|
||||
UUID.TryParse(scope, out m_ScopeID);
|
||||
|
||||
m_Check4096 = gridConfig.GetBoolean("Check4096", true);
|
||||
// m_Check4096 = gridConfig.GetBoolean("Check4096", true);
|
||||
|
||||
m_MapTileDirectory = gridConfig.GetString("MapTileDirectory", "maptiles");
|
||||
|
||||
|
@ -347,14 +347,18 @@ namespace OpenSim.Services.GridService
|
|||
return true;
|
||||
}
|
||||
|
||||
uint x, y;
|
||||
if (m_Check4096 && !Check4096(handle, out x, out y))
|
||||
{
|
||||
RemoveHyperlinkRegion(regInfo.RegionID);
|
||||
reason = "Region is too far (" + x + ", " + y + ")";
|
||||
m_log.Info("[HYPERGRID LINKER]: Unable to link, region is too far (" + x + ", " + y + ")");
|
||||
return false;
|
||||
}
|
||||
// We are now performing this check for each individual teleport in the EntityTransferModule instead. This
|
||||
// allows us to give better feedback when teleports fail because of the distance reason (which can't be
|
||||
// done here) and it also hypergrid teleports that are within range (possibly because the source grid
|
||||
// itself has regions that are very far apart).
|
||||
// uint x, y;
|
||||
// if (m_Check4096 && !Check4096(handle, out x, out y))
|
||||
// {
|
||||
// //RemoveHyperlinkRegion(regInfo.RegionID);
|
||||
// reason = "Region is too far (" + x + ", " + y + ")";
|
||||
// m_log.Info("[HYPERGRID LINKER]: Unable to link, region is too far (" + x + ", " + y + ")");
|
||||
// //return false;
|
||||
// }
|
||||
|
||||
regInfo.RegionID = regionID;
|
||||
|
||||
|
@ -405,60 +409,59 @@ namespace OpenSim.Services.GridService
|
|||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Cope with this viewer limitation.
|
||||
/// </summary>
|
||||
/// <param name="regInfo"></param>
|
||||
/// <returns></returns>
|
||||
public bool Check4096(ulong realHandle, out uint x, out uint y)
|
||||
{
|
||||
uint ux = 0, uy = 0;
|
||||
Utils.LongToUInts(realHandle, out ux, out uy);
|
||||
x = ux / Constants.RegionSize;
|
||||
y = uy / Constants.RegionSize;
|
||||
|
||||
const uint limit = (4096 - 1) * Constants.RegionSize;
|
||||
uint xmin = ux - limit;
|
||||
uint xmax = ux + limit;
|
||||
uint ymin = uy - limit;
|
||||
uint ymax = uy + limit;
|
||||
// World map boundary checks
|
||||
if (xmin < 0 || xmin > ux)
|
||||
xmin = 0;
|
||||
if (xmax > int.MaxValue || xmax < ux)
|
||||
xmax = int.MaxValue;
|
||||
if (ymin < 0 || ymin > uy)
|
||||
ymin = 0;
|
||||
if (ymax > int.MaxValue || ymax < uy)
|
||||
ymax = int.MaxValue;
|
||||
|
||||
// Check for any regions that are within the possible teleport range to the linked region
|
||||
List<GridRegion> regions = m_GridService.GetRegionRange(m_ScopeID, (int)xmin, (int)xmax, (int)ymin, (int)ymax);
|
||||
if (regions.Count == 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Check for regions which are not linked regions
|
||||
List<GridRegion> hyperlinks = m_GridService.GetHyperlinks(m_ScopeID);
|
||||
IEnumerable<GridRegion> availableRegions = regions.Except(hyperlinks);
|
||||
if (availableRegions.Count() == 0)
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
// Not currently used
|
||||
// /// <summary>
|
||||
// /// Cope with this viewer limitation.
|
||||
// /// </summary>
|
||||
// /// <param name="regInfo"></param>
|
||||
// /// <returns></returns>
|
||||
// public bool Check4096(ulong realHandle, out uint x, out uint y)
|
||||
// {
|
||||
// uint ux = 0, uy = 0;
|
||||
// Utils.LongToUInts(realHandle, out ux, out uy);
|
||||
// x = ux / Constants.RegionSize;
|
||||
// y = uy / Constants.RegionSize;
|
||||
//
|
||||
// const uint limit = (4096 - 1) * Constants.RegionSize;
|
||||
// uint xmin = ux - limit;
|
||||
// uint xmax = ux + limit;
|
||||
// uint ymin = uy - limit;
|
||||
// uint ymax = uy + limit;
|
||||
// // World map boundary checks
|
||||
// if (xmin < 0 || xmin > ux)
|
||||
// xmin = 0;
|
||||
// if (xmax > int.MaxValue || xmax < ux)
|
||||
// xmax = int.MaxValue;
|
||||
// if (ymin < 0 || ymin > uy)
|
||||
// ymin = 0;
|
||||
// if (ymax > int.MaxValue || ymax < uy)
|
||||
// ymax = int.MaxValue;
|
||||
//
|
||||
// // Check for any regions that are within the possible teleport range to the linked region
|
||||
// List<GridRegion> regions = m_GridService.GetRegionRange(m_ScopeID, (int)xmin, (int)xmax, (int)ymin, (int)ymax);
|
||||
// if (regions.Count == 0)
|
||||
// {
|
||||
// return false;
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// // Check for regions which are not linked regions
|
||||
// List<GridRegion> hyperlinks = m_GridService.GetHyperlinks(m_ScopeID);
|
||||
// IEnumerable<GridRegion> availableRegions = regions.Except(hyperlinks);
|
||||
// if (availableRegions.Count() == 0)
|
||||
// return false;
|
||||
// }
|
||||
//
|
||||
// return true;
|
||||
// }
|
||||
|
||||
private void AddHyperlinkRegion(GridRegion regionInfo, ulong regionHandle)
|
||||
{
|
||||
|
||||
RegionData rdata = m_GridService.RegionInfo2RegionData(regionInfo);
|
||||
int flags = (int)OpenSim.Data.RegionFlags.Hyperlink + (int)OpenSim.Data.RegionFlags.NoDirectLogin + (int)OpenSim.Data.RegionFlags.RegionOnline;
|
||||
rdata.Data["flags"] = flags.ToString();
|
||||
|
||||
m_Database.Store(rdata);
|
||||
|
||||
}
|
||||
|
||||
private void RemoveHyperlinkRegion(UUID regionID)
|
||||
|
|
|
@ -83,9 +83,24 @@ namespace OpenSim.Services.UserAccountService
|
|||
"create user",
|
||||
"create user [<first> [<last> [<pass> [<email>]]]]",
|
||||
"Create a new user", HandleCreateUser);
|
||||
MainConsole.Instance.Commands.AddCommand("UserService", false, "reset user password",
|
||||
|
||||
MainConsole.Instance.Commands.AddCommand("UserService", false,
|
||||
"reset user password",
|
||||
"reset user password [<first> [<last> [<password>]]]",
|
||||
"Reset a user password", HandleResetUserPassword);
|
||||
|
||||
MainConsole.Instance.Commands.AddCommand("UserService", false,
|
||||
"set user level",
|
||||
"set user level [<first> [<last> [<level>]]]",
|
||||
"Set user level. If >= 200 and 'allow_grid_gods = true' in OpenSim.ini, "
|
||||
+ "this account will be treated as god-moded. "
|
||||
+ "It will also affect the 'login level' command. ",
|
||||
HandleSetUserLevel);
|
||||
|
||||
MainConsole.Instance.Commands.AddCommand("UserService", false,
|
||||
"show account",
|
||||
"show account <first> <last>",
|
||||
"Show account details for the given user", HandleShowAccount);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -318,6 +333,36 @@ namespace OpenSim.Services.UserAccountService
|
|||
CreateUser(firstName, lastName, password, email);
|
||||
}
|
||||
|
||||
protected void HandleShowAccount(string module, string[] cmdparams)
|
||||
{
|
||||
if (cmdparams.Length != 4)
|
||||
{
|
||||
MainConsole.Instance.Output("Usage: show account <first-name> <last-name>");
|
||||
return;
|
||||
}
|
||||
|
||||
string firstName = cmdparams[2];
|
||||
string lastName = cmdparams[3];
|
||||
|
||||
UserAccount ua = GetUserAccount(UUID.Zero, firstName, lastName);
|
||||
|
||||
if (ua == null)
|
||||
{
|
||||
MainConsole.Instance.OutputFormat("No user named {0} {1}", firstName, lastName);
|
||||
return;
|
||||
}
|
||||
|
||||
MainConsole.Instance.OutputFormat("Name: {0}", ua.Name);
|
||||
MainConsole.Instance.OutputFormat("ID: {0}", ua.PrincipalID);
|
||||
MainConsole.Instance.OutputFormat("Title: {0}", ua.UserTitle);
|
||||
MainConsole.Instance.OutputFormat("E-mail: {0}", ua.Email);
|
||||
MainConsole.Instance.OutputFormat("Created: {0}", Utils.UnixTimeToDateTime(ua.Created));
|
||||
MainConsole.Instance.OutputFormat("Level: {0}", ua.UserLevel);
|
||||
MainConsole.Instance.OutputFormat("Flags: {0}", ua.UserFlags);
|
||||
foreach (KeyValuePair<string, Object> kvp in ua.ServiceURLs)
|
||||
MainConsole.Instance.OutputFormat("{0}: {1}", kvp.Key, kvp.Value);
|
||||
}
|
||||
|
||||
protected void HandleResetUserPassword(string module, string[] cmdparams)
|
||||
{
|
||||
string firstName;
|
||||
|
@ -338,16 +383,58 @@ namespace OpenSim.Services.UserAccountService
|
|||
|
||||
UserAccount account = GetUserAccount(UUID.Zero, firstName, lastName);
|
||||
if (account == null)
|
||||
m_log.ErrorFormat("[USER ACCOUNT SERVICE]: No such user");
|
||||
{
|
||||
MainConsole.Instance.OutputFormat("No such user as {0} {1}", firstName, lastName);
|
||||
return;
|
||||
}
|
||||
|
||||
bool success = false;
|
||||
if (m_AuthenticationService != null)
|
||||
success = m_AuthenticationService.SetPassword(account.PrincipalID, newPassword);
|
||||
|
||||
if (!success)
|
||||
m_log.ErrorFormat("[USER ACCOUNT SERVICE]: Unable to reset password for account {0} {1}.",
|
||||
firstName, lastName);
|
||||
MainConsole.Instance.OutputFormat("Unable to reset password for account {0} {1}.", firstName, lastName);
|
||||
else
|
||||
m_log.InfoFormat("[USER ACCOUNT SERVICE]: Password reset for user {0} {1}", firstName, lastName);
|
||||
MainConsole.Instance.OutputFormat("Password reset for user {0} {1}", firstName, lastName);
|
||||
}
|
||||
|
||||
protected void HandleSetUserLevel(string module, string[] cmdparams)
|
||||
{
|
||||
string firstName;
|
||||
string lastName;
|
||||
string rawLevel;
|
||||
int level;
|
||||
|
||||
if (cmdparams.Length < 4)
|
||||
firstName = MainConsole.Instance.CmdPrompt("First name");
|
||||
else firstName = cmdparams[3];
|
||||
|
||||
if (cmdparams.Length < 5)
|
||||
lastName = MainConsole.Instance.CmdPrompt("Last name");
|
||||
else lastName = cmdparams[4];
|
||||
|
||||
UserAccount account = GetUserAccount(UUID.Zero, firstName, lastName);
|
||||
if (account == null) {
|
||||
MainConsole.Instance.OutputFormat("No such user");
|
||||
return;
|
||||
}
|
||||
|
||||
if (cmdparams.Length < 6)
|
||||
rawLevel = MainConsole.Instance.CmdPrompt("User level");
|
||||
else rawLevel = cmdparams[5];
|
||||
|
||||
if(int.TryParse(rawLevel, out level) == false) {
|
||||
MainConsole.Instance.OutputFormat("Invalid user level");
|
||||
return;
|
||||
}
|
||||
|
||||
account.UserLevel = level;
|
||||
|
||||
bool success = StoreUserAccount(account);
|
||||
if (!success)
|
||||
MainConsole.Instance.OutputFormat("Unable to set user level for account {0} {1}.", firstName, lastName);
|
||||
else
|
||||
MainConsole.Instance.OutputFormat("User level set for user {0} {1} to {2}", firstName, lastName, level);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
|
|
@ -36,6 +36,15 @@ namespace OpenSim.Tests.Common
|
|||
{
|
||||
public class AssetHelpers
|
||||
{
|
||||
/// <summary>
|
||||
/// Create a notecard asset with a random uuids and dummy text.
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public static AssetBase CreateAsset()
|
||||
{
|
||||
return CreateAsset(UUID.Random(), AssetType.Notecard, "hello", UUID.Random());
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Create a notecard asset with a random uuid and dummy text.
|
||||
/// </summary>
|
||||
|
|
|
@ -341,9 +341,9 @@ namespace OpenSim.Tests.Common
|
|||
/// <param name="scene"></param>
|
||||
/// <param name="agentId"></param>
|
||||
/// <returns></returns>
|
||||
public static TestClient AddRootAgent(Scene scene, UUID agentId)
|
||||
public static TestClient AddClient(Scene scene, UUID agentId)
|
||||
{
|
||||
return AddRootAgent(scene, GenerateAgentData(agentId));
|
||||
return AddClient(scene, GenerateAgentData(agentId));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -364,7 +364,7 @@ namespace OpenSim.Tests.Common
|
|||
/// <param name="scene"></param>
|
||||
/// <param name="agentData"></param>
|
||||
/// <returns></returns>
|
||||
public static TestClient AddRootAgent(Scene scene, AgentCircuitData agentData)
|
||||
public static TestClient AddClient(Scene scene, AgentCircuitData agentData)
|
||||
{
|
||||
string reason;
|
||||
|
||||
|
|
|
@ -28,6 +28,7 @@
|
|||
using System;
|
||||
using System.Diagnostics;
|
||||
using NUnit.Framework;
|
||||
using OpenMetaverse;
|
||||
|
||||
namespace OpenSim.Tests.Common
|
||||
{
|
||||
|
@ -56,5 +57,15 @@ namespace OpenSim.Tests.Common
|
|||
Console.WriteLine();
|
||||
Console.WriteLine("===> In Test Method : {0} <===", stackTrace.GetFrame(1).GetMethod().Name);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Parse tail section into full UUID.
|
||||
/// </summary>
|
||||
/// <param name="tail"></param>
|
||||
/// <returns></returns>
|
||||
public static UUID ParseTail(int tail)
|
||||
{
|
||||
return new UUID(string.Format("00000000-0000-0000-0000-{0:X12}", tail));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -239,7 +239,7 @@ namespace OpenSim.Tools.Configger
|
|||
config.Set("meshing", "Meshmerizer");
|
||||
config.Set("physical_prim", true);
|
||||
config.Set("see_into_this_sim_from_neighbor", true);
|
||||
config.Set("serverside_object_permissions", false);
|
||||
config.Set("serverside_object_permissions", true);
|
||||
config.Set("storage_plugin", "OpenSim.Data.SQLite.dll");
|
||||
config.Set("storage_connection_string", "URI=file:OpenSim.db,version=3");
|
||||
config.Set("storage_prim_inventories", true);
|
||||
|
|
|
@ -78,20 +78,19 @@
|
|||
; DrawPrimOnMapTile = true
|
||||
|
||||
;# {NonPhysicalPrimMax} {} {Maximum size of nonphysical prims?} {} 256
|
||||
;; Maximum size for non-physical prims
|
||||
;; Maximum size for non-physical prims. Affects resizing of existing prims. This can be overriden in the region config file (as NonphysicalPrimMax!).
|
||||
; NonPhysicalPrimMax = 256
|
||||
|
||||
;# {PhysicalPrimMax} {} {Maximum size of physical prims?} {} 10
|
||||
;; Maximum size where a prim can be physical
|
||||
;; Maximum size where a prim can be physical. Affects resizing of existing prims. This can be overriden in the region config file.
|
||||
; PhysicalPrimMax = 10
|
||||
|
||||
;; Prevent the creation, import and rez of prims that exceed the
|
||||
;; maximum size.
|
||||
;; If a viewer attempts to rez a prim larger than the non-physical or physical prim max, clamp the dimensions to the appropriate maximum
|
||||
;; This can be overriden in the region config file.
|
||||
; ClampPrimSize = false
|
||||
|
||||
;# {AllowScriptCrossing} {} {Allow scripts to cross into this region} {true false} false
|
||||
;; Allow scripts to cross region boundaries. These are recompiled on the
|
||||
;; new region.
|
||||
;; Allow scripts to keep running when they cross region boundaries, rather than being restarted. Script code is recompiled on the destination region and the state reloaded.
|
||||
; AllowScriptCrossing = false
|
||||
|
||||
;# {TrustBinaries} {AllowScriptCrossing:true} {Accept compiled binary script code? (DANGEROUS!)} {true false} false
|
||||
|
@ -173,7 +172,7 @@
|
|||
;; permission checks (allowing anybody to copy
|
||||
;; any item, etc. This may not yet be implemented uniformally.
|
||||
;; If set to true, then all permissions checks are carried out
|
||||
; serverside_object_permissions = false
|
||||
; serverside_object_permissions = true
|
||||
|
||||
;; This allows users with a UserLevel of 200 or more to assume god
|
||||
;; powers in the regions in this simulator.
|
||||
|
@ -292,28 +291,31 @@
|
|||
;; building's lights to possibly not be rendered.
|
||||
; DisableFacelights = "false"
|
||||
|
||||
|
||||
[ClientStack.LindenCaps]
|
||||
;; For the long list of capabilities, see OpenSimDefaults.ini
|
||||
;; Here are the few ones you may want to change. Possible values
|
||||
;; are:
|
||||
;; "" -- empty, capability disabled
|
||||
;; "localhost" -- capability enabled and served by the simulator
|
||||
;; "<url>" -- capability enabled and served by some other server
|
||||
;;
|
||||
; These are enabled by default to localhost. Change if you see fit.
|
||||
Cap_GetTexture = "localhost"
|
||||
Cap_GetMesh = "localhost"
|
||||
; This is disabled by default. Change if you see fit. Note that
|
||||
; serving this cap from the simulators may lead to poor performace.
|
||||
Cap_WebFetchInventoryDescendents = ""
|
||||
;; For the long list of capabilities, see OpenSimDefaults.ini
|
||||
;; Here are the few ones you may want to change. Possible values
|
||||
;; are:
|
||||
;; "" -- empty, capability disabled
|
||||
;; "localhost" -- capability enabled and served by the simulator
|
||||
;; "<url>" -- capability enabled and served by some other server
|
||||
;;
|
||||
; These are enabled by default to localhost. Change if you see fit.
|
||||
Cap_GetTexture = "localhost"
|
||||
Cap_GetMesh = "localhost"
|
||||
; This is disabled by default. Change if you see fit. Note that
|
||||
; serving this cap from the simulators may lead to poor performace.
|
||||
Cap_WebFetchInventoryDescendents = ""
|
||||
|
||||
|
||||
[SimulatorFeatures]
|
||||
; Experimental new information sent in SimulatorFeatures cap for Kokua viewers
|
||||
; meant to override the MapImage and search server url given at login, and varying
|
||||
; on a sim-basis.
|
||||
; Viewers that don't understand it, will ignore it
|
||||
;MapImageServerURI = "http://127.0.0.1:9000/
|
||||
;SearchServerURI = "http://127.0.0.1:9000/
|
||||
; Experimental new information sent in SimulatorFeatures cap for Kokua viewers
|
||||
; meant to override the MapImage and search server url given at login, and varying
|
||||
; on a sim-basis.
|
||||
; Viewers that don't understand it, will ignore it
|
||||
;MapImageServerURI = "http://127.0.0.1:9000/
|
||||
;SearchServerURI = "http://127.0.0.1:9000/
|
||||
|
||||
|
||||
[Chat]
|
||||
;# {whisper_distance} {} {Distance at which a whisper is heard, in meters?} {} 10
|
||||
|
@ -443,8 +445,8 @@
|
|||
;; to ConfigurableWind and uncomment the following.
|
||||
; avg_strength = 5.0
|
||||
; avg_direction = 0.0
|
||||
; var_strength = 0.0
|
||||
; var_direction = 0.0
|
||||
; var_strength = 5.0
|
||||
; var_direction = 30.0
|
||||
; rate_change = 1.0
|
||||
|
||||
;# {strength} {enabled:true wind_plugin:SimpleRandomWind} {Wind strength?} {} 1.0
|
||||
|
@ -650,6 +652,7 @@
|
|||
;; If using a remote connector, specify the server URL
|
||||
; FreeswitchServiceURL = http://my.grid.server:8004/fsapi
|
||||
|
||||
|
||||
[Groups]
|
||||
;# {Enabled} {} {Enable groups?} {true false} false
|
||||
;; Enables the groups module
|
||||
|
@ -707,11 +710,13 @@
|
|||
;; Enable media on a prim facilities
|
||||
; Enabled = true;
|
||||
|
||||
|
||||
[PrimLimitsModule]
|
||||
;# {EnforcePrimLimits} {} {Enforce parcel prim limits} {true false} false
|
||||
;; Enable parcel prim limits. Off by default to emulate pre-existing behavior.
|
||||
; EnforcePrimLimits = false
|
||||
|
||||
|
||||
[Architecture]
|
||||
;# {Include-Architecture} {} {Choose one of the following architectures} {config-include/Standalone.ini config-include/StandaloneHypergrid.ini config-include/Grid.ini config-include/GridHypergrid.ini config-include/SimianGrid.ini config-include/HyperSimianGrid.ini} config-include/Standalone.ini
|
||||
;; Uncomment one of the following includes as required. For instance, to create a standalone OpenSim,
|
||||
|
|
|
@ -14,10 +14,13 @@
|
|||
; Place to create a PID file
|
||||
; PIDFile = "/tmp/my.pid"
|
||||
|
||||
; Console commands run at startup
|
||||
startup_console_commands_file = "startup_commands.txt"
|
||||
|
||||
; Console commands run on shutdown
|
||||
shutdown_console_commands_file = "shutdown_commands.txt"
|
||||
|
||||
; To run a script every few minutes, set the script filename here
|
||||
; Console commands run every 20 minutes
|
||||
; timer_Script = "filename"
|
||||
|
||||
; ##
|
||||
|
@ -70,12 +73,17 @@
|
|||
; Use terrain texture for maptiles if true, use shaded green if false
|
||||
TextureOnMapTile = false
|
||||
|
||||
; Maximum total size, and maximum size where a prim can be physical
|
||||
; Maximum size of non physical prims. Affects resizing of existing prims. This can be overriden in the region config file (as NonphysicalPrimMax!).
|
||||
NonPhysicalPrimMax = 256
|
||||
PhysicalPrimMax = 10 ; (I think this was moved to the Regions.ini!)
|
||||
|
||||
; Maximum size of physical prims. Affects resizing of existing prims. This can be overriden in the region config file.
|
||||
PhysicalPrimMax = 10
|
||||
|
||||
; If a viewer attempts to rez a prim larger than the non-physical or physical prim max, clamp the dimensions to the appropriate maximum
|
||||
; This can be overriden in the region config file.
|
||||
ClampPrimSize = false
|
||||
|
||||
; Allow scripts to cross region boundaries. These are recompiled on the new region.
|
||||
; Allow scripts to keep running when they cross region boundaries, rather than being restarted. Script code is recompiled on the destination region and the state reloaded.
|
||||
AllowScriptCrossing = false
|
||||
|
||||
; Allow compiled script binary code to cross region boundaries.
|
||||
|
@ -94,7 +102,7 @@
|
|||
; neighbors on each side for a total of 49 regions in view. Warning, unless
|
||||
; all the regions have the same drawdistance, you will end up with strange
|
||||
; effects because the agents that get closed may be inconsistent.
|
||||
; DefaultDrawDistance = 255.0
|
||||
DefaultDrawDistance = 255.0
|
||||
|
||||
; If you have only one region in an instance, or to avoid the many bugs
|
||||
; that you can trigger in modules by restarting a region, set this to
|
||||
|
@ -102,7 +110,7 @@
|
|||
; This is meant to be used on systems where some external system like
|
||||
; Monit will restart any instance that exits, thereby making the shutdown
|
||||
; into a restart.
|
||||
;InworldRestartShutsDown = false
|
||||
InworldRestartShutsDown = false
|
||||
|
||||
; ##
|
||||
; ## PRIM STORAGE
|
||||
|
@ -227,7 +235,6 @@
|
|||
|
||||
; If enabled, enableFlySlow will change the primary fly state to
|
||||
; FLYSLOW, and the "always run" state will be the regular fly.
|
||||
|
||||
enableflyslow = false
|
||||
|
||||
; PreJump is an additional animation state, but it probably
|
||||
|
@ -236,7 +243,6 @@
|
|||
|
||||
; This is commented so it will come on automatically once it's
|
||||
; supported.
|
||||
|
||||
; enableprejump = true
|
||||
|
||||
; Simulator Stats URI
|
||||
|
@ -265,6 +271,7 @@
|
|||
DelayBeforeAppearanceSave = 5
|
||||
DelayBeforeAppearanceSend = 2
|
||||
|
||||
|
||||
[SMTP]
|
||||
enabled=false
|
||||
|
||||
|
@ -504,6 +511,10 @@
|
|||
; 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
|
||||
max_distance = 4095
|
||||
|
||||
[Messaging]
|
||||
; Control which region module is used for instant messaging.
|
||||
|
@ -855,11 +866,6 @@
|
|||
;exclude_list=User 1,User 2,User 3
|
||||
|
||||
|
||||
[CMS]
|
||||
enabled = false
|
||||
;channel = 345
|
||||
|
||||
|
||||
; The following settings control the progression of daytime
|
||||
; in the Sim. The defaults are the same as the commented out settings
|
||||
[Sun]
|
||||
|
@ -1120,6 +1126,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
|
||||
|
||||
|
||||
[OpenGridProtocol]
|
||||
;These are the settings for the Open Grid Protocol.. the Agent Domain, Region Domain, you know..
|
||||
|
|
|
@ -1 +0,0 @@
|
|||
Place .ini files here to have them picked up automatically
|
|
@ -19,9 +19,12 @@
|
|||
; 0 to disable
|
||||
HitRateDisplay = 100
|
||||
|
||||
; Set to false for disk cache only.
|
||||
; Set to false for no memory cache
|
||||
MemoryCacheEnabled = false
|
||||
|
||||
; Set to false for no file cache
|
||||
FileCacheEnabled = true
|
||||
|
||||
; How long {in hours} to keep assets cached in memory, .5 == 30 minutes
|
||||
; Optimization: for VPS or limited memory system installs set Timeout to .016 (1 minute)
|
||||
; increases performance without large memory impact
|
||||
|
|
|
@ -63,9 +63,6 @@
|
|||
;;--- For MySql region storage (alternative)
|
||||
;StorageProvider = "OpenSim.Data.MySQL.dll:MySqlRegionData"
|
||||
|
||||
;; With hypergrid, perform distance check for the creation of a linked region
|
||||
; Check4096 = true
|
||||
|
||||
;; Directory for map tile images of remote regions
|
||||
; MapTileDirectory = "./maptiles"
|
||||
|
||||
|
|
|
@ -3011,6 +3011,8 @@
|
|||
<Files>
|
||||
<!-- SADLY the way this works means you need to keep adding these paths -->
|
||||
<Match path="Agent/TextureSender/Tests" pattern="*.cs" recurse="true"/>
|
||||
<Match path="Asset/Tests" pattern="*.cs" recurse="true"/>
|
||||
<Match path="Avatar/AvatarFactory/Tests" pattern="*.cs" recurse="true"/>
|
||||
<Match path="Avatar/Inventory/Archiver/Tests" pattern="*.cs" recurse="true"/>
|
||||
<Match path="Framework/InventoryAccess/Tests" pattern="*.cs" recurse="true"/>
|
||||
<Match path="World/Archiver/Tests" pattern="*.cs" recurse="true"/>
|
||||
|
@ -3055,6 +3057,7 @@
|
|||
<Reference name="OpenSim.Region.CoreModules"/>
|
||||
<Reference name="OpenSim.Region.OptionalModules"/>
|
||||
<Reference name="OpenSim.Region.Physics.Manager"/>
|
||||
<Reference name="OpenSim.Services.AvatarService"/>
|
||||
<Reference name="OpenSim.Services.Interfaces"/>
|
||||
|
||||
<!-- Unit tests -->
|
||||
|
@ -3078,6 +3081,7 @@
|
|||
<Files>
|
||||
<!-- SADLY the way this works means you need to keep adding these paths -->
|
||||
<Match path="Avatar/XmlRpcGroups/Tests" pattern="*.cs" recurse="true"/>
|
||||
<Match path="World/NPC/Tests" pattern="*.cs" recurse="true"/>
|
||||
</Files>
|
||||
</Project>
|
||||
|
||||
|
|
Loading…
Reference in New Issue