2011-05-07 00:06:55 +00:00
/ *
* 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.Text ;
using log4net ;
using Mono.Addins ;
using Nini.Config ;
using OpenMetaverse ;
using OpenSim.Framework ;
using OpenSim.Framework.Console ;
using OpenSim.Framework.Statistics ;
using OpenSim.Region.ClientStack.LindenUDP ;
using OpenSim.Region.Framework.Interfaces ;
using OpenSim.Region.Framework.Scenes ;
namespace OpenSim.Region.OptionalModules.Avatar.Appearance
{
/// <summary>
/// A module that just holds commands for inspecting avatar appearance.
/// </summary>
[Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "AppearanceInfoModule")]
public class AppearanceInfoModule : ISharedRegionModule
{
2011-12-06 16:07:24 +00:00
// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
2011-05-07 00:06:55 +00:00
protected Dictionary < UUID , Scene > m_scenes = new Dictionary < UUID , Scene > ( ) ;
2011-10-19 21:41:44 +00:00
protected IAvatarFactoryModule m_avatarFactory ;
2011-05-07 00:06:55 +00:00
public string Name { get { return "Appearance Information Module" ; } }
public Type ReplaceableInterface { get { return null ; } }
public void Initialise ( IConfigSource source )
{
// m_log.DebugFormat("[APPEARANCE INFO MODULE]: INITIALIZED MODULE");
}
public void PostInitialise ( )
{
// m_log.DebugFormat("[APPEARANCE INFO MODULE]: POST INITIALIZED MODULE");
}
public void Close ( )
{
// m_log.DebugFormat("[APPEARANCE INFO MODULE]: CLOSED MODULE");
}
public void AddRegion ( Scene scene )
{
// m_log.DebugFormat("[APPEARANCE INFO MODULE]: REGION {0} ADDED", scene.RegionInfo.RegionName);
}
public void RemoveRegion ( Scene scene )
{
// m_log.DebugFormat("[APPEARANCE INFO MODULE]: REGION {0} REMOVED", scene.RegionInfo.RegionName);
lock ( m_scenes )
m_scenes . Remove ( scene . RegionInfo . RegionID ) ;
}
public void RegionLoaded ( Scene scene )
{
// m_log.DebugFormat("[APPEARANCE INFO MODULE]: REGION {0} LOADED", scene.RegionInfo.RegionName);
lock ( m_scenes )
m_scenes [ scene . RegionInfo . RegionID ] = scene ;
scene . AddCommand (
this , "appearance show" ,
"appearance show" ,
2011-05-26 01:48:47 +00:00
"Show appearance information for each avatar in the simulator." ,
2011-12-06 18:03:16 +00:00
"Optionally, you can view just a particular avatar's appearance information"
+ "\nAt the moment this actually just checks that we have all the required baked textures. If not, then appearance is 'corrupt' and other avatars will continue to see a cloud." ,
2011-12-06 16:42:28 +00:00
HandleShowAppearanceCommand ) ;
2011-11-01 23:23:45 +00:00
scene . AddCommand (
this , "appearance send" ,
2011-12-06 16:42:28 +00:00
"appearance send [<first-name> <last-name>]" ,
2011-12-06 18:03:16 +00:00
"Send appearance data for each avatar in the simulator to other viewers." ,
"Optionally, you can specify that only a particular avatar's appearance data is sent." ,
2011-12-06 16:42:28 +00:00
HandleSendAppearanceCommand ) ;
2011-11-01 23:23:45 +00:00
}
2011-12-06 16:42:28 +00:00
private void HandleSendAppearanceCommand ( string module , string [ ] cmd )
2011-11-01 23:23:45 +00:00
{
2011-12-06 16:42:28 +00:00
if ( cmd . Length ! = 2 & & cmd . Length < 4 )
{
MainConsole . Instance . OutputFormat ( "Usage: appearance send [<first-name> <last-name>]" ) ;
return ;
}
bool targetNameSupplied = false ;
string optionalTargetFirstName = null ;
string optionalTargetLastName = null ;
if ( cmd . Length > = 4 )
{
targetNameSupplied = true ;
optionalTargetFirstName = cmd [ 2 ] ;
optionalTargetLastName = cmd [ 3 ] ;
}
2011-11-01 23:23:45 +00:00
lock ( m_scenes )
{
foreach ( Scene scene in m_scenes . Values )
{
2011-12-06 16:42:28 +00:00
if ( targetNameSupplied )
{
ScenePresence sp = scene . GetScenePresence ( optionalTargetFirstName , optionalTargetLastName ) ;
if ( sp ! = null & & ! sp . IsChildAgent )
2011-12-06 16:07:24 +00:00
{
MainConsole . Instance . OutputFormat (
"Sending appearance information for {0} to all other avatars in {1}" ,
sp . Name , scene . RegionInfo . RegionName ) ;
}
2011-12-06 16:42:28 +00:00
}
else
{
scene . ForEachRootScenePresence (
sp = >
{
MainConsole . Instance . OutputFormat (
"Sending appearance information for {0} to all other avatars in {1}" ,
sp . Name , scene . RegionInfo . RegionName ) ;
2011-12-06 18:03:16 +00:00
2011-12-06 16:42:28 +00:00
scene . AvatarFactory . SendAppearance ( sp . UUID ) ;
}
) ;
}
2011-11-01 23:23:45 +00:00
}
}
}
2011-05-07 00:06:55 +00:00
2011-12-06 16:42:28 +00:00
protected void HandleShowAppearanceCommand ( string module , string [ ] cmd )
2011-12-06 18:03:16 +00:00
{
if ( cmd . Length ! = 2 & & cmd . Length < 4 )
{
MainConsole . Instance . OutputFormat ( "Usage: appearance show [<first-name> <last-name>]" ) ;
return ;
}
bool targetNameSupplied = false ;
string optionalTargetFirstName = null ;
string optionalTargetLastName = null ;
if ( cmd . Length > = 4 )
{
targetNameSupplied = true ;
optionalTargetFirstName = cmd [ 2 ] ;
optionalTargetLastName = cmd [ 3 ] ;
}
2011-05-07 00:06:55 +00:00
lock ( m_scenes )
{
foreach ( Scene scene in m_scenes . Values )
{
2011-12-06 18:03:16 +00:00
if ( targetNameSupplied )
{
ScenePresence sp = scene . GetScenePresence ( optionalTargetFirstName , optionalTargetLastName ) ;
if ( sp ! = null & & ! sp . IsChildAgent )
2011-05-07 00:06:55 +00:00
{
2011-11-04 00:06:08 +00:00
bool bakedTextureValid = scene . AvatarFactory . ValidateBakedTextureCache ( sp ) ;
MainConsole . Instance . OutputFormat (
"{0} baked appearance texture is {1}" , sp . Name , bakedTextureValid ? "OK" : "corrupt" ) ;
2011-12-06 18:03:16 +00:00
}
}
else
{
scene . ForEachRootScenePresence (
sp = >
{
bool bakedTextureValid = scene . AvatarFactory . ValidateBakedTextureCache ( sp ) ;
MainConsole . Instance . OutputFormat (
"{0} baked appearance texture is {1}" , sp . Name , bakedTextureValid ? "OK" : "corrupt" ) ;
}
) ;
}
2011-05-07 00:06:55 +00:00
}
}
}
}
}