Merge branch 'master' into httptests
commit
82a26671b8
|
@ -3674,12 +3674,18 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
// vec, Rotation, thisAddSpeedModifier, Name);
|
||||
|
||||
// rotate from avatar coord space to world
|
||||
// for now all controls assume this is only a rotation around Z
|
||||
// if not all checks below need to be done before this rotation
|
||||
Vector3 direc = vec * Rotation;
|
||||
Quaternion rot = Rotation;
|
||||
if (!Flying && PresenceType != PresenceType.Npc)
|
||||
{
|
||||
// force rotation to be around Z only, if not flying
|
||||
// needed for mouselook
|
||||
rot.X = 0;
|
||||
rot.Y = 0;
|
||||
}
|
||||
|
||||
Vector3 direc = vec * rot;
|
||||
direc.Normalize();
|
||||
|
||||
// mouse look situation ?
|
||||
if ((vec.Z == 0f) && !Flying)
|
||||
direc.Z = 0f; // Prevent camera WASD up.
|
||||
|
||||
|
|
|
@ -2267,8 +2267,6 @@ namespace OpenSim.Region.PhysicsModule.ubOde
|
|||
|
||||
IntPtr HeightmapData = d.GeomHeightfieldDataCreate();
|
||||
|
||||
GC.Collect(1);
|
||||
|
||||
TerrainHeightFieldHeightsHandler = GCHandle.Alloc(_heightmap, GCHandleType.Pinned);
|
||||
|
||||
d.GeomHeightfieldDataBuildSingle(HeightmapData, TerrainHeightFieldHeightsHandler.AddrOfPinnedObject(), 0,
|
||||
|
|
|
@ -242,6 +242,18 @@ namespace OpenSim.Server.Base
|
|||
className = parts[2];
|
||||
}
|
||||
|
||||
// Handle extra string arguments in a more generic way
|
||||
if (dllName.Contains("@"))
|
||||
{
|
||||
string[] dllNameParts = dllName.Split(new char[] {'@'});
|
||||
dllName = dllNameParts[dllNameParts.Length - 1];
|
||||
List<Object> argList = new List<Object>(args);
|
||||
for (int i = 0 ; i < dllNameParts.Length - 1 ; ++i)
|
||||
argList.Add(dllNameParts[i]);
|
||||
|
||||
args = argList.ToArray();
|
||||
}
|
||||
|
||||
return LoadPlugin<T>(dllName, className, args);
|
||||
}
|
||||
|
||||
|
|
|
@ -63,6 +63,7 @@ namespace OpenSim.Services.Connectors
|
|||
/// In this case, -1 is default timeout (100 seconds), not infinite.
|
||||
/// </remarks>
|
||||
private int m_requestTimeoutSecs = -1;
|
||||
private string m_configName = "InventoryService";
|
||||
|
||||
private const double CACHE_EXPIRATION_SECONDS = 20.0;
|
||||
private static ExpiringCache<UUID, InventoryItemBase> m_ItemCache = new ExpiringCache<UUID,InventoryItemBase>();
|
||||
|
@ -76,6 +77,13 @@ namespace OpenSim.Services.Connectors
|
|||
m_ServerURI = serverURI.TrimEnd('/');
|
||||
}
|
||||
|
||||
public XInventoryServicesConnector(IConfigSource source, string configName)
|
||||
: base(source, configName)
|
||||
{
|
||||
m_configName = configName;
|
||||
Initialise(source);
|
||||
}
|
||||
|
||||
public XInventoryServicesConnector(IConfigSource source)
|
||||
: base(source, "InventoryService")
|
||||
{
|
||||
|
@ -84,10 +92,10 @@ namespace OpenSim.Services.Connectors
|
|||
|
||||
public virtual void Initialise(IConfigSource source)
|
||||
{
|
||||
IConfig config = source.Configs["InventoryService"];
|
||||
IConfig config = source.Configs[m_configName];
|
||||
if (config == null)
|
||||
{
|
||||
m_log.Error("[INVENTORY CONNECTOR]: InventoryService missing from OpenSim.ini");
|
||||
m_log.ErrorFormat("[INVENTORY CONNECTOR]: {0} missing from OpenSim.ini", m_configName);
|
||||
throw new Exception("Inventory connector init error");
|
||||
}
|
||||
|
||||
|
|
|
@ -668,6 +668,9 @@ namespace OpenSim.Services.FSAssetService
|
|||
|
||||
if (!m_DataConnector.Store(asset.Metadata, hash))
|
||||
{
|
||||
if (asset.Metadata.Type == -2)
|
||||
return asset.ID;
|
||||
|
||||
return UUID.Zero.ToString();
|
||||
}
|
||||
else
|
||||
|
|
|
@ -0,0 +1,240 @@
|
|||
/*
|
||||
* 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.Xml;
|
||||
|
||||
using Nini.Config;
|
||||
using log4net;
|
||||
using OpenMetaverse;
|
||||
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Framework.Serialization.External;
|
||||
using OpenSim.Server.Base;
|
||||
using OpenSim.Services.Interfaces;
|
||||
using OpenSim.Services.AssetService;
|
||||
|
||||
namespace OpenSim.Services.HypergridService
|
||||
{
|
||||
/// <summary>
|
||||
/// Hypergrid asset service. It serves the IAssetService interface,
|
||||
/// but implements it in ways that are appropriate for inter-grid
|
||||
/// asset exchanges.
|
||||
/// </summary>
|
||||
public class HGRemoteAssetService : IAssetService
|
||||
{
|
||||
private static readonly ILog m_log =
|
||||
LogManager.GetLogger(
|
||||
MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
private string m_HomeURL;
|
||||
private IUserAccountService m_UserAccountService;
|
||||
private IAssetService m_assetConnector;
|
||||
|
||||
private UserAccountCache m_Cache;
|
||||
|
||||
private AssetPermissions m_AssetPerms;
|
||||
|
||||
public HGRemoteAssetService(IConfigSource config, string configName)
|
||||
{
|
||||
m_log.Debug("[HGRemoteAsset Service]: Starting");
|
||||
IConfig assetConfig = config.Configs[configName];
|
||||
if (assetConfig == null)
|
||||
throw new Exception("No HGAssetService configuration");
|
||||
|
||||
Object[] args = new Object[] { config };
|
||||
|
||||
string assetConnectorDll = assetConfig.GetString("AssetConnector", String.Empty);
|
||||
if (assetConnectorDll == String.Empty)
|
||||
throw new Exception("Please specify AssetConnector in HGAssetService configuration");
|
||||
|
||||
m_assetConnector = ServerUtils.LoadPlugin<IAssetService>(assetConnectorDll, args);
|
||||
if (m_assetConnector == null)
|
||||
throw new Exception(String.Format("Unable to create AssetConnector from {0}", assetConnectorDll));
|
||||
|
||||
string userAccountsDll = assetConfig.GetString("UserAccountsService", string.Empty);
|
||||
if (userAccountsDll == string.Empty)
|
||||
throw new Exception("Please specify UserAccountsService in HGAssetService configuration");
|
||||
|
||||
m_UserAccountService = ServerUtils.LoadPlugin<IUserAccountService>(userAccountsDll, args);
|
||||
if (m_UserAccountService == null)
|
||||
throw new Exception(String.Format("Unable to create UserAccountService from {0}", userAccountsDll));
|
||||
|
||||
m_HomeURL = Util.GetConfigVarFromSections<string>(config, "HomeURI",
|
||||
new string[] { "Startup", "Hypergrid", configName }, string.Empty);
|
||||
if (m_HomeURL == string.Empty)
|
||||
throw new Exception("[HGAssetService] No HomeURI specified");
|
||||
|
||||
m_Cache = UserAccountCache.CreateUserAccountCache(m_UserAccountService);
|
||||
|
||||
// Permissions
|
||||
m_AssetPerms = new AssetPermissions(assetConfig);
|
||||
|
||||
}
|
||||
|
||||
#region IAssetService overrides
|
||||
public AssetBase Get(string id)
|
||||
{
|
||||
AssetBase asset = m_assetConnector.Get(id);
|
||||
|
||||
if (asset == null)
|
||||
return null;
|
||||
|
||||
if (!m_AssetPerms.AllowedExport(asset.Type))
|
||||
return null;
|
||||
|
||||
if (asset.Metadata.Type == (sbyte)AssetType.Object)
|
||||
asset.Data = AdjustIdentifiers(asset.Data);
|
||||
|
||||
AdjustIdentifiers(asset.Metadata);
|
||||
|
||||
return asset;
|
||||
}
|
||||
|
||||
public AssetMetadata GetMetadata(string id)
|
||||
{
|
||||
AssetMetadata meta = m_assetConnector.GetMetadata(id);
|
||||
|
||||
if (meta == null)
|
||||
return null;
|
||||
|
||||
AdjustIdentifiers(meta);
|
||||
|
||||
return meta;
|
||||
}
|
||||
|
||||
public byte[] GetData(string id)
|
||||
{
|
||||
AssetBase asset = Get(id);
|
||||
|
||||
if (asset == null)
|
||||
return null;
|
||||
|
||||
if (!m_AssetPerms.AllowedExport(asset.Type))
|
||||
return null;
|
||||
|
||||
// Deal with bug introduced in Oct. 20 (1eb3e6cc43e2a7b4053bc1185c7c88e22356c5e8)
|
||||
// Fix bad assets before sending them elsewhere
|
||||
if (asset.Type == (int)AssetType.Object && asset.Data != null)
|
||||
{
|
||||
string xml = ExternalRepresentationUtils.SanitizeXml(Utils.BytesToString(asset.Data));
|
||||
asset.Data = Utils.StringToBytes(xml);
|
||||
}
|
||||
|
||||
return asset.Data;
|
||||
}
|
||||
|
||||
// public delegate void AssetRetrieved(string id, Object sender, AssetBase asset);
|
||||
public virtual bool Get(string id, Object sender, AssetRetrieved handler)
|
||||
{
|
||||
return m_assetConnector.Get(id, sender, (i, s, asset) =>
|
||||
{
|
||||
if (asset != null)
|
||||
{
|
||||
if (!m_AssetPerms.AllowedExport(asset.Type))
|
||||
{
|
||||
asset = null;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (asset.Metadata.Type == (sbyte)AssetType.Object)
|
||||
asset.Data = AdjustIdentifiers(asset.Data);
|
||||
|
||||
AdjustIdentifiers(asset.Metadata);
|
||||
}
|
||||
}
|
||||
|
||||
handler(i, s, asset);
|
||||
});
|
||||
}
|
||||
|
||||
public string Store(AssetBase asset)
|
||||
{
|
||||
if (!m_AssetPerms.AllowedImport(asset.Type))
|
||||
return string.Empty;
|
||||
|
||||
// Deal with bug introduced in Oct. 20 (1eb3e6cc43e2a7b4053bc1185c7c88e22356c5e8)
|
||||
// Fix bad assets before storing on this server
|
||||
if (asset.Type == (int)AssetType.Object && asset.Data != null)
|
||||
{
|
||||
string xml = ExternalRepresentationUtils.SanitizeXml(Utils.BytesToString(asset.Data));
|
||||
asset.Data = Utils.StringToBytes(xml);
|
||||
}
|
||||
|
||||
return m_assetConnector.Store(asset);
|
||||
}
|
||||
|
||||
public bool Delete(string id)
|
||||
{
|
||||
// NOGO
|
||||
return false;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
protected void AdjustIdentifiers(AssetMetadata meta)
|
||||
{
|
||||
if (meta == null || m_Cache == null)
|
||||
return;
|
||||
|
||||
UserAccount creator = m_Cache.GetUser(meta.CreatorID);
|
||||
if (creator != null)
|
||||
meta.CreatorID = meta.CreatorID + ";" + m_HomeURL + "/" + creator.FirstName + " " + creator.LastName;
|
||||
}
|
||||
|
||||
// Only for Object
|
||||
protected byte[] AdjustIdentifiers(byte[] data)
|
||||
{
|
||||
string xml = Utils.BytesToString(data);
|
||||
|
||||
// Deal with bug introduced in Oct. 20 (1eb3e6cc43e2a7b4053bc1185c7c88e22356c5e8)
|
||||
// Fix bad assets before sending them elsewhere
|
||||
xml = ExternalRepresentationUtils.SanitizeXml(xml);
|
||||
|
||||
return Utils.StringToBytes(ExternalRepresentationUtils.RewriteSOP(xml, "HGAssetService", m_HomeURL, m_Cache, UUID.Zero));
|
||||
}
|
||||
|
||||
public AssetBase GetCached(string id)
|
||||
{
|
||||
return Get(id);
|
||||
}
|
||||
|
||||
public bool[] AssetsExist(string[] ids)
|
||||
{
|
||||
return m_assetConnector.AssetsExist(ids);
|
||||
}
|
||||
|
||||
public bool UpdateContent(string id, byte[] data)
|
||||
{
|
||||
// SO not happening!!
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -180,9 +180,14 @@ namespace OpenSim.Services.LLLoginService
|
|||
string hgInvServicePlugin = m_LoginServerConfig.GetString("HGInventoryServicePlugin", String.Empty);
|
||||
if (hgInvServicePlugin != string.Empty)
|
||||
{
|
||||
// TODO: Remove HGInventoryServiceConstructorArg after 0.9 release
|
||||
string hgInvServiceArg = m_LoginServerConfig.GetString("HGInventoryServiceConstructorArg", String.Empty);
|
||||
Object[] args2 = new Object[] { config, hgInvServiceArg };
|
||||
m_HGInventoryService = ServerUtils.LoadPlugin<IInventoryService>(hgInvServicePlugin, args2);
|
||||
if (hgInvServiceArg != String.Empty)
|
||||
{
|
||||
m_log.Warn("[LLOGIN SERVICE]: You are using HGInventoryServiceConstructorArg, which is deprecated. See example file for correct syntax.");
|
||||
hgInvServicePlugin = hgInvServiceArg + "@" + hgInvServicePlugin;
|
||||
}
|
||||
m_HGInventoryService = ServerUtils.LoadPlugin<IInventoryService>(hgInvServicePlugin, args);
|
||||
}
|
||||
|
||||
//
|
||||
|
|
Binary file not shown.
Binary file not shown.
29284
bin/OpenMetaverse.XML
29284
bin/OpenMetaverse.XML
File diff suppressed because it is too large
Load Diff
Binary file not shown.
|
@ -252,8 +252,7 @@
|
|||
<summary>Link to a location in world</summary>
|
||||
</member>
|
||||
<member name="F:OpenMetaverse.AssetType.Clothing">
|
||||
<summary>Collection of textures and parameters that can be
|
||||
worn by an avatar</summary>
|
||||
<summary>Collection of textures and parameters that can be worn by an avatar</summary>
|
||||
</member>
|
||||
<member name="F:OpenMetaverse.AssetType.Object">
|
||||
<summary>Primitive that can contain textures, sounds,
|
||||
|
@ -263,10 +262,7 @@
|
|||
<summary>Notecard asset</summary>
|
||||
</member>
|
||||
<member name="F:OpenMetaverse.AssetType.Folder">
|
||||
<summary>Holds a collection of inventory items</summary>
|
||||
</member>
|
||||
<member name="F:OpenMetaverse.AssetType.RootFolder">
|
||||
<summary>Root inventory folder</summary>
|
||||
<summary>Holds a collection of inventory items. "Category" in the Linden viewer</summary>
|
||||
</member>
|
||||
<member name="F:OpenMetaverse.AssetType.LSLText">
|
||||
<summary>Linden scripting language script</summary>
|
||||
|
@ -278,17 +274,7 @@
|
|||
<summary>Uncompressed TGA texture</summary>
|
||||
</member>
|
||||
<member name="F:OpenMetaverse.AssetType.Bodypart">
|
||||
<summary>Collection of textures and shape parameters that can
|
||||
be worn</summary>
|
||||
</member>
|
||||
<member name="F:OpenMetaverse.AssetType.TrashFolder">
|
||||
<summary>Trash folder</summary>
|
||||
</member>
|
||||
<member name="F:OpenMetaverse.AssetType.SnapshotFolder">
|
||||
<summary>Snapshot folder</summary>
|
||||
</member>
|
||||
<member name="F:OpenMetaverse.AssetType.LostAndFoundFolder">
|
||||
<summary>Lost and found folder</summary>
|
||||
<summary>Collection of textures and shape parameters that can be worn</summary>
|
||||
</member>
|
||||
<member name="F:OpenMetaverse.AssetType.SoundWAV">
|
||||
<summary>Uncompressed sound</summary>
|
||||
|
@ -310,44 +296,109 @@
|
|||
<member name="F:OpenMetaverse.AssetType.Simstate">
|
||||
<summary>Simstate file</summary>
|
||||
</member>
|
||||
<member name="F:OpenMetaverse.AssetType.FavoriteFolder">
|
||||
<summary>Contains landmarks for favorites</summary>
|
||||
</member>
|
||||
<member name="F:OpenMetaverse.AssetType.Link">
|
||||
<summary>Asset is a link to another inventory item</summary>
|
||||
</member>
|
||||
<member name="F:OpenMetaverse.AssetType.LinkFolder">
|
||||
<summary>Asset is a link to another inventory folder</summary>
|
||||
</member>
|
||||
<member name="F:OpenMetaverse.AssetType.EnsembleStart">
|
||||
<summary>Beginning of the range reserved for ensembles</summary>
|
||||
</member>
|
||||
<member name="F:OpenMetaverse.AssetType.EnsembleEnd">
|
||||
<summary>End of the range reserved for ensembles</summary>
|
||||
</member>
|
||||
<member name="F:OpenMetaverse.AssetType.CurrentOutfitFolder">
|
||||
<summary>Folder containing inventory links to wearables and attachments
|
||||
that are part of the current outfit</summary>
|
||||
</member>
|
||||
<member name="F:OpenMetaverse.AssetType.OutfitFolder">
|
||||
<summary>Folder containing inventory items or links to
|
||||
inventory items of wearables and attachments
|
||||
together make a full outfit</summary>
|
||||
</member>
|
||||
<member name="F:OpenMetaverse.AssetType.MyOutfitsFolder">
|
||||
<summary>Root folder for the folders of type OutfitFolder</summary>
|
||||
<member name="F:OpenMetaverse.AssetType.MarketplaceFolder">
|
||||
<summary>Marketplace Folder. Same as an Category but different display methods.</summary>
|
||||
</member>
|
||||
<member name="F:OpenMetaverse.AssetType.Mesh">
|
||||
<summary>Linden mesh format</summary>
|
||||
</member>
|
||||
<member name="F:OpenMetaverse.AssetType.Inbox">
|
||||
<member name="T:OpenMetaverse.FolderType">
|
||||
<summary>
|
||||
The different types of folder.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="F:OpenMetaverse.FolderType.None">
|
||||
<summary>None folder type</summary>
|
||||
</member>
|
||||
<member name="F:OpenMetaverse.FolderType.Texture">
|
||||
<summary>Texture folder type</summary>
|
||||
</member>
|
||||
<member name="F:OpenMetaverse.FolderType.Sound">
|
||||
<summary>Sound folder type</summary>
|
||||
</member>
|
||||
<member name="F:OpenMetaverse.FolderType.CallingCard">
|
||||
<summary>Calling card folder type</summary>
|
||||
</member>
|
||||
<member name="F:OpenMetaverse.FolderType.Landmark">
|
||||
<summary>Landmark folder type</summary>
|
||||
</member>
|
||||
<member name="F:OpenMetaverse.FolderType.Clothing">
|
||||
<summary>Clothing folder type</summary>
|
||||
</member>
|
||||
<member name="F:OpenMetaverse.FolderType.Object">
|
||||
<summary>Object folder type</summary>
|
||||
</member>
|
||||
<member name="F:OpenMetaverse.FolderType.Notecard">
|
||||
<summary>Notecard folder type</summary>
|
||||
</member>
|
||||
<member name="F:OpenMetaverse.FolderType.Root">
|
||||
<summary>The root folder type</summary>
|
||||
</member>
|
||||
<member name="F:OpenMetaverse.FolderType.LSLText">
|
||||
<summary>LSLText folder</summary>
|
||||
</member>
|
||||
<member name="F:OpenMetaverse.FolderType.BodyPart">
|
||||
<summary>Bodyparts folder</summary>
|
||||
</member>
|
||||
<member name="F:OpenMetaverse.FolderType.Trash">
|
||||
<summary>Trash folder</summary>
|
||||
</member>
|
||||
<member name="F:OpenMetaverse.FolderType.Snapshot">
|
||||
<summary>Snapshot folder</summary>
|
||||
</member>
|
||||
<member name="F:OpenMetaverse.FolderType.LostAndFound">
|
||||
<summary>Lost And Found folder</summary>
|
||||
</member>
|
||||
<member name="F:OpenMetaverse.FolderType.Animation">
|
||||
<summary>Animation folder</summary>
|
||||
</member>
|
||||
<member name="F:OpenMetaverse.FolderType.Gesture">
|
||||
<summary>Gesture folder</summary>
|
||||
</member>
|
||||
<member name="F:OpenMetaverse.FolderType.Favorites">
|
||||
<summary>Favorites folder</summary>
|
||||
</member>
|
||||
<member name="F:OpenMetaverse.FolderType.EnsembleStart">
|
||||
<summary>Ensemble beginning range</summary>
|
||||
</member>
|
||||
<member name="F:OpenMetaverse.FolderType.EnsembleEnd">
|
||||
<summary>Ensemble ending range</summary>
|
||||
</member>
|
||||
<member name="F:OpenMetaverse.FolderType.CurrentOutfit">
|
||||
<summary>Current outfit folder</summary>
|
||||
</member>
|
||||
<member name="F:OpenMetaverse.FolderType.Outfit">
|
||||
<summary>Outfit folder</summary>
|
||||
</member>
|
||||
<member name="F:OpenMetaverse.FolderType.MyOutfits">
|
||||
<summary>My outfits folder</summary>
|
||||
</member>
|
||||
<member name="F:OpenMetaverse.FolderType.Mesh">
|
||||
<summary>Mesh folder</summary>
|
||||
</member>
|
||||
<member name="F:OpenMetaverse.FolderType.Inbox">
|
||||
<summary>Marketplace direct delivery inbox ("Received Items")</summary>
|
||||
</member>
|
||||
<member name="F:OpenMetaverse.AssetType.Outbox">
|
||||
<member name="F:OpenMetaverse.FolderType.Outbox">
|
||||
<summary>Marketplace direct delivery outbox</summary>
|
||||
</member>
|
||||
<member name="F:OpenMetaverse.AssetType.BasicRoot">
|
||||
<summary></summary>
|
||||
<member name="F:OpenMetaverse.FolderType.BasicRoot">
|
||||
<summary>Basic root folder</summary>
|
||||
</member>
|
||||
<member name="F:OpenMetaverse.FolderType.MarketplaceListings">
|
||||
<summary>Marketplace listings folder</summary>
|
||||
</member>
|
||||
<member name="F:OpenMetaverse.FolderType.MarkplaceStock">
|
||||
<summary>Marketplace stock folder</summary>
|
||||
</member>
|
||||
<member name="F:OpenMetaverse.FolderType.Suitcase">
|
||||
<summary>Hypergrid Suitcase folder</summary>
|
||||
</member>
|
||||
<member name="T:OpenMetaverse.InventoryType">
|
||||
<summary>
|
||||
|
@ -1071,38 +1122,6 @@
|
|||
multiple writers
|
||||
</summary>
|
||||
</member>
|
||||
<member name="F:OpenMetaverse.LocklessQueue`1.head">
|
||||
<summary>Queue head</summary>
|
||||
</member>
|
||||
<member name="F:OpenMetaverse.LocklessQueue`1.tail">
|
||||
<summary>Queue tail</summary>
|
||||
</member>
|
||||
<member name="F:OpenMetaverse.LocklessQueue`1.count">
|
||||
<summary>Queue item count</summary>
|
||||
</member>
|
||||
<member name="M:OpenMetaverse.LocklessQueue`1.#ctor">
|
||||
<summary>
|
||||
Constructor
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:OpenMetaverse.LocklessQueue`1.Enqueue(`0)">
|
||||
<summary>
|
||||
Enqueue an item
|
||||
</summary>
|
||||
<param name="item">Item to enqeue</param>
|
||||
</member>
|
||||
<member name="M:OpenMetaverse.LocklessQueue`1.TryDequeue(`0@)">
|
||||
<summary>
|
||||
Try to dequeue an item
|
||||
</summary>
|
||||
<param name="item">Dequeued item if the dequeue was successful</param>
|
||||
<returns>True if an item was successfully deqeued, otherwise false</returns>
|
||||
</member>
|
||||
<member name="P:OpenMetaverse.LocklessQueue`1.Count">
|
||||
<summary>Gets the current number of items in the queue. Since this
|
||||
is a lockless collection this value should be treated as a close
|
||||
estimate</summary>
|
||||
</member>
|
||||
<member name="T:OpenMetaverse.LocklessQueue`1.SingleLinkNode">
|
||||
<summary>
|
||||
Provides a node container for data in a singly linked list
|
||||
|
@ -1124,6 +1143,38 @@
|
|||
Constructor
|
||||
</summary>
|
||||
</member>
|
||||
<member name="F:OpenMetaverse.LocklessQueue`1.head">
|
||||
<summary>Queue head</summary>
|
||||
</member>
|
||||
<member name="F:OpenMetaverse.LocklessQueue`1.tail">
|
||||
<summary>Queue tail</summary>
|
||||
</member>
|
||||
<member name="F:OpenMetaverse.LocklessQueue`1.count">
|
||||
<summary>Queue item count</summary>
|
||||
</member>
|
||||
<member name="P:OpenMetaverse.LocklessQueue`1.Count">
|
||||
<summary>Gets the current number of items in the queue. Since this
|
||||
is a lockless collection this value should be treated as a close
|
||||
estimate</summary>
|
||||
</member>
|
||||
<member name="M:OpenMetaverse.LocklessQueue`1.#ctor">
|
||||
<summary>
|
||||
Constructor
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:OpenMetaverse.LocklessQueue`1.Enqueue(`0)">
|
||||
<summary>
|
||||
Enqueue an item
|
||||
</summary>
|
||||
<param name="item">Item to enqeue</param>
|
||||
</member>
|
||||
<member name="M:OpenMetaverse.LocklessQueue`1.TryDequeue(`0@)">
|
||||
<summary>
|
||||
Try to dequeue an item
|
||||
</summary>
|
||||
<param name="item">Dequeued item if the dequeue was successful</param>
|
||||
<returns>True if an item was successfully deqeued, otherwise false</returns>
|
||||
</member>
|
||||
<member name="M:OpenMetaverse.Matrix4.GetEulerAngles(System.Single@,System.Single@,System.Single@)">
|
||||
<summary>
|
||||
Convert this matrix to euler rotations
|
||||
|
@ -1334,6 +1385,37 @@
|
|||
<member name="F:OpenMetaverse.TokenBucket.lastDrip">
|
||||
<summary>Time of the last drip, in system ticks</summary>
|
||||
</member>
|
||||
<member name="P:OpenMetaverse.TokenBucket.Parent">
|
||||
<summary>
|
||||
The parent bucket of this bucket, or null if this bucket has no
|
||||
parent. The parent bucket will limit the aggregate bandwidth of all
|
||||
of its children buckets
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:OpenMetaverse.TokenBucket.MaxBurst">
|
||||
<summary>
|
||||
Maximum burst rate in bytes per second. This is the maximum number
|
||||
of tokens that can accumulate in the bucket at any one time
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:OpenMetaverse.TokenBucket.DripRate">
|
||||
<summary>
|
||||
The speed limit of this bucket in bytes per second. This is the
|
||||
number of tokens that are added to the bucket per second
|
||||
</summary>
|
||||
<remarks>Tokens are added to the bucket any time
|
||||
<seealso cref="M:OpenMetaverse.TokenBucket.RemoveTokens(System.Int32)"/> is called, at the granularity of
|
||||
the system tick interval (typically around 15-22ms)</remarks>
|
||||
</member>
|
||||
<member name="P:OpenMetaverse.TokenBucket.Content">
|
||||
<summary>
|
||||
The number of bytes that can be sent at this moment. This is the
|
||||
current number of tokens in the bucket
|
||||
<remarks>If this bucket has a parent bucket that does not have
|
||||
enough tokens for a request, <seealso cref="M:OpenMetaverse.TokenBucket.RemoveTokens(System.Int32)"/> will
|
||||
return false regardless of the content of this bucket</remarks>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:OpenMetaverse.TokenBucket.#ctor(OpenMetaverse.TokenBucket,System.Int32,System.Int32)">
|
||||
<summary>
|
||||
Default constructor
|
||||
|
@ -1371,36 +1453,36 @@
|
|||
</summary>
|
||||
<returns>True if tokens were added to the bucket, otherwise false</returns>
|
||||
</member>
|
||||
<member name="P:OpenMetaverse.TokenBucket.Parent">
|
||||
<member name="T:OpenMetaverse.Utils.Platform">
|
||||
<summary>
|
||||
The parent bucket of this bucket, or null if this bucket has no
|
||||
parent. The parent bucket will limit the aggregate bandwidth of all
|
||||
of its children buckets
|
||||
Operating system
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:OpenMetaverse.TokenBucket.MaxBurst">
|
||||
<member name="F:OpenMetaverse.Utils.Platform.Unknown">
|
||||
<summary>Unknown</summary>
|
||||
</member>
|
||||
<member name="F:OpenMetaverse.Utils.Platform.Windows">
|
||||
<summary>Microsoft Windows</summary>
|
||||
</member>
|
||||
<member name="F:OpenMetaverse.Utils.Platform.WindowsCE">
|
||||
<summary>Microsoft Windows CE</summary>
|
||||
</member>
|
||||
<member name="F:OpenMetaverse.Utils.Platform.Linux">
|
||||
<summary>Linux</summary>
|
||||
</member>
|
||||
<member name="F:OpenMetaverse.Utils.Platform.OSX">
|
||||
<summary>Apple OSX</summary>
|
||||
</member>
|
||||
<member name="T:OpenMetaverse.Utils.Runtime">
|
||||
<summary>
|
||||
Maximum burst rate in bytes per second. This is the maximum number
|
||||
of tokens that can accumulate in the bucket at any one time
|
||||
Runtime platform
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:OpenMetaverse.TokenBucket.DripRate">
|
||||
<summary>
|
||||
The speed limit of this bucket in bytes per second. This is the
|
||||
number of tokens that are added to the bucket per second
|
||||
</summary>
|
||||
<remarks>Tokens are added to the bucket any time
|
||||
<seealso cref="M:OpenMetaverse.TokenBucket.RemoveTokens(System.Int32)"/> is called, at the granularity of
|
||||
the system tick interval (typically around 15-22ms)</remarks>
|
||||
<member name="F:OpenMetaverse.Utils.Runtime.Windows">
|
||||
<summary>.NET runtime</summary>
|
||||
</member>
|
||||
<member name="P:OpenMetaverse.TokenBucket.Content">
|
||||
<summary>
|
||||
The number of bytes that can be sent at this moment. This is the
|
||||
current number of tokens in the bucket
|
||||
<remarks>If this bucket has a parent bucket that does not have
|
||||
enough tokens for a request, <seealso cref="M:OpenMetaverse.TokenBucket.RemoveTokens(System.Int32)"/> will
|
||||
return false regardless of the content of this bucket</remarks>
|
||||
</summary>
|
||||
<member name="F:OpenMetaverse.Utils.Runtime.Mono">
|
||||
<summary>Mono runtime: http://www.mono-project.com/</summary>
|
||||
</member>
|
||||
<member name="F:OpenMetaverse.Utils.DEG_TO_RAD">
|
||||
<summary>Used for converting degrees to radians</summary>
|
||||
|
@ -1842,6 +1924,20 @@
|
|||
<param name="type">A string containing the AssetType name</param>
|
||||
<returns>The AssetType which matches the string name, or AssetType.Unknown if no match was found</returns>
|
||||
</member>
|
||||
<member name="M:OpenMetaverse.Utils.FolderTypeToString(OpenMetaverse.FolderType)">
|
||||
<summary>
|
||||
Takes a FolderType and returns the string representation
|
||||
</summary>
|
||||
<param name="type">The source <seealso cref="T:OpenMetaverse.FolderType"/></param>
|
||||
<returns>The string version of the FolderType</returns>
|
||||
</member>
|
||||
<member name="M:OpenMetaverse.Utils.StringToFolderType(System.String)">
|
||||
<summary>
|
||||
Translate a string name of an FolderType into the proper Type
|
||||
</summary>
|
||||
<param name="type">A string containing the FolderType name</param>
|
||||
<returns>The FolderType which matches the string name, or FolderType. None if no match was found</returns>
|
||||
</member>
|
||||
<member name="M:OpenMetaverse.Utils.InventoryTypeToString(OpenMetaverse.InventoryType)">
|
||||
<summary>
|
||||
Convert an InventoryType to a string
|
||||
|
@ -1972,37 +2068,6 @@
|
|||
<returns>Converted IP address object, or null if the conversion
|
||||
failed</returns>
|
||||
</member>
|
||||
<member name="T:OpenMetaverse.Utils.Platform">
|
||||
<summary>
|
||||
Operating system
|
||||
</summary>
|
||||
</member>
|
||||
<member name="F:OpenMetaverse.Utils.Platform.Unknown">
|
||||
<summary>Unknown</summary>
|
||||
</member>
|
||||
<member name="F:OpenMetaverse.Utils.Platform.Windows">
|
||||
<summary>Microsoft Windows</summary>
|
||||
</member>
|
||||
<member name="F:OpenMetaverse.Utils.Platform.WindowsCE">
|
||||
<summary>Microsoft Windows CE</summary>
|
||||
</member>
|
||||
<member name="F:OpenMetaverse.Utils.Platform.Linux">
|
||||
<summary>Linux</summary>
|
||||
</member>
|
||||
<member name="F:OpenMetaverse.Utils.Platform.OSX">
|
||||
<summary>Apple OSX</summary>
|
||||
</member>
|
||||
<member name="T:OpenMetaverse.Utils.Runtime">
|
||||
<summary>
|
||||
Runtime platform
|
||||
</summary>
|
||||
</member>
|
||||
<member name="F:OpenMetaverse.Utils.Runtime.Windows">
|
||||
<summary>.NET runtime</summary>
|
||||
</member>
|
||||
<member name="F:OpenMetaverse.Utils.Runtime.Mono">
|
||||
<summary>Mono runtime: http://www.mono-project.com/</summary>
|
||||
</member>
|
||||
<member name="T:OpenMetaverse.UUID">
|
||||
<summary>
|
||||
A 128-bit Universally Unique Identifier, used throughout the Second
|
||||
|
|
Binary file not shown.
|
@ -496,8 +496,9 @@
|
|||
UserAgentService = "OpenSim.Services.HypergridService.dll:UserAgentService"
|
||||
|
||||
; This inventory service will be used to initialize the user's inventory
|
||||
HGInventoryServicePlugin = "OpenSim.Services.HypergridService.dll:HGSuitcaseInventoryService"
|
||||
HGInventoryServiceConstructorArg = "HGInventoryService"
|
||||
HGInventoryServicePlugin = "HGInventoryService@OpenSim.Services.HypergridService.dll:HGSuitcaseInventoryService"
|
||||
; NOTE: HGInventoryServiceConstructorArg is deprecated. For now it will work, but see above
|
||||
; for the correct method if passing additional arguments.
|
||||
;; end hypergrid
|
||||
|
||||
; Ask co-operative viewers to use a different currency name
|
||||
|
|
|
@ -0,0 +1,81 @@
|
|||
<?xml version="1.0" encoding="US-ASCII" standalone="yes"?>
|
||||
<linden_skeleton version="1.0" num_bones="53" num_collision_volumes="26">
|
||||
<bone name="mPelvis" pos="0.000 0.000 1.067" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.000000 0.000000 1.067015">
|
||||
<collision_volume name="PELVIS" pos = "-0.01 0 -0.02" rot="0.000000 8.00000 0.000000" scale="0.12 0.16 0.17"/>
|
||||
<collision_volume name="BUTT" pos = "-0.06 0 -0.1" rot="0.000000 0.00000 0.000000" scale="0.1 0.1 0.1"/>
|
||||
<bone name="mTorso" pos="0.000 0.000 0.084" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.000000 0.000000 0.084073">
|
||||
<collision_volume name="BELLY" pos = "0.028 0 0.04" rot="0.000000 8.00000 0.000000" scale="0.09 0.13 0.15"/>
|
||||
<collision_volume name="LOWER_BACK" pos = "0.0 0.0 0.023" rot="0.000000 0.00000 0.000000" scale="0.09 0.13 0.15"/>
|
||||
<collision_volume name="LEFT_HANDLE" pos = "0.0 0.10 0.058" rot="0.000000 0.00000 0.000000" scale="0.05 0.05 0.05"/>
|
||||
<collision_volume name="RIGHT_HANDLE" pos = "0.0 -0.10 0.058" rot="0.000000 0.00000 0.000000" scale="0.05 0.05 0.05"/>
|
||||
<bone name="mChest" pos="-0.015 0.000 0.205" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="-0.015368 0.000000 0.204877">
|
||||
<collision_volume name="CHEST" pos = "0.028 0 0.07" rot="0.000000 -10.00000 0.000000" scale="0.11 0.15 0.2"/>
|
||||
<collision_volume name="UPPER_BACK" pos = "0.0 0.0 0.017" rot="0.000000 0.00000 0.000000" scale="0.09 0.13 0.15"/>
|
||||
<collision_volume name="LEFT_PEC" pos = "0.119 0.082 0.042" rot="0.000000 4.29000 0.000000" scale="0.05 0.05 0.05"/>
|
||||
<collision_volume name="RIGHT_PEC" pos = "0.119 -0.082 0.042" rot="0.000000 4.29000 0.000000" scale="0.05 0.05 0.05"/>
|
||||
<bone name="mNeck" pos="-0.010 0.000 0.251" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="-0.009507 0.000000 0.251108">
|
||||
<collision_volume name="NECK" pos = "0.0 0 0.02" rot="0.000000 0.000000 0.000000" scale="0.05 0.06 0.08"/>
|
||||
<bone name="mHead" pos="0.000 -0.000 0.076" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.000000 -0.000000 0.075630">
|
||||
<collision_volume name="HEAD" pos = "0.02 0 0.07" rot="0.000000 0.000000 0.000000" scale="0.11 0.09 0.12"/>
|
||||
<bone name="mSkull" pos="0.000 0.000 0.079" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.000000 0.000000 0.079000">
|
||||
</bone>
|
||||
<bone name="mEyeRight" pos="0.098 -0.036 0.079" rot="0.000000 0.000000 -0.000000" scale="1.000 1.000 1.000" pivot="0.098466 -0.036000 0.079000">
|
||||
</bone>
|
||||
<bone name="mEyeLeft" pos="0.098 0.036 0.079" rot="0.000000 -0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.098461 0.036000 0.079000">
|
||||
</bone>
|
||||
</bone>
|
||||
</bone>
|
||||
<bone name="mCollarLeft" pos="-0.021 0.085 0.165" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="-0.020927 0.084665 0.165396">
|
||||
<collision_volume name="L_CLAVICLE" pos = "0.02 0 0.02" rot="0.000000 0.00000 0.000000" scale="0.07 0.14 0.05"/>
|
||||
<bone name="mShoulderLeft" pos="0.000 0.079 -0.000" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.000000 0.079000 -0.000000">
|
||||
<collision_volume name="L_UPPER_ARM" pos = "0.0 0.12 0.01" rot="-5.000000 0.00000 0.000000" scale="0.05 0.17 0.05"/>
|
||||
<bone name="mElbowLeft" pos="0.000 0.248 0.000" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.000000 0.248000 0.000000">
|
||||
<collision_volume name="L_LOWER_ARM" pos = "0.0 0.1 0.0" rot="-3.000000 0.00000 0.000000" scale="0.04 0.14 0.04"/>
|
||||
<bone name="mWristLeft" pos="-0.000 0.205 0.000" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="-0.000000 0.204846 0.000000">
|
||||
<collision_volume name="L_HAND" pos = "0.01 0.05 0.0" rot="-3.000000 0.00000 -10.000000" scale="0.05 0.08 0.03"/>
|
||||
</bone>
|
||||
</bone>
|
||||
</bone>
|
||||
</bone>
|
||||
<bone name="mCollarRight" pos="-0.021 -0.085 0.165" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="-0.020927 -0.085000 0.165396">
|
||||
<collision_volume name="R_CLAVICLE" pos = "0.02 0 0.02" rot="0.000000 0.00000 0.000000" scale="0.07 0.14 0.05"/>
|
||||
<bone name="mShoulderRight" pos="0.000 -0.079 -0.000" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.000000 -0.079418 -0.000000">
|
||||
<collision_volume name="R_UPPER_ARM" pos = "0.0 -0.12 0.01" rot="5.000000 0.00000 0.000000" scale="0.05 0.17 0.05"/>
|
||||
<bone name="mElbowRight" pos="0.000 -0.248 -0.000" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.000000 -0.248000 -0.000000">
|
||||
<collision_volume name="R_LOWER_ARM" pos = "0.0 -0.1 0.0" rot="3.000000 0.00000 0.000000" scale="0.04 0.14 0.04"/>
|
||||
<bone name="mWristRight" pos="0.000 -0.205 -0.000" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="-0.000000 -0.205000 -0.000000">
|
||||
<collision_volume name="R_HAND" pos = "0.01 -0.05 0.0" rot="3.000000 0.00000 10.000000" scale="0.05 0.08 0.03"/>
|
||||
</bone>
|
||||
</bone>
|
||||
</bone>
|
||||
</bone>
|
||||
</bone>
|
||||
</bone>
|
||||
<bone name="mHipRight" pos="0.034 -0.129 -0.041" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.033620 -0.128806 -0.041086">
|
||||
<collision_volume name="R_UPPER_LEG" pos = "-0.02 0.05 -0.22" rot="0.000000 0.00000 0.000000" scale="0.09 0.09 0.32"/>
|
||||
<bone name="mKneeRight" pos="-0.001 0.049 -0.491" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="-0.000780 0.048635 -0.490922">
|
||||
<collision_volume name="R_LOWER_LEG" pos = "-0.02 0.0 -0.2" rot="0.000000 0.00000 0.000000" scale="0.06 0.06 0.25"/>
|
||||
<bone name="mAnkleRight" pos="-0.029 0.000 -0.468" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="-0.028869 0.000000 -0.468494">
|
||||
<collision_volume name="R_FOOT" pos = "0.077 0.0 -0.041" rot="0.000000 10.00000 0.000000" scale="0.13 0.05 0.05"/>
|
||||
<bone name="mFootRight" pos="0.112 -0.000 -0.061" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.111956 -0.000000 -0.060637">
|
||||
<bone name="mToeRight" pos="0.109 0.000 0.000" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.105399 -0.010408 -0.000104">
|
||||
</bone>
|
||||
</bone>
|
||||
</bone>
|
||||
</bone>
|
||||
</bone>
|
||||
<bone name="mHipLeft" pos="0.034 0.127 -0.041" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.033757 0.126765 -0.040998">
|
||||
<collision_volume name="L_UPPER_LEG" pos = "-0.02 -0.05 -0.22" rot="0.000000 0.00000 0.000000" scale="0.09 0.09 0.32"/>
|
||||
<bone name="mKneeLeft" pos="-0.001 -0.046 -0.491" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="-0.000887 -0.045568 -0.491053">
|
||||
<collision_volume name="L_LOWER_LEG" pos = "-0.02 0.0 -0.2" rot="0.000000 0.00000 0.000000" scale="0.06 0.06 0.25"/>
|
||||
<bone name="mAnkleLeft" pos="-0.029 0.001 -0.468" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="-0.028887 0.001378 -0.468449">
|
||||
<collision_volume name="L_FOOT" pos = "0.077 0.0 -0.041" rot="0.000000 10.00000 0.000000" scale="0.13 0.05 0.05"/>
|
||||
<bone name="mFootLeft" pos="0.112 -0.000 -0.061" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.111956 -0.000000 -0.060620">
|
||||
<bone name="mToeLeft" pos="0.109 0.000 0.000" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.105387 0.008270 0.000871">
|
||||
</bone>
|
||||
</bone>
|
||||
</bone>
|
||||
</bone>
|
||||
</bone>
|
||||
</bone>
|
||||
</linden_skeleton>
|
Loading…
Reference in New Issue