Merge branch 'master' into careminster-presence-refactor

avinationmerge
Melanie 2010-10-29 20:40:48 +01:00
commit 9331898c32
32 changed files with 1084 additions and 911 deletions

View File

@ -1590,12 +1590,9 @@ namespace OpenSim.ApplicationPlugins.RemoteController
{ {
m_log.DebugFormat("[RADMIN] Initializing inventory for {0} from {1}", destination, source); m_log.DebugFormat("[RADMIN] Initializing inventory for {0} from {1}", destination, source);
Scene scene = m_application.SceneManager.CurrentOrFirstScene; Scene scene = m_application.SceneManager.CurrentOrFirstScene;
AvatarAppearance avatarAppearance = null;
AvatarData avatar = scene.AvatarService.GetAvatar(source);
if (avatar != null)
avatarAppearance = avatar.ToAvatarAppearance(source);
// If the model has no associated appearance we're done. // If the model has no associated appearance we're done.
AvatarAppearance avatarAppearance = scene.AvatarService.GetAppearance(source);
if (avatarAppearance == null) if (avatarAppearance == null)
return; return;
@ -1609,8 +1606,7 @@ namespace OpenSim.ApplicationPlugins.RemoteController
{ {
CopyWearablesAndAttachments(destination, source, avatarAppearance); CopyWearablesAndAttachments(destination, source, avatarAppearance);
AvatarData avatarData = new AvatarData(avatarAppearance); scene.AvatarService.SetAppearance(destination, avatarAppearance);
scene.AvatarService.SetAvatar(destination, avatarData);
} }
catch (Exception e) catch (Exception e)
{ {
@ -1641,8 +1637,7 @@ namespace OpenSim.ApplicationPlugins.RemoteController
} }
} }
AvatarData avatarData = new AvatarData(avatarAppearance); scene.AvatarService.SetAppearance(destination, avatarAppearance);
scene.AvatarService.SetAvatar(destination, avatarData);
} }
catch (Exception e) catch (Exception e)
{ {
@ -1737,12 +1732,12 @@ namespace OpenSim.ApplicationPlugins.RemoteController
} }
// Attachments // Attachments
Dictionary<int, UUID[]> attachments = avatarAppearance.GetAttachmentDictionary(); Dictionary<int, AvatarAttachment> attachments = avatarAppearance.Attachments;
foreach (KeyValuePair<int, UUID[]> attachment in attachments) foreach (KeyValuePair<int, AvatarAttachment> attachment in attachments)
{ {
int attachpoint = attachment.Key; int attachpoint = attachment.Value.AttachPoint;
UUID itemID = attachment.Value[0]; UUID itemID = attachment.Value.ItemID;
if (itemID != UUID.Zero) if (itemID != UUID.Zero)
{ {
@ -2026,10 +2021,8 @@ namespace OpenSim.ApplicationPlugins.RemoteController
if (include) if (include)
{ {
// Setup for appearance processing // Setup for appearance processing
AvatarData avatarData = scene.AvatarService.GetAvatar(ID); avatarAppearance = scene.AvatarService.GetAppearance(ID);
if (avatarData != null) if (avatarAppearance == null)
avatarAppearance = avatarData.ToAvatarAppearance(ID);
else
avatarAppearance = new AvatarAppearance(); avatarAppearance = new AvatarAppearance();
AvatarWearable[] wearables = avatarAppearance.Wearables; AvatarWearable[] wearables = avatarAppearance.Wearables;
@ -2194,8 +2187,7 @@ namespace OpenSim.ApplicationPlugins.RemoteController
m_log.DebugFormat("[RADMIN] Outfit {0} load completed", outfitName); m_log.DebugFormat("[RADMIN] Outfit {0} load completed", outfitName);
} // foreach outfit } // foreach outfit
m_log.DebugFormat("[RADMIN] Inventory update complete for {0}", name); m_log.DebugFormat("[RADMIN] Inventory update complete for {0}", name);
AvatarData avatarData2 = new AvatarData(avatarAppearance); scene.AvatarService.SetAppearance(ID, avatarAppearance);
scene.AvatarService.SetAvatar(ID, avatarData2);
} }
catch (Exception e) catch (Exception e)
{ {

View File

@ -597,7 +597,7 @@ namespace OpenSim.Client.MXP.ClientStack
public event TeleportLandmarkRequest OnTeleportLandmarkRequest; public event TeleportLandmarkRequest OnTeleportLandmarkRequest;
public event DeRezObject OnDeRezObject; public event DeRezObject OnDeRezObject;
public event Action<IClientAPI> OnRegionHandShakeReply; public event Action<IClientAPI> OnRegionHandShakeReply;
public event GenericCall2 OnRequestWearables; public event GenericCall1 OnRequestWearables;
public event GenericCall1 OnCompleteMovementToRegion; public event GenericCall1 OnCompleteMovementToRegion;
public event UpdateAgent OnPreAgentUpdate; public event UpdateAgent OnPreAgentUpdate;
public event UpdateAgent OnAgentUpdate; public event UpdateAgent OnAgentUpdate;
@ -874,7 +874,7 @@ namespace OpenSim.Client.MXP.ClientStack
OpenSim.Region.Framework.Scenes.Scene scene=(OpenSim.Region.Framework.Scenes.Scene)Scene; OpenSim.Region.Framework.Scenes.Scene scene=(OpenSim.Region.Framework.Scenes.Scene)Scene;
AvatarAppearance appearance; AvatarAppearance appearance;
scene.GetAvatarAppearance(this,out appearance); scene.GetAvatarAppearance(this,out appearance);
OnSetAppearance(appearance.Texture, (byte[])appearance.VisualParams.Clone()); OnSetAppearance(this, appearance.Texture, (byte[])appearance.VisualParams.Clone());
} }
public void Stop() public void Stop()

View File

@ -533,9 +533,7 @@ namespace OpenSim.Client.MXP.PacketHandler
agent.InventoryFolder = UUID.Zero; agent.InventoryFolder = UUID.Zero;
agent.startpos = new Vector3(0, 0, 0); // TODO Fill in region start position agent.startpos = new Vector3(0, 0, 0); // TODO Fill in region start position
agent.CapsPath = "http://localhost/"; agent.CapsPath = "http://localhost/";
AvatarData avatar = scene.AvatarService.GetAvatar(account.PrincipalID); agent.Appearance = scene.AvatarService.GetAppearance(account.PrincipalID);
if (avatar != null)
agent.Appearance = avatar.ToAvatarAppearance(account.PrincipalID); //userService.GetUserAppearance(userProfile.ID);
if (agent.Appearance == null) if (agent.Appearance == null)
{ {

View File

@ -245,7 +245,7 @@ namespace OpenSim.Client.VWoHTTP.ClientStack
public event TeleportLandmarkRequest OnTeleportLandmarkRequest = delegate { }; public event TeleportLandmarkRequest OnTeleportLandmarkRequest = delegate { };
public event DeRezObject OnDeRezObject = delegate { }; public event DeRezObject OnDeRezObject = delegate { };
public event Action<IClientAPI> OnRegionHandShakeReply = delegate { }; public event Action<IClientAPI> OnRegionHandShakeReply = delegate { };
public event GenericCall2 OnRequestWearables = delegate { }; public event GenericCall1 OnRequestWearables = delegate { };
public event GenericCall1 OnCompleteMovementToRegion = delegate { }; public event GenericCall1 OnCompleteMovementToRegion = delegate { };
public event UpdateAgent OnPreAgentUpdate; public event UpdateAgent OnPreAgentUpdate;
public event UpdateAgent OnAgentUpdate = delegate { }; public event UpdateAgent OnAgentUpdate = delegate { };

View File

@ -26,7 +26,9 @@
*/ */
using System; using System;
using System.Reflection;
using System.Collections.Generic; using System.Collections.Generic;
using log4net;
using OpenMetaverse; using OpenMetaverse;
using OpenMetaverse.StructuredData; using OpenMetaverse.StructuredData;
@ -38,6 +40,12 @@ namespace OpenSim.Framework
/// </summary> /// </summary>
public class AgentCircuitData public class AgentCircuitData
{ {
// DEBUG ON
private static readonly ILog m_log =
LogManager.GetLogger(
MethodBase.GetCurrentMethod().DeclaringType);
// DEBUG OFF
/// <summary> /// <summary>
/// Avatar Unique Agent Identifier /// Avatar Unique Agent Identifier
/// </summary> /// </summary>
@ -205,6 +213,7 @@ namespace OpenSim.Framework
args["mac"] = OSD.FromString(Mac); args["mac"] = OSD.FromString(Mac);
args["id0"] = OSD.FromString(Id0); args["id0"] = OSD.FromString(Id0);
/*
if (Appearance != null) if (Appearance != null)
{ {
//System.Console.WriteLine("XXX Before packing Wearables"); //System.Console.WriteLine("XXX Before packing Wearables");
@ -221,20 +230,26 @@ namespace OpenSim.Framework
} }
//System.Console.WriteLine("XXX Before packing Attachments"); //System.Console.WriteLine("XXX Before packing Attachments");
Dictionary<int, UUID[]> attachments = Appearance.GetAttachmentDictionary(); Dictionary<int, AvatarAttachment> attachments = Appearance.Attachments;
if ((attachments != null) && (attachments.Count > 0)) if ((attachments != null) && (attachments.Count > 0))
{ {
OSDArray attachs = new OSDArray(attachments.Count); OSDArray attachs = new OSDArray(attachments.Count);
foreach (KeyValuePair<int, UUID[]> kvp in attachments) foreach (KeyValuePair<int, AvatarAttachment> kvp in attachments)
{ {
AttachmentData adata = new AttachmentData(kvp.Key, kvp.Value[0], kvp.Value[1]); AvatarAttachment adata = new AvatarAttachment(kvp.Value);
attachs.Add(adata.PackUpdateMessage()); attachs.Add(adata.Pack());
//System.Console.WriteLine("XXX att.pt=" + kvp.Key + "; itemID=" + kvp.Value[0] + "; assetID=" + kvp.Value[1]); //System.Console.WriteLine("XXX att.pt=" + kvp.Key + "; itemID=" + kvp.Value[0] + "; assetID=" + kvp.Value[1]);
} }
args["attachments"] = attachs; args["attachments"] = attachs;
} }
} }
*/
if (Appearance != null)
{
OSDMap appmap = Appearance.Pack();
args["packed_appearance"] = appmap;
}
if (ServiceURLs != null && ServiceURLs.Count > 0) if (ServiceURLs != null && ServiceURLs.Count > 0)
{ {
OSDArray urls = new OSDArray(ServiceURLs.Count * 2); OSDArray urls = new OSDArray(ServiceURLs.Count * 2);
@ -317,9 +332,37 @@ namespace OpenSim.Framework
if (args["start_pos"] != null) if (args["start_pos"] != null)
Vector3.TryParse(args["start_pos"].AsString(), out startpos); Vector3.TryParse(args["start_pos"].AsString(), out startpos);
// DEBUG ON
m_log.WarnFormat("[AGENTCIRCUITDATA] agentid={0}, child={1}, startpos={2}",AgentID,child,startpos.ToString());
// DEBUG OFF
try {
// Unpack various appearance elements
Appearance = new AvatarAppearance(AgentID); Appearance = new AvatarAppearance(AgentID);
if (args["packed_appearance"] != null)
{
if (args["packed_appearance"].Type == OSDType.Map)
{
Appearance.Unpack((OSDMap)args["packed_appearance"]);
m_log.WarnFormat("[AGENTCIRCUITDATA] unpacked appearance");
}
else
m_log.WarnFormat("[AGENTCIRCUITDATA] packed_appearance is not a map:\n{0}",args["packed_appearance"].ToString());
}
// DEBUG ON
else
m_log.Warn("[AGENTCIRCUITDATA] failed to find a valid packed_appearance");
// DEBUG OFF
} catch (Exception e)
{
m_log.ErrorFormat("[AGENTCIRCUITDATA] failed to unpack appearance; {0}",e.Message);
}
/*
if (args["appearance_serial"] != null) if (args["appearance_serial"] != null)
Appearance.Serial = args["appearance_serial"].AsInteger(); Appearance.Serial = args["appearance_serial"].AsInteger();
if ((args["wearables"] != null) && (args["wearables"]).Type == OSDType.Array) if ((args["wearables"] != null) && (args["wearables"]).Type == OSDType.Array)
{ {
OSDArray wears = (OSDArray)(args["wearables"]); OSDArray wears = (OSDArray)(args["wearables"]);
@ -328,23 +371,23 @@ namespace OpenSim.Framework
Appearance.Wearables[i].ItemID = wears[i*2].AsUUID(); Appearance.Wearables[i].ItemID = wears[i*2].AsUUID();
Appearance.Wearables[i].AssetID = wears[(i*2)+1].AsUUID(); Appearance.Wearables[i].AssetID = wears[(i*2)+1].AsUUID();
} }
} }
if ((args["attachments"] != null) && (args["attachments"]).Type == OSDType.Array) if ((args["attachments"] != null) && (args["attachments"]).Type == OSDType.Array)
{ {
OSDArray attachs = (OSDArray)(args["attachments"]); OSDArray attachs = (OSDArray)(args["attachments"]);
AttachmentData[] attachments = new AttachmentData[attachs.Count]; AvatarAttachment[] attachments = new AvatarAttachment[attachs.Count];
int i = 0; int i = 0;
foreach (OSD o in attachs) foreach (OSD o in attachs)
{ {
if (o.Type == OSDType.Map) if (o.Type == OSDType.Map)
{ {
attachments[i++] = new AttachmentData((OSDMap)o); attachments[i++] = new AvatarAttachment((OSDMap)o);
} }
} }
Appearance.SetAttachments(attachments); Appearance.SetAttachments(attachments);
} }
*/
ServiceURLs = new Dictionary<string, object>(); ServiceURLs = new Dictionary<string, object>();
if (args.ContainsKey("service_urls") && args["service_urls"] != null && (args["service_urls"]).Type == OSDType.Array) if (args.ContainsKey("service_urls") && args["service_urls"] != null && (args["service_urls"]).Type == OSDType.Array)
{ {

File diff suppressed because it is too large Load Diff

View File

@ -25,14 +25,54 @@
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
using System;
using OpenMetaverse; using OpenMetaverse;
using OpenSim.Framework; using OpenMetaverse.StructuredData;
namespace OpenSim.Region.Framework.Interfaces namespace OpenSim.Framework
{ {
public interface IAvatarFactory public class AvatarAttachment
{ {
bool TryGetAvatarAppearance(UUID avatarId, out AvatarAppearance appearance); public int AttachPoint;
void UpdateDatabase(UUID userID, AvatarAppearance avatAppearance); public UUID ItemID;
public UUID AssetID;
public AvatarAttachment(AvatarAttachment attach)
{
AttachPoint = attach.AttachPoint;
ItemID = attach.ItemID;
AssetID = attach.AssetID;
}
public AvatarAttachment(int point, UUID item, UUID asset)
{
AttachPoint = point;
ItemID = item;
AssetID = asset;
}
public AvatarAttachment(OSDMap args)
{
Unpack(args);
}
public OSDMap Pack()
{
OSDMap attachdata = new OSDMap();
attachdata["point"] = OSD.FromInteger(AttachPoint);
attachdata["item"] = OSD.FromUUID(ItemID);
attachdata["asset"] = OSD.FromUUID(AssetID);
return attachdata;
}
public void Unpack(OSDMap args)
{
if (args["point"] != null)
AttachPoint = args["point"].AsInteger();
ItemID = (args["item"] != null) ? args["item"].AsUUID() : UUID.Zero;
AssetID = (args["asset"] != null) ? args["asset"].AsUUID() : UUID.Zero;
}
} }
} }

View File

@ -26,14 +26,32 @@
*/ */
using System; using System;
using System.Runtime.Serialization;
using System.Security.Permissions;
using OpenMetaverse; using OpenMetaverse;
using OpenMetaverse.StructuredData;
namespace OpenSim.Framework namespace OpenSim.Framework
{ {
public class AvatarWearable public class AvatarWearable
{ {
// these are guessed at by the list here -
// http://wiki.secondlife.com/wiki/Avatar_Appearance. We'll
// correct them over time for when were are wrong.
public static readonly int BODY = 0;
public static readonly int SKIN = 1;
public static readonly int HAIR = 2;
public static readonly int EYES = 3;
public static readonly int SHIRT = 4;
public static readonly int PANTS = 5;
public static readonly int SHOES = 6;
public static readonly int SOCKS = 7;
public static readonly int JACKET = 8;
public static readonly int GLOVES = 9;
public static readonly int UNDERSHIRT = 10;
public static readonly int UNDERPANTS = 11;
public static readonly int SKIRT = 12;
public static readonly int MAX_WEARABLES = 13;
public static readonly UUID DEFAULT_BODY_ITEM = new UUID("66c41e39-38f9-f75a-024e-585989bfaba9"); public static readonly UUID DEFAULT_BODY_ITEM = new UUID("66c41e39-38f9-f75a-024e-585989bfaba9");
public static readonly UUID DEFAULT_BODY_ASSET = new UUID("66c41e39-38f9-f75a-024e-585989bfab73"); public static readonly UUID DEFAULT_BODY_ASSET = new UUID("66c41e39-38f9-f75a-024e-585989bfab73");
@ -62,12 +80,32 @@ namespace OpenSim.Framework
ItemID = itemId; ItemID = itemId;
} }
public AvatarWearable(OSDMap args)
{
Unpack(args);
}
public OSDMap Pack()
{
OSDMap weardata = new OSDMap();
weardata["item"] = OSD.FromUUID(ItemID);
weardata["asset"] = OSD.FromUUID(AssetID);
return weardata;
}
public void Unpack(OSDMap args)
{
ItemID = (args["item"] != null) ? args["item"].AsUUID() : UUID.Zero;
AssetID = (args["asset"] != null) ? args["asset"].AsUUID() : UUID.Zero;
}
public static AvatarWearable[] DefaultWearables public static AvatarWearable[] DefaultWearables
{ {
get get
{ {
AvatarWearable[] defaultWearables = new AvatarWearable[13]; //should be 13 of these AvatarWearable[] defaultWearables = new AvatarWearable[MAX_WEARABLES]; //should be 13 of these
for (int i = 0; i < 13; i++) for (int i = 0; i < MAX_WEARABLES; i++)
{ {
defaultWearables[i] = new AvatarWearable(); defaultWearables[i] = new AvatarWearable();
} }

View File

@ -976,7 +976,9 @@ namespace OpenSim.Framework.Capabilities
public void BakedTextureUploaded(UUID assetID, byte[] data) public void BakedTextureUploaded(UUID assetID, byte[] data)
{ {
m_log.DebugFormat("[CAPS]: Received baked texture {0}", assetID.ToString()); // DEBUG ON
m_log.WarnFormat("[CAPS]: Received baked texture {0}", assetID.ToString());
// DEBUG OFF
AssetBase asset; AssetBase asset;
asset = new AssetBase(assetID, "Baked Texture", (sbyte)AssetType.Texture, m_agentID.ToString()); asset = new AssetBase(assetID, "Baked Texture", (sbyte)AssetType.Texture, m_agentID.ToString());
asset.Data = data; asset.Data = data;

View File

@ -225,46 +225,6 @@ namespace OpenSim.Framework
} }
} }
public class AttachmentData
{
public int AttachPoint;
public UUID ItemID;
public UUID AssetID;
public AttachmentData(int point, UUID item, UUID asset)
{
AttachPoint = point;
ItemID = item;
AssetID = asset;
}
public AttachmentData(OSDMap args)
{
UnpackUpdateMessage(args);
}
public OSDMap PackUpdateMessage()
{
OSDMap attachdata = new OSDMap();
attachdata["point"] = OSD.FromInteger(AttachPoint);
attachdata["item"] = OSD.FromUUID(ItemID);
attachdata["asset"] = OSD.FromUUID(AssetID);
return attachdata;
}
public void UnpackUpdateMessage(OSDMap args)
{
if (args["point"] != null)
AttachPoint = args["point"].AsInteger();
if (args["item"] != null)
ItemID = args["item"].AsUUID();
if (args["asset"] != null)
AssetID = args["asset"].AsUUID();
}
}
public class ControllerData public class ControllerData
{ {
public UUID ItemID; public UUID ItemID;
@ -348,11 +308,14 @@ namespace OpenSim.Framework
public UUID GranterID; public UUID GranterID;
// Appearance // Appearance
public AvatarAppearance Appearance;
/*
public byte[] AgentTextures; public byte[] AgentTextures;
public byte[] VisualParams; public byte[] VisualParams;
public UUID[] Wearables; public UUID[] Wearables;
public AttachmentData[] Attachments; public AvatarAttachment[] Attachments;
*/
// Scripted // Scripted
public ControllerData[] Controllers; public ControllerData[] Controllers;
@ -413,6 +376,9 @@ namespace OpenSim.Framework
args["animations"] = anims; args["animations"] = anims;
} }
if (Appearance != null)
args["packed_appearance"] = Appearance.Pack();
//if ((AgentTextures != null) && (AgentTextures.Length > 0)) //if ((AgentTextures != null) && (AgentTextures.Length > 0))
//{ //{
// OSDArray textures = new OSDArray(AgentTextures.Length); // OSDArray textures = new OSDArray(AgentTextures.Length);
@ -421,7 +387,7 @@ namespace OpenSim.Framework
// args["agent_textures"] = textures; // args["agent_textures"] = textures;
//} //}
/*
if ((AgentTextures != null) && (AgentTextures.Length > 0)) if ((AgentTextures != null) && (AgentTextures.Length > 0))
args["texture_entry"] = OSD.FromBinary(AgentTextures); args["texture_entry"] = OSD.FromBinary(AgentTextures);
@ -441,11 +407,11 @@ namespace OpenSim.Framework
if ((Attachments != null) && (Attachments.Length > 0)) if ((Attachments != null) && (Attachments.Length > 0))
{ {
OSDArray attachs = new OSDArray(Attachments.Length); OSDArray attachs = new OSDArray(Attachments.Length);
foreach (AttachmentData att in Attachments) foreach (AvatarAttachment att in Attachments)
attachs.Add(att.PackUpdateMessage()); attachs.Add(att.Pack());
args["attachments"] = attachs; args["attachments"] = attachs;
} }
*/
if ((Controllers != null) && (Controllers.Length > 0)) if ((Controllers != null) && (Controllers.Length > 0))
{ {
OSDArray controls = new OSDArray(Controllers.Length); OSDArray controls = new OSDArray(Controllers.Length);
@ -581,6 +547,12 @@ namespace OpenSim.Framework
// AgentTextures[i++] = o.AsUUID(); // AgentTextures[i++] = o.AsUUID();
//} //}
if (args["packed_appearance"] != null)
Appearance = new AvatarAppearance(AgentID,(OSDMap)args["packed_appearance"]);
else
Appearance = new AvatarAppearance(AgentID);
/*
if (args["texture_entry"] != null) if (args["texture_entry"] != null)
AgentTextures = args["texture_entry"].AsBinary(); AgentTextures = args["texture_entry"].AsBinary();
@ -599,17 +571,17 @@ namespace OpenSim.Framework
if ((args["attachments"] != null) && (args["attachments"]).Type == OSDType.Array) if ((args["attachments"] != null) && (args["attachments"]).Type == OSDType.Array)
{ {
OSDArray attachs = (OSDArray)(args["attachments"]); OSDArray attachs = (OSDArray)(args["attachments"]);
Attachments = new AttachmentData[attachs.Count]; Attachments = new AvatarAttachment[attachs.Count];
int i = 0; int i = 0;
foreach (OSD o in attachs) foreach (OSD o in attachs)
{ {
if (o.Type == OSDType.Map) if (o.Type == OSDType.Map)
{ {
Attachments[i++] = new AttachmentData((OSDMap)o); Attachments[i++] = new AvatarAttachment((OSDMap)o);
} }
} }
} }
*/
if ((args["controllers"] != null) && (args["controllers"]).Type == OSDType.Array) if ((args["controllers"] != null) && (args["controllers"]).Type == OSDType.Array)
{ {
OSDArray controls = (OSDArray)(args["controllers"]); OSDArray controls = (OSDArray)(args["controllers"]);

View File

@ -43,7 +43,7 @@ namespace OpenSim.Framework
public delegate void TextureRequest(Object sender, TextureRequestArgs e); public delegate void TextureRequest(Object sender, TextureRequestArgs e);
public delegate void AvatarNowWearing(Object sender, AvatarWearingArgs e); public delegate void AvatarNowWearing(IClientAPI sender, AvatarWearingArgs e);
public delegate void ImprovedInstantMessage(IClientAPI remoteclient, GridInstantMessage im); public delegate void ImprovedInstantMessage(IClientAPI remoteclient, GridInstantMessage im);
@ -65,7 +65,7 @@ namespace OpenSim.Framework
public delegate void NetworkStats(int inPackets, int outPackets, int unAckedBytes); public delegate void NetworkStats(int inPackets, int outPackets, int unAckedBytes);
public delegate void SetAppearance(Primitive.TextureEntry textureEntry, byte[] visualParams); public delegate void SetAppearance(IClientAPI remoteClient, Primitive.TextureEntry textureEntry, byte[] visualParams);
public delegate void StartAnim(IClientAPI remoteClient, UUID animID); public delegate void StartAnim(IClientAPI remoteClient, UUID animID);
@ -714,7 +714,7 @@ namespace OpenSim.Framework
event TeleportLandmarkRequest OnTeleportLandmarkRequest; event TeleportLandmarkRequest OnTeleportLandmarkRequest;
event DeRezObject OnDeRezObject; event DeRezObject OnDeRezObject;
event Action<IClientAPI> OnRegionHandShakeReply; event Action<IClientAPI> OnRegionHandShakeReply;
event GenericCall2 OnRequestWearables; event GenericCall1 OnRequestWearables;
event GenericCall1 OnCompleteMovementToRegion; event GenericCall1 OnCompleteMovementToRegion;
event UpdateAgent OnPreAgentUpdate; event UpdateAgent OnPreAgentUpdate;
event UpdateAgent OnAgentUpdate; event UpdateAgent OnAgentUpdate;

View File

@ -65,9 +65,7 @@ namespace OpenSim.Framework.Tests
SessionId = UUID.Random(); SessionId = UUID.Random();
AvAppearance = new AvatarAppearance(AgentId); AvAppearance = new AvatarAppearance(AgentId);
AvAppearance.SetDefaultWearables();
VisualParams = new byte[218]; VisualParams = new byte[218];
AvAppearance.SetDefaultParams(VisualParams);
//body //body
VisualParams[(int)AvatarAppearance.VPElement.SHAPE_HEIGHT] = 155; VisualParams[(int)AvatarAppearance.VPElement.SHAPE_HEIGHT] = 155;

View File

@ -79,7 +79,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
public event DeRezObject OnDeRezObject; public event DeRezObject OnDeRezObject;
public event ModifyTerrain OnModifyTerrain; public event ModifyTerrain OnModifyTerrain;
public event Action<IClientAPI> OnRegionHandShakeReply; public event Action<IClientAPI> OnRegionHandShakeReply;
public event GenericCall2 OnRequestWearables; public event GenericCall1 OnRequestWearables;
public event SetAppearance OnSetAppearance; public event SetAppearance OnSetAppearance;
public event AvatarNowWearing OnAvatarNowWearing; public event AvatarNowWearing OnAvatarNowWearing;
public event RezSingleAttachmentFromInv OnRezSingleAttachmentFromInv; public event RezSingleAttachmentFromInv OnRezSingleAttachmentFromInv;
@ -5681,11 +5681,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP
private bool HandlerAgentWearablesRequest(IClientAPI sender, Packet Pack) private bool HandlerAgentWearablesRequest(IClientAPI sender, Packet Pack)
{ {
GenericCall2 handlerRequestWearables = OnRequestWearables; GenericCall1 handlerRequestWearables = OnRequestWearables;
if (handlerRequestWearables != null) if (handlerRequestWearables != null)
{ {
handlerRequestWearables(); handlerRequestWearables(sender);
} }
Action<IClientAPI> handlerRequestAvatarsData = OnRequestAvatarsData; Action<IClientAPI> handlerRequestAvatarsData = OnRequestAvatarsData;
@ -5728,7 +5728,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
if (appear.ObjectData.TextureEntry.Length > 1) if (appear.ObjectData.TextureEntry.Length > 1)
te = new Primitive.TextureEntry(appear.ObjectData.TextureEntry, 0, appear.ObjectData.TextureEntry.Length); te = new Primitive.TextureEntry(appear.ObjectData.TextureEntry, 0, appear.ObjectData.TextureEntry.Length);
handlerSetAppearance(te, visualparams); handlerSetAppearance(sender, te, visualparams);
} }
catch (Exception e) catch (Exception e)
{ {

View File

@ -125,13 +125,13 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
// Save avatar attachment information // Save avatar attachment information
ScenePresence presence; ScenePresence presence;
if (m_scene.AvatarFactory != null && m_scene.TryGetScenePresence(remoteClient.AgentId, out presence)) if (m_scene.AvatarService != null && m_scene.TryGetScenePresence(remoteClient.AgentId, out presence))
{ {
m_log.Info( m_log.Info(
"[ATTACHMENTS MODULE]: Saving avatar attachment. AgentID: " + remoteClient.AgentId "[ATTACHMENTS MODULE]: Saving avatar attachment. AgentID: " + remoteClient.AgentId
+ ", AttachmentPoint: " + AttachmentPt); + ", AttachmentPoint: " + AttachmentPt);
m_scene.AvatarFactory.UpdateDatabase(remoteClient.AgentId, presence.Appearance); m_scene.AvatarService.SetAppearance(remoteClient.AgentId, presence.Appearance);
} }
} }
} }
@ -399,8 +399,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
item = m_scene.InventoryService.GetItem(item); item = m_scene.InventoryService.GetItem(item);
presence.Appearance.SetAttachment((int)AttachmentPt, itemID, item.AssetID /* att.UUID */); presence.Appearance.SetAttachment((int)AttachmentPt, itemID, item.AssetID /* att.UUID */);
if (m_scene.AvatarFactory != null) if (m_scene.AvatarService != null)
m_scene.AvatarFactory.UpdateDatabase(remoteClient.AgentId, presence.Appearance); m_scene.AvatarService.SetAppearance(remoteClient.AgentId, presence.Appearance);
} }
} }
@ -422,10 +422,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
presence.Appearance.DetachAttachment(itemID); presence.Appearance.DetachAttachment(itemID);
// Save avatar attachment information // Save avatar attachment information
if (m_scene.AvatarFactory != null) if (m_scene.AvatarService != null)
{ {
m_log.Debug("[ATTACHMENTS MODULE]: Detaching from UserID: " + remoteClient.AgentId + ", ItemID: " + itemID); m_log.Debug("[ATTACHMENTS MODULE]: Detaching from UserID: " + remoteClient.AgentId + ", ItemID: " + itemID);
m_scene.AvatarFactory.UpdateDatabase(remoteClient.AgentId, presence.Appearance); m_scene.AvatarService.SetAppearance(remoteClient.AgentId, presence.Appearance);
} }
} }
@ -452,9 +452,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
presence.Appearance.DetachAttachment(itemID); presence.Appearance.DetachAttachment(itemID);
if (m_scene.AvatarFactory != null) if (m_scene.AvatarService != null)
{ {
m_scene.AvatarFactory.UpdateDatabase(remoteClient.AgentId, presence.Appearance); m_scene.AvatarService.SetAppearance(remoteClient.AgentId, presence.Appearance);
} }
part.ParentGroup.DetachToGround(); part.ParentGroup.DetachToGround();

View File

@ -38,48 +38,20 @@ using OpenSim.Services.Interfaces;
namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
{ {
public class AvatarFactoryModule : IAvatarFactory, IRegionModule public class AvatarFactoryModule : IRegionModule
{ {
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
private static readonly byte[] BAKE_INDICES = new byte[] { 8, 9, 10, 11, 19, 20 };
private Scene m_scene = null; private Scene m_scene = null;
private static readonly AvatarAppearance def = new AvatarAppearance();
public bool TryGetAvatarAppearance(UUID avatarId, out AvatarAppearance appearance) private bool m_startAnimationSet = false;
{
AvatarData avatar = m_scene.AvatarService.GetAvatar(avatarId);
//if ((profile != null) && (profile.RootFolder != null))
if (avatar != null)
{
appearance = avatar.ToAvatarAppearance(avatarId);
return true;
}
m_log.ErrorFormat("[APPEARANCE]: Appearance not found for {0}, creating default", avatarId);
appearance = CreateDefault(avatarId);
return false;
}
private AvatarAppearance CreateDefault(UUID avatarId)
{
AvatarAppearance appearance = null;
AvatarWearable[] wearables;
byte[] visualParams;
GetDefaultAvatarAppearance(out wearables, out visualParams);
appearance = new AvatarAppearance(avatarId, wearables, visualParams);
return appearance;
}
public void Initialise(Scene scene, IConfigSource source) public void Initialise(Scene scene, IConfigSource source)
{ {
scene.RegisterModuleInterface<IAvatarFactory>(this);
scene.EventManager.OnNewClient += NewClient; scene.EventManager.OnNewClient += NewClient;
if (m_scene == null) if (m_scene == null)
{
m_scene = scene; m_scene = scene;
}
} }
public void PostInitialise() public void PostInitialise()
@ -102,6 +74,8 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
public void NewClient(IClientAPI client) public void NewClient(IClientAPI client)
{ {
client.OnRequestWearables += SendWearables;
client.OnSetAppearance += SetAppearance;
client.OnAvatarNowWearing += AvatarIsWearing; client.OnAvatarNowWearing += AvatarIsWearing;
} }
@ -110,13 +84,167 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
// client.OnAvatarNowWearing -= AvatarIsWearing; // client.OnAvatarNowWearing -= AvatarIsWearing;
} }
public void SetAppearanceAssets(UUID userID, ref AvatarAppearance appearance) /// <summary>
/// Set appearance data (textureentry and slider settings) received from the client
/// </summary>
/// <param name="texture"></param>
/// <param name="visualParam"></param>
public void SetAppearance(IClientAPI client, Primitive.TextureEntry textureEntry, byte[] visualParams)
{
ScenePresence sp = m_scene.GetScenePresence(client.AgentId);
if (sp == null)
{
m_log.WarnFormat("[AVFACTORY] SetAppearance unable to find presence for {0}",client.AgentId);
return;
}
// DEBUG ON
m_log.WarnFormat("[AVFACTORY] SetAppearance for {0}",client.AgentId);
// DEBUG OFF
/*
if (m_physicsActor != null)
{
if (!IsChildAgent)
{
// This may seem like it's redundant, remove the avatar from the physics scene
// just to add it back again, but it saves us from having to update
// 3 variables 10 times a second.
bool flyingTemp = m_physicsActor.Flying;
RemoveFromPhysicalScene();
//m_scene.PhysicsScene.RemoveAvatar(m_physicsActor);
//PhysicsActor = null;
AddToPhysicalScene(flyingTemp);
}
}
*/
#region Bake Cache Check
bool changed = false;
// Process the texture entry
if (textureEntry != null)
{
for (int i = 0; i < BAKE_INDICES.Length; i++)
{
int j = BAKE_INDICES[i];
Primitive.TextureEntryFace face = textureEntry.FaceTextures[j];
if (face != null && face.TextureID != AppearanceManager.DEFAULT_AVATAR_TEXTURE)
{
if (m_scene.AssetService.Get(face.TextureID.ToString()) == null)
{
m_log.WarnFormat("[AVFACTORY]: Missing baked texture {0} ({1}) for avatar {2}",face.TextureID,j,this.Name);
client.SendRebakeAvatarTextures(face.TextureID);
}
}
}
changed = sp.Appearance.SetTextureEntries(textureEntry);
}
#endregion Bake Cache Check
changed = sp.Appearance.SetVisualParams(visualParams) || changed;
// If nothing changed (this happens frequently) just return
if (changed)
{
// DEBUG ON
m_log.Warn("[AVFACTORY] Appearance changed");
// DEBUG OFF
sp.Appearance.SetAppearance(textureEntry, visualParams);
if (sp.Appearance.AvatarHeight > 0)
sp.SetHeight(sp.Appearance.AvatarHeight);
m_scene.AvatarService.SetAppearance(client.AgentId, sp.Appearance);
}
// DEBUG ON
else
m_log.Warn("[AVFACTORY] Appearance did not change");
// DEBUG OFF
sp.SendAppearanceToAllOtherAgents();
if (!m_startAnimationSet)
{
sp.Animator.UpdateMovementAnimations();
m_startAnimationSet = true;
}
client.SendAvatarDataImmediate(sp);
client.SendAppearance(sp.Appearance.Owner,sp.Appearance.VisualParams,sp.Appearance.Texture.GetBytes());
}
/// <summary>
/// Tell the client for this scene presence what items it should be wearing now
/// </summary>
public void SendWearables(IClientAPI client)
{
ScenePresence sp = m_scene.GetScenePresence(client.AgentId);
if (sp == null)
{
m_log.WarnFormat("[AVFACTORY] SendWearables unable to find presence for {0}",client.AgentId);
return;
}
// DEBUG ON
m_log.WarnFormat("[AVFACTORY]: Received request for wearables of {0}", client.AgentId);
// DEBUG OFF
client.SendWearables(sp.Appearance.Wearables,sp.Appearance.Serial++);
}
/// <summary>
/// Update what the avatar is wearing using an item from their inventory.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public void AvatarIsWearing(IClientAPI client, AvatarWearingArgs e)
{
ScenePresence sp = m_scene.GetScenePresence(client.AgentId);
if (sp == null)
{
m_log.WarnFormat("[AVFACTORY] AvatarIsWearing unable to find presence for {0}",client.AgentId);
return;
}
// DEBUG ON
m_log.WarnFormat("[AVFACTORY]: AvatarIsWearing called for {0}",client.AgentId);
// DEBUG OFF
AvatarAppearance avatAppearance = new AvatarAppearance(sp.Appearance);
//if (!TryGetAvatarAppearance(client.AgentId, out avatAppearance))
//{
// m_log.Warn("[AVFACTORY]: We didn't seem to find the appearance, falling back to ScenePresence");
// avatAppearance = sp.Appearance;
//}
//m_log.DebugFormat("[AVFACTORY]: Received wearables for {0}", client.Name);
foreach (AvatarWearingArgs.Wearable wear in e.NowWearing)
{
if (wear.Type < AvatarWearable.MAX_WEARABLES)
{
AvatarWearable newWearable = new AvatarWearable(wear.ItemID,UUID.Zero);
avatAppearance.SetWearable(wear.Type, newWearable);
}
}
SetAppearanceAssets(sp.UUID, ref avatAppearance);
m_scene.AvatarService.SetAppearance(client.AgentId, avatAppearance);
sp.Appearance = avatAppearance;
}
private void SetAppearanceAssets(UUID userID, ref AvatarAppearance appearance)
{ {
IInventoryService invService = m_scene.InventoryService; IInventoryService invService = m_scene.InventoryService;
if (invService.GetRootFolder(userID) != null) if (invService.GetRootFolder(userID) != null)
{ {
for (int i = 0; i < 13; i++) for (int i = 0; i < AvatarWearable.MAX_WEARABLES; i++)
{ {
if (appearance.Wearables[i].ItemID == UUID.Zero) if (appearance.Wearables[i].ItemID == UUID.Zero)
{ {
@ -134,84 +262,19 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
else else
{ {
m_log.ErrorFormat( m_log.ErrorFormat(
"[APPEARANCE]: Can't find inventory item {0} for {1}, setting to default", "[AVFACTORY]: Can't find inventory item {0} for {1}, setting to default",
appearance.Wearables[i].ItemID, (WearableType)i); appearance.Wearables[i].ItemID, (WearableType)i);
appearance.Wearables[i].AssetID = def.Wearables[i].AssetID; appearance.Wearables[i].ItemID = UUID.Zero;
appearance.Wearables[i].AssetID = UUID.Zero;
} }
} }
} }
} }
else else
{ {
m_log.WarnFormat("[APPEARANCE]: user {0} has no inventory, appearance isn't going to work", userID); m_log.WarnFormat("[AVFACTORY]: user {0} has no inventory, appearance isn't going to work", userID);
} }
} }
/// <summary>
/// Update what the avatar is wearing using an item from their inventory.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public void AvatarIsWearing(Object sender, AvatarWearingArgs e)
{
m_log.DebugFormat("[APPEARANCE]: AvatarIsWearing");
IClientAPI clientView = (IClientAPI)sender;
ScenePresence sp = m_scene.GetScenePresence(clientView.AgentId);
if (sp == null)
{
m_log.Error("[APPEARANCE]: Avatar is child agent, ignoring AvatarIsWearing event");
return;
}
AvatarAppearance avatAppearance = sp.Appearance;
//if (!TryGetAvatarAppearance(clientView.AgentId, out avatAppearance))
//{
// m_log.Warn("[APPEARANCE]: We didn't seem to find the appearance, falling back to ScenePresence");
// avatAppearance = sp.Appearance;
//}
//m_log.DebugFormat("[APPEARANCE]: Received wearables for {0}", clientView.Name);
foreach (AvatarWearingArgs.Wearable wear in e.NowWearing)
{
if (wear.Type < 13)
{
avatAppearance.Wearables[wear.Type].ItemID = wear.ItemID;
}
}
SetAppearanceAssets(sp.UUID, ref avatAppearance);
AvatarData adata = new AvatarData(avatAppearance);
m_scene.AvatarService.SetAvatar(clientView.AgentId, adata);
sp.Appearance = avatAppearance;
}
public static void GetDefaultAvatarAppearance(out AvatarWearable[] wearables, out byte[] visualParams)
{
visualParams = GetDefaultVisualParams();
wearables = AvatarWearable.DefaultWearables;
}
public void UpdateDatabase(UUID user, AvatarAppearance appearance)
{
//m_log.DebugFormat("[APPEARANCE]: UpdateDatabase");
AvatarData adata = new AvatarData(appearance);
m_scene.AvatarService.SetAvatar(user, adata);
}
private static byte[] GetDefaultVisualParams()
{
byte[] visualParams;
visualParams = new byte[218];
for (int i = 0; i < 218; i++)
{
visualParams[i] = 100;
}
return visualParams;
}
} }
} }

View File

@ -30,6 +30,7 @@ using System.Collections.Generic;
using System.Reflection; using System.Reflection;
using log4net; using log4net;
using Nini.Config; using Nini.Config;
using OpenSim.Framework;
using OpenSim.Region.Framework.Interfaces; using OpenSim.Region.Framework.Interfaces;
using OpenSim.Region.Framework.Scenes; using OpenSim.Region.Framework.Scenes;
using OpenSim.Server.Base; using OpenSim.Server.Base;
@ -137,6 +138,16 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Avatar
#region IAvatarService #region IAvatarService
public AvatarAppearance GetAppearance(UUID userID)
{
return m_AvatarService.GetAppearance(userID);
}
public bool SetAppearance(UUID userID, AvatarAppearance appearance)
{
return m_AvatarService.SetAppearance(userID,appearance);
}
public AvatarData GetAvatar(UUID userID) public AvatarData GetAvatar(UUID userID)
{ {
return m_AvatarService.GetAvatar(userID); return m_AvatarService.GetAvatar(userID);

View File

@ -82,7 +82,7 @@ namespace OpenSim.Region.Examples.SimpleModule
public event MoveItemsAndLeaveCopy OnMoveItemsAndLeaveCopy; public event MoveItemsAndLeaveCopy OnMoveItemsAndLeaveCopy;
public event DeRezObject OnDeRezObject; public event DeRezObject OnDeRezObject;
public event Action<IClientAPI> OnRegionHandShakeReply; public event Action<IClientAPI> OnRegionHandShakeReply;
public event GenericCall2 OnRequestWearables; public event GenericCall1 OnRequestWearables;
public event GenericCall1 OnCompleteMovementToRegion; public event GenericCall1 OnCompleteMovementToRegion;
public event UpdateAgent OnPreAgentUpdate; public event UpdateAgent OnPreAgentUpdate;
public event UpdateAgent OnAgentUpdate; public event UpdateAgent OnAgentUpdate;

View File

@ -120,7 +120,6 @@ namespace OpenSim.Region.Framework.Scenes
protected IXMLRPC m_xmlrpcModule; protected IXMLRPC m_xmlrpcModule;
protected IWorldComm m_worldCommModule; protected IWorldComm m_worldCommModule;
protected IAvatarFactory m_AvatarFactory;
protected IConfigSource m_config; protected IConfigSource m_config;
protected IRegionSerialiserModule m_serialiser; protected IRegionSerialiserModule m_serialiser;
protected IDialogModule m_dialogModule; protected IDialogModule m_dialogModule;
@ -415,11 +414,6 @@ namespace OpenSim.Region.Framework.Scenes
public IAttachmentsModule AttachmentsModule { get; set; } public IAttachmentsModule AttachmentsModule { get; set; }
public IAvatarFactory AvatarFactory
{
get { return m_AvatarFactory; }
}
public ICapabilitiesModule CapsModule public ICapabilitiesModule CapsModule
{ {
get { return m_capsModule; } get { return m_capsModule; }
@ -1193,7 +1187,6 @@ namespace OpenSim.Region.Framework.Scenes
m_xmlrpcModule = RequestModuleInterface<IXMLRPC>(); m_xmlrpcModule = RequestModuleInterface<IXMLRPC>();
m_worldCommModule = RequestModuleInterface<IWorldComm>(); m_worldCommModule = RequestModuleInterface<IWorldComm>();
XferManager = RequestModuleInterface<IXfer>(); XferManager = RequestModuleInterface<IXfer>();
m_AvatarFactory = RequestModuleInterface<IAvatarFactory>();
AttachmentsModule = RequestModuleInterface<IAttachmentsModule>(); AttachmentsModule = RequestModuleInterface<IAttachmentsModule>();
m_serialiser = RequestModuleInterface<IRegionSerialiserModule>(); m_serialiser = RequestModuleInterface<IRegionSerialiserModule>();
m_dialogModule = RequestModuleInterface<IDialogModule>(); m_dialogModule = RequestModuleInterface<IDialogModule>();

View File

@ -76,7 +76,6 @@ namespace OpenSim.Region.Framework.Scenes
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
private static readonly byte[] BAKE_INDICES = new byte[] { 8, 9, 10, 11, 19, 20 };
// private static readonly byte[] DEFAULT_TEXTURE = AvatarAppearance.GetDefaultTexture().GetBytes(); // private static readonly byte[] DEFAULT_TEXTURE = AvatarAppearance.GetDefaultTexture().GetBytes();
private static readonly Array DIR_CONTROL_FLAGS = Enum.GetValues(typeof(Dir_ControlFlags)); private static readonly Array DIR_CONTROL_FLAGS = Enum.GetValues(typeof(Dir_ControlFlags));
private static readonly Vector3 HEAD_ADJUSTMENT = new Vector3(0f, 0f, 0.3f); private static readonly Vector3 HEAD_ADJUSTMENT = new Vector3(0f, 0f, 0.3f);
@ -143,8 +142,6 @@ namespace OpenSim.Region.Framework.Scenes
private SendCourseLocationsMethod m_sendCourseLocationsMethod; private SendCourseLocationsMethod m_sendCourseLocationsMethod;
private bool m_startAnimationSet;
//private Vector3 m_requestedSitOffset = new Vector3(); //private Vector3 m_requestedSitOffset = new Vector3();
private Vector3 m_LastFinitePos; private Vector3 m_LastFinitePos;
@ -778,13 +775,14 @@ namespace OpenSim.Region.Framework.Scenes
SetDirectionVectors(); SetDirectionVectors();
} }
/*
public ScenePresence(IClientAPI client, Scene world, RegionInfo reginfo, byte[] visualParams, public ScenePresence(IClientAPI client, Scene world, RegionInfo reginfo, byte[] visualParams,
AvatarWearable[] wearables) AvatarWearable[] wearables)
: this(client, world, reginfo) : this(client, world, reginfo)
{ {
m_appearance = new AvatarAppearance(m_uuid, wearables, visualParams); m_appearance = new AvatarAppearance(m_uuid, wearables, visualParams);
} }
*/
public ScenePresence(IClientAPI client, Scene world, RegionInfo reginfo, AvatarAppearance appearance) public ScenePresence(IClientAPI client, Scene world, RegionInfo reginfo, AvatarAppearance appearance)
: this(client, world, reginfo) : this(client, world, reginfo)
{ {
@ -798,8 +796,6 @@ namespace OpenSim.Region.Framework.Scenes
public void RegisterToEvents() public void RegisterToEvents()
{ {
m_controllingClient.OnRequestWearables += SendWearables;
m_controllingClient.OnSetAppearance += SetAppearance;
m_controllingClient.OnCompleteMovementToRegion += CompleteMovement; m_controllingClient.OnCompleteMovementToRegion += CompleteMovement;
//m_controllingClient.OnCompleteMovementToRegion += SendInitialData; //m_controllingClient.OnCompleteMovementToRegion += SendInitialData;
m_controllingClient.OnAgentUpdate += HandleAgentUpdate; m_controllingClient.OnAgentUpdate += HandleAgentUpdate;
@ -1208,7 +1204,7 @@ namespace OpenSim.Region.Framework.Scenes
/// <summary> /// <summary>
/// Sets avatar height in the phyiscs plugin /// Sets avatar height in the phyiscs plugin
/// </summary> /// </summary>
internal void SetHeight(float height) public void SetHeight(float height)
{ {
m_avHeight = height; m_avHeight = height;
if (PhysicsActor != null && !IsChildAgent) if (PhysicsActor != null && !IsChildAgent)
@ -1272,7 +1268,6 @@ namespace OpenSim.Region.Framework.Scenes
if (friendsModule != null) if (friendsModule != null)
friendsModule.SendFriendsOnlineIfNeeded(ControllingClient); friendsModule.SendFriendsOnlineIfNeeded(ControllingClient);
} }
} }
/// <summary> /// <summary>
@ -2742,9 +2737,12 @@ namespace OpenSim.Region.Framework.Scenes
if (m_appearance.Texture == null) if (m_appearance.Texture == null)
return; return;
Vector3 pos = m_pos; if (IsChildAgent)
pos.Z += m_appearance.HipOffset; {
m_log.WarnFormat("[SCENEPRESENCE] A child agent is attempting to send out avatar data");
return;
}
remoteAvatar.m_controllingClient.SendAvatarDataImmediate(this); remoteAvatar.m_controllingClient.SendAvatarDataImmediate(this);
m_scene.StatsReporter.AddAgentUpdates(1); m_scene.StatsReporter.AddAgentUpdates(1);
} }
@ -2787,6 +2785,12 @@ namespace OpenSim.Region.Framework.Scenes
m_perfMonMS = Util.EnvironmentTickCount(); m_perfMonMS = Util.EnvironmentTickCount();
// only send update from root agents to other clients; children are only "listening posts" // only send update from root agents to other clients; children are only "listening posts"
if (IsChildAgent)
{
m_log.Warn("[SCENEPRESENCE] attempt to send update from a childagent");
return;
}
int count = 0; int count = 0;
m_scene.ForEachScenePresence(delegate(ScenePresence sp) m_scene.ForEachScenePresence(delegate(ScenePresence sp)
{ {
@ -2810,29 +2814,20 @@ namespace OpenSim.Region.Framework.Scenes
// the inventory arrives // the inventory arrives
// m_scene.GetAvatarAppearance(m_controllingClient, out m_appearance); // m_scene.GetAvatarAppearance(m_controllingClient, out m_appearance);
Vector3 pos = m_pos;
pos.Z += m_appearance.HipOffset;
m_controllingClient.SendAvatarDataImmediate(this); m_controllingClient.SendAvatarDataImmediate(this);
m_controllingClient.SendAppearance(m_appearance.Owner,m_appearance.VisualParams,m_appearance.Texture.GetBytes());
SendInitialFullUpdateToAllClients(); SendInitialFullUpdateToAllClients();
} }
/// <summary>
/// Tell the client for this scene presence what items it should be wearing now
/// </summary>
public void SendWearables()
{
m_log.DebugFormat("[SCENE]: Received request for wearables of {0}", Name);
ControllingClient.SendWearables(m_appearance.Wearables, m_appearance.Serial++);
}
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>
public void SendAppearanceToAllOtherAgents() public void SendAppearanceToAllOtherAgents()
{ {
// DEBUG ON
m_log.WarnFormat("[SP] Send appearance from {0} to all other agents",m_uuid);
// DEBUG OFF
m_perfMonMS = Util.EnvironmentTickCount(); m_perfMonMS = Util.EnvironmentTickCount();
m_scene.ForEachScenePresence(delegate(ScenePresence scenePresence) m_scene.ForEachScenePresence(delegate(ScenePresence scenePresence)
@ -2852,96 +2847,13 @@ namespace OpenSim.Region.Framework.Scenes
/// <param name="avatar"></param> /// <param name="avatar"></param>
public void SendAppearanceToOtherAgent(ScenePresence avatar) public void SendAppearanceToOtherAgent(ScenePresence avatar)
{ {
// DEBUG ON
m_log.WarnFormat("[SP] Send appearance from {0} to {1}",m_uuid,avatar.ControllingClient.AgentId);
// DEBUG OFF
avatar.ControllingClient.SendAppearance( avatar.ControllingClient.SendAppearance(
m_appearance.Owner, m_appearance.VisualParams, m_appearance.Texture.GetBytes()); m_appearance.Owner, m_appearance.VisualParams, m_appearance.Texture.GetBytes());
} }
/// <summary>
/// Set appearance data (textureentry and slider settings) received from the client
/// </summary>
/// <param name="texture"></param>
/// <param name="visualParam"></param>
public void SetAppearance(Primitive.TextureEntry textureEntry, byte[] visualParams)
{
lock (m_syncRoot)
{
// MT: Commented this because it's no longer needed.
// It used to be that the avatar height was calculated from the visual
// params, so any call to this method could change the physical actor's
// height. Now the height is supplied in the agent circuit data and never
// changes here. So, we can leave physics alone.
//
// if (m_physicsActor != null)
// {
// if (!IsChildAgent)
// {
// // This may seem like it's redundant, remove the avatar from the physics scene
// // just to add it back again, but it saves us from having to update
// // 3 variables 10 times a second.
// bool flyingTemp = m_physicsActor.Flying;
// RemoveFromPhysicalScene();
// //m_scene.PhysicsScene.RemoveAvatar(m_physicsActor);
//
// //PhysicsActor = null;
//
// AddToPhysicalScene(flyingTemp);
// }
// }
#region Bake Cache Check
if (textureEntry != null)
{
for (int i = 0; i < BAKE_INDICES.Length; i++)
{
int j = BAKE_INDICES[i];
Primitive.TextureEntryFace face = textureEntry.FaceTextures[j];
if (face != null && face.TextureID != AppearanceManager.DEFAULT_AVATAR_TEXTURE)
{
if (m_scene.AssetService.Get(face.TextureID.ToString()) == null)
{
m_log.Warn("[APPEARANCE]: Missing baked texture " + face.TextureID + " (" + j + ") for avatar " + this.Name);
this.ControllingClient.SendRebakeAvatarTextures(face.TextureID);
}
}
}
}
#endregion Bake Cache Check
m_appearance.SetAppearance(textureEntry, visualParams);
if (m_appearance.AvatarHeight > 0)
SetHeight(m_appearance.AvatarHeight);
// This is not needed, because only the transient data changed
//AvatarData adata = new AvatarData(m_appearance);
//m_scene.AvatarService.SetAvatar(m_controllingClient.AgentId, adata);
SendAppearanceToAllOtherAgents();
if (!m_startAnimationSet)
{
Animator.UpdateMovementAnimations();
m_startAnimationSet = true;
}
Vector3 pos = m_pos;
pos.Z += m_appearance.HipOffset;
m_controllingClient.SendAvatarDataImmediate(this);
}
}
public void SetWearable(int wearableId, AvatarWearable wearable)
{
m_appearance.SetWearable(wearableId, wearable);
AvatarData adata = new AvatarData(m_appearance);
m_scene.AvatarService.SetAvatar(m_controllingClient.AgentId, adata);
m_controllingClient.SendWearables(m_appearance.Wearables, m_appearance.Serial++);
}
// Because appearance setting is in a module, we actually need // Because appearance setting is in a module, we actually need
// to give it access to our appearance directly, otherwise we // to give it access to our appearance directly, otherwise we
// get a synchronization issue. // get a synchronization issue.
@ -3335,6 +3247,8 @@ namespace OpenSim.Region.Framework.Scenes
public void CopyTo(AgentData cAgent) public void CopyTo(AgentData cAgent)
{ {
cAgent.CallbackURI = m_callbackURI;
cAgent.AgentID = UUID; cAgent.AgentID = UUID;
cAgent.RegionID = Scene.RegionInfo.RegionID; cAgent.RegionID = Scene.RegionInfo.RegionID;
@ -3374,6 +3288,9 @@ namespace OpenSim.Region.Framework.Scenes
cAgent.AlwaysRun = m_setAlwaysRun; cAgent.AlwaysRun = m_setAlwaysRun;
cAgent.Appearance = new AvatarAppearance(m_appearance);
/*
try try
{ {
// We might not pass the Wearables in all cases... // We might not pass the Wearables in all cases...
@ -3413,14 +3330,14 @@ namespace OpenSim.Region.Framework.Scenes
{ {
//m_log.DebugFormat("[SCENE PRESENCE]: attachments {0}", attPoints.Count); //m_log.DebugFormat("[SCENE PRESENCE]: attachments {0}", attPoints.Count);
int i = 0; int i = 0;
AttachmentData[] attachs = new AttachmentData[attPoints.Count]; AvatarAttachment[] attachs = new AvatarAttachment[attPoints.Count];
foreach (int point in attPoints) foreach (int point in attPoints)
{ {
attachs[i++] = new AttachmentData(point, m_appearance.GetAttachedItem(point), m_appearance.GetAttachedAsset(point)); attachs[i++] = new AvatarAttachment(point, m_appearance.GetAttachedItem(point), m_appearance.GetAttachedAsset(point));
} }
cAgent.Attachments = attachs; cAgent.Attachments = attachs;
} }
*/
lock (scriptedcontrols) lock (scriptedcontrols)
{ {
ControllerData[] controls = new ControllerData[scriptedcontrols.Count]; ControllerData[] controls = new ControllerData[scriptedcontrols.Count];
@ -3447,6 +3364,9 @@ namespace OpenSim.Region.Framework.Scenes
public void CopyFrom(AgentData cAgent) public void CopyFrom(AgentData cAgent)
{ {
// DEBUG ON
m_log.ErrorFormat("[SCENEPRESENCE] CALLING COPYFROM");
// DEBUG OFF
m_originRegionID = cAgent.RegionID; m_originRegionID = cAgent.RegionID;
m_callbackURI = cAgent.CallbackURI; m_callbackURI = cAgent.CallbackURI;
@ -3473,6 +3393,9 @@ namespace OpenSim.Region.Framework.Scenes
m_godLevel = cAgent.GodLevel; m_godLevel = cAgent.GodLevel;
m_setAlwaysRun = cAgent.AlwaysRun; m_setAlwaysRun = cAgent.AlwaysRun;
m_appearance = new AvatarAppearance(cAgent.Appearance);
/*
uint i = 0; uint i = 0;
try try
{ {
@ -3485,15 +3408,17 @@ namespace OpenSim.Region.Framework.Scenes
UUID assetId = cAgent.Wearables[n + 1]; UUID assetId = cAgent.Wearables[n + 1];
wears[i++] = new AvatarWearable(itemId, assetId); wears[i++] = new AvatarWearable(itemId, assetId);
} }
m_appearance.Wearables = wears; // m_appearance.Wearables = wears;
Primitive.TextureEntry te; Primitive.TextureEntry textures = null;
if (cAgent.AgentTextures != null && cAgent.AgentTextures.Length > 1) if (cAgent.AgentTextures != null && cAgent.AgentTextures.Length > 1)
te = new Primitive.TextureEntry(cAgent.AgentTextures, 0, cAgent.AgentTextures.Length); textures = new Primitive.TextureEntry(cAgent.AgentTextures, 0, cAgent.AgentTextures.Length);
else
te = AvatarAppearance.GetDefaultTexture(); byte[] visuals = null;
if ((cAgent.VisualParams == null) || (cAgent.VisualParams.Length < AvatarAppearance.VISUALPARAM_COUNT))
cAgent.VisualParams = AvatarAppearance.GetDefaultVisualParams(); if ((cAgent.VisualParams != null) && (cAgent.VisualParams.Length < AvatarAppearance.VISUALPARAM_COUNT))
m_appearance.SetAppearance(te, (byte[])cAgent.VisualParams.Clone()); visuals = (byte[])cAgent.VisualParams.Clone();
m_appearance = new AvatarAppearance(cAgent.AgentID,wears,textures,visuals);
} }
catch (Exception e) catch (Exception e)
{ {
@ -3506,14 +3431,14 @@ namespace OpenSim.Region.Framework.Scenes
if (cAgent.Attachments != null) if (cAgent.Attachments != null)
{ {
m_appearance.ClearAttachments(); m_appearance.ClearAttachments();
foreach (AttachmentData att in cAgent.Attachments) foreach (AvatarAttachment att in cAgent.Attachments)
{ {
m_appearance.SetAttachment(att.AttachPoint, att.ItemID, att.AssetID); m_appearance.SetAttachment(att.AttachPoint, att.ItemID, att.AssetID);
} }
} }
} }
catch { } catch { }
*/
try try
{ {
lock (scriptedcontrols) lock (scriptedcontrols)

View File

@ -676,7 +676,7 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server
public event TeleportLandmarkRequest OnTeleportLandmarkRequest; public event TeleportLandmarkRequest OnTeleportLandmarkRequest;
public event DeRezObject OnDeRezObject; public event DeRezObject OnDeRezObject;
public event Action<IClientAPI> OnRegionHandShakeReply; public event Action<IClientAPI> OnRegionHandShakeReply;
public event GenericCall2 OnRequestWearables; public event GenericCall1 OnRequestWearables;
public event GenericCall1 OnCompleteMovementToRegion; public event GenericCall1 OnCompleteMovementToRegion;
public event UpdateAgent OnPreAgentUpdate; public event UpdateAgent OnPreAgentUpdate;
public event UpdateAgent OnAgentUpdate; public event UpdateAgent OnAgentUpdate;
@ -909,7 +909,7 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server
Scene scene = (Scene)Scene; Scene scene = (Scene)Scene;
AvatarAppearance appearance; AvatarAppearance appearance;
scene.GetAvatarAppearance(this, out appearance); scene.GetAvatarAppearance(this, out appearance);
OnSetAppearance(appearance.Texture, (byte[])appearance.VisualParams.Clone()); OnSetAppearance(this, appearance.Texture, (byte[])appearance.VisualParams.Clone());
} }
public void SendRegionHandshake(RegionInfo regionInfo, RegionHandshakeArgs args) public void SendRegionHandshake(RegionInfo regionInfo, RegionHandshakeArgs args)

View File

@ -32,7 +32,7 @@ using OpenSim.Region.OptionalModules.Scripting.Minimodule.Interfaces;
namespace OpenSim.Region.OptionalModules.Scripting.Minimodule namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
{ {
class ExtensionHandler : IExtension class ExtensionHandler : IExtension
{ {
private readonly Dictionary<Type, object> m_instances; private readonly Dictionary<Type, object> m_instances;

View File

@ -291,7 +291,6 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
public void InitializeMRM(MRMBase mmb, uint localID, UUID itemID) public void InitializeMRM(MRMBase mmb, uint localID, UUID itemID)
{ {
m_log.Info("[MRM] Created MRM Instance"); m_log.Info("[MRM] Created MRM Instance");
IWorld world; IWorld world;

View File

@ -188,7 +188,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC
public event DeRezObject OnDeRezObject; public event DeRezObject OnDeRezObject;
public event Action<IClientAPI> OnRegionHandShakeReply; public event Action<IClientAPI> OnRegionHandShakeReply;
public event GenericCall2 OnRequestWearables; public event GenericCall1 OnRequestWearables;
public event GenericCall1 OnCompleteMovementToRegion; public event GenericCall1 OnCompleteMovementToRegion;
public event UpdateAgent OnPreAgentUpdate; public event UpdateAgent OnPreAgentUpdate;
public event UpdateAgent OnAgentUpdate; public event UpdateAgent OnAgentUpdate;

View File

@ -64,15 +64,13 @@ namespace OpenSim.Region.OptionalModules.World.NPC
if (m_appearanceCache.ContainsKey(target)) if (m_appearanceCache.ContainsKey(target))
return m_appearanceCache[target]; return m_appearanceCache[target];
AvatarData adata = scene.AvatarService.GetAvatar(target); AvatarAppearance appearance = scene.AvatarService.GetAppearance(target);
if (adata != null) if (appearance != null)
{ {
AvatarAppearance x = adata.ToAvatarAppearance(target); m_appearanceCache.Add(target, appearance);
return appearance;
m_appearanceCache.Add(target, x);
return x;
} }
return new AvatarAppearance(); return new AvatarAppearance();
} }
@ -169,7 +167,9 @@ namespace OpenSim.Region.OptionalModules.World.NPC
{ {
AvatarAppearance x = GetAppearance(p_cloneAppearanceFrom, p_scene); AvatarAppearance x = GetAppearance(p_cloneAppearanceFrom, p_scene);
sp.SetAppearance(x.Texture, (byte[])x.VisualParams.Clone()); sp.Appearance.SetTextureEntries(x.Texture);
sp.Appearance.SetVisualParams((byte[])x.VisualParams.Clone());
sp.SendAppearanceToAllOtherAgents();
} }
m_avatars.Add(npcAvatar.AgentId, npcAvatar); m_avatars.Add(npcAvatar.AgentId, npcAvatar);

View File

@ -51,6 +51,20 @@ namespace OpenSim.Services.AvatarService
m_log.Debug("[AVATAR SERVICE]: Starting avatar service"); m_log.Debug("[AVATAR SERVICE]: Starting avatar service");
} }
// Get|SetAppearance should preserve existing semantics
// until AvatarData can be removed completely
public AvatarAppearance GetAppearance(UUID principalID)
{
AvatarData avatar = GetAvatar(principalID);
return avatar.ToAvatarAppearance(principalID);
}
public bool SetAppearance(UUID principalID, AvatarAppearance appearance)
{
AvatarData avatar = new AvatarData(appearance);
return SetAvatar(principalID,avatar);
}
public AvatarData GetAvatar(UUID principalID) public AvatarData GetAvatar(UUID principalID)
{ {
AvatarBaseData[] av = m_Database.Get("PrincipalID", principalID.ToString()); AvatarBaseData[] av = m_Database.Get("PrincipalID", principalID.ToString());

View File

@ -87,6 +87,18 @@ namespace OpenSim.Services.Connectors
#region IAvatarService #region IAvatarService
public AvatarAppearance GetAppearance(UUID userID)
{
AvatarData avatar = GetAvatar(userID);
return avatar.ToAvatarAppearance(userID);
}
public bool SetAppearance(UUID userID, AvatarAppearance appearance)
{
AvatarData avatar = new AvatarData(appearance);
return SetAvatar(userID,avatar);
}
public AvatarData GetAvatar(UUID userID) public AvatarData GetAvatar(UUID userID)
{ {
Dictionary<string, object> sendData = new Dictionary<string, object>(); Dictionary<string, object> sendData = new Dictionary<string, object>();

View File

@ -28,6 +28,9 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.Specialized; using System.Collections.Specialized;
// DEBUG ON
using System.Diagnostics;
// DEBUG OFF
using System.Reflection; using System.Reflection;
using log4net; using log4net;
using Mono.Addins; using Mono.Addins;
@ -106,6 +109,80 @@ namespace OpenSim.Services.Connectors.SimianGrid
#region IAvatarService #region IAvatarService
// <summary>
// Retrieves the LLPackedAppearance field from user data and unpacks
// it into an AvatarAppearance structure
// </summary>
// <param name="userID"></param>
public AvatarAppearance GetAppearance(UUID userID)
{
NameValueCollection requestArgs = new NameValueCollection
{
{ "RequestMethod", "GetUser" },
{ "UserID", userID.ToString() }
};
OSDMap response = WebUtil.PostToService(m_serverUrl, requestArgs);
if (response["Success"].AsBoolean())
{
OSDMap map = null;
try { map = OSDParser.DeserializeJson(response["LLPackedAppearance"].AsString()) as OSDMap; }
catch { }
if (map != null)
{
AvatarAppearance appearance = new AvatarAppearance(map);
// DEBUG ON
m_log.WarnFormat("[SIMIAN AVATAR CONNECTOR] retrieved appearance for {0}:\n{1}",userID,appearance.ToString());
// DEBUG OFF
return appearance;
}
m_log.WarnFormat("[SIMIAN AVATAR CONNECTOR]: Failed to decode appearance for {0}",userID);
return null;
}
m_log.WarnFormat("[SIMIAN AVATAR CONNECTOR]: Failed to get appearance for {0}: {1}",
userID,response["Message"].AsString());
return null;
}
// <summary>
// </summary>
// <param name=""></param>
public bool SetAppearance(UUID userID, AvatarAppearance appearance)
{
OSDMap map = appearance.Pack();
if (map == null)
{
m_log.WarnFormat("[SIMIAN AVATAR CONNECTOR]: Failed to encode appearance for {0}",userID);
return false;
}
// DEBUG ON
m_log.WarnFormat("[SIMIAN AVATAR CONNECTOR] save appearance for {0}",userID);
// DEBUG OFF
NameValueCollection requestArgs = new NameValueCollection
{
{ "RequestMethod", "AddUserData" },
{ "UserID", userID.ToString() },
{ "LLPackedAppearance", OSDParser.SerializeJsonString(map) }
};
OSDMap response = WebUtil.PostToService(m_serverUrl, requestArgs);
bool success = response["Success"].AsBoolean();
if (! success)
m_log.WarnFormat("[SIMIAN AVATAR CONNECTOR]: Failed to save appearance for {0}: {1}",
userID,response["Message"].AsString());
return success;
}
// <summary>
// </summary>
// <param name=""></param>
public AvatarData GetAvatar(UUID userID) public AvatarData GetAvatar(UUID userID)
{ {
NameValueCollection requestArgs = new NameValueCollection NameValueCollection requestArgs = new NameValueCollection
@ -154,7 +231,7 @@ namespace OpenSim.Services.Connectors.SimianGrid
foreach (KeyValuePair<string, OSD> kvp in map) foreach (KeyValuePair<string, OSD> kvp in map)
avatar.Data[kvp.Key] = kvp.Value.AsString(); avatar.Data[kvp.Key] = kvp.Value.AsString();
} }
return avatar; return avatar;
} }
else else
@ -173,6 +250,9 @@ namespace OpenSim.Services.Connectors.SimianGrid
return null; return null;
} }
// <summary>
// </summary>
// <param name=""></param>
public bool SetAvatar(UUID userID, AvatarData avatar) public bool SetAvatar(UUID userID, AvatarData avatar)
{ {
m_log.Debug("[SIMIAN AVATAR CONNECTOR]: SetAvatar called for " + userID); m_log.Debug("[SIMIAN AVATAR CONNECTOR]: SetAvatar called for " + userID);

View File

@ -27,6 +27,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using System.Net; using System.Net;
using System.Reflection; using System.Reflection;
using System.Xml; using System.Xml;
@ -153,6 +154,11 @@ namespace OpenSim.Services.GridService
// From the command line link-region // From the command line link-region
public GridRegion TryLinkRegionToCoords(UUID scopeID, string mapName, int xloc, int yloc, out string reason) public GridRegion TryLinkRegionToCoords(UUID scopeID, string mapName, int xloc, int yloc, out string reason)
{
return TryLinkRegionToCoords(scopeID, mapName, xloc, yloc, UUID.Zero, out reason);
}
public GridRegion TryLinkRegionToCoords(UUID scopeID, string mapName, int xloc, int yloc, UUID ownerID, out string reason)
{ {
reason = string.Empty; reason = string.Empty;
string host = "127.0.0.1"; string host = "127.0.0.1";
@ -189,7 +195,7 @@ namespace OpenSim.Services.GridService
//} //}
GridRegion regInfo; GridRegion regInfo;
bool success = TryCreateLink(scopeID, xloc, yloc, regionName, port, host, out regInfo, out reason); bool success = TryCreateLink(scopeID, xloc, yloc, regionName, port, host, ownerID, out regInfo, out reason);
if (success) if (success)
{ {
regInfo.RegionName = mapName; regInfo.RegionName = mapName;
@ -202,7 +208,8 @@ namespace OpenSim.Services.GridService
// From the command line and the 2 above // From the command line and the 2 above
public bool TryCreateLink(UUID scopeID, int xloc, int yloc, public bool TryCreateLink(UUID scopeID, int xloc, int yloc,
string externalRegionName, uint externalPort, string externalHostName, out GridRegion regInfo, out string reason) string externalRegionName, uint externalPort, string externalHostName, UUID ownerID,
out GridRegion regInfo, out string reason)
{ {
m_log.DebugFormat("[HYPERGRID LINKER]: Link to {0}:{1}:{2}, in {3}-{4}", externalHostName, externalPort, externalRegionName, xloc, yloc); m_log.DebugFormat("[HYPERGRID LINKER]: Link to {0}:{1}:{2}, in {3}-{4}", externalHostName, externalPort, externalRegionName, xloc, yloc);
@ -214,12 +221,22 @@ namespace OpenSim.Services.GridService
regInfo.RegionLocX = xloc; regInfo.RegionLocX = xloc;
regInfo.RegionLocY = yloc; regInfo.RegionLocY = yloc;
regInfo.ScopeID = scopeID; regInfo.ScopeID = scopeID;
regInfo.EstateOwner = ownerID;
// Big HACK for Simian Grid !!! // Big HACK for Simian Grid !!!
// We need to clean up all URLs used in OpenSim !!! // We need to clean up all URLs used in OpenSim !!!
if (externalHostName.Contains("/")) if (externalHostName.Contains("/"))
regInfo.ServerURI = externalHostName; regInfo.ServerURI = externalHostName;
// Check for free coordinates
GridRegion region = m_GridService.GetRegionByPosition(regInfo.ScopeID, regInfo.RegionLocX, regInfo.RegionLocY);
if (region != null)
{
m_log.WarnFormat("[HYPERGRID LINKER]: Coordinates {0}-{1} are already occupied by region {2} with uuid {3}", regInfo.RegionLocX, regInfo.RegionLocY, region.RegionName, region.RegionID);
reason = "Coordinates are already in use";
return false;
}
try try
{ {
regInfo.InternalEndPoint = new IPEndPoint(IPAddress.Parse("0.0.0.0"), (int)0); regInfo.InternalEndPoint = new IPEndPoint(IPAddress.Parse("0.0.0.0"), (int)0);
@ -241,11 +258,11 @@ namespace OpenSim.Services.GridService
if (regionID != UUID.Zero) if (regionID != UUID.Zero)
{ {
GridRegion r = m_GridService.GetRegionByUUID(scopeID, regionID); region = m_GridService.GetRegionByUUID(scopeID, regionID);
if (r != null) if (region != null)
{ {
m_log.DebugFormat("[HYPERGRID LINKER]: Region already exists in coordinates {0} {1}", r.RegionLocX / Constants.RegionSize, r.RegionLocY / Constants.RegionSize); m_log.DebugFormat("[HYPERGRID LINKER]: Region already exists in coordinates {0} {1}", region.RegionLocX / Constants.RegionSize, region.RegionLocY / Constants.RegionSize);
regInfo = r; regInfo = region;
return true; return true;
} }
@ -355,17 +372,8 @@ namespace OpenSim.Services.GridService
{ {
// Check for regions which are not linked regions // Check for regions which are not linked regions
List<GridRegion> hyperlinks = m_GridService.GetHyperlinks(m_ScopeID); List<GridRegion> hyperlinks = m_GridService.GetHyperlinks(m_ScopeID);
// would like to use .Except, but doesn't seem to exist IEnumerable<GridRegion> availableRegions = regions.Except(hyperlinks);
//IEnumerable<GridRegion> availableRegions = regions.Except(hyperlinks); if (availableRegions.Count() == 0)
List<GridRegion> availableRegions = regions.FindAll(delegate(GridRegion region)
{
// Ewww! n^2
if (hyperlinks.Find(delegate(GridRegion r) { return r.RegionID == region.RegionID; }) == null) // not hyperlink. good.
return true;
return false;
});
if (availableRegions.Count == 0)
return false; return false;
} }
@ -529,7 +537,7 @@ namespace OpenSim.Services.GridService
xloc = xloc * (int)Constants.RegionSize; xloc = xloc * (int)Constants.RegionSize;
yloc = yloc * (int)Constants.RegionSize; yloc = yloc * (int)Constants.RegionSize;
string reason = string.Empty; string reason = string.Empty;
if (TryCreateLink(UUID.Zero, xloc, yloc, "", externalPort, externalHostName, out regInfo, out reason)) if (TryCreateLink(UUID.Zero, xloc, yloc, "", externalPort, externalHostName, UUID.Zero, out regInfo, out reason))
{ {
if (cmdparams.Length >= 5) if (cmdparams.Length >= 5)
{ {
@ -631,8 +639,7 @@ namespace OpenSim.Services.GridService
xloc = xloc * (int)Constants.RegionSize; xloc = xloc * (int)Constants.RegionSize;
yloc = yloc * (int)Constants.RegionSize; yloc = yloc * (int)Constants.RegionSize;
string reason = string.Empty; string reason = string.Empty;
if (TryCreateLink(UUID.Zero, xloc, yloc, "", externalPort, if (TryCreateLink(UUID.Zero, xloc, yloc, "", externalPort, externalHostName, UUID.Zero, out regInfo, out reason))
externalHostName, out regInfo, out reason))
{ {
regInfo.RegionName = config.GetString("localName", ""); regInfo.RegionName = config.GetString("localName", "");
} }

View File

@ -37,6 +37,21 @@ namespace OpenSim.Services.Interfaces
{ {
public interface IAvatarService public interface IAvatarService
{ {
/// <summary>
/// Called by the login service
/// </summary>
/// <param name="userID"></param>
/// <returns></returns>
AvatarAppearance GetAppearance(UUID userID);
/// <summary>
/// Called by everyone who can change the avatar data (so, regions)
/// </summary>
/// <param name="userID"></param>
/// <param name="appearance"></param>
/// <returns></returns>
bool SetAppearance(UUID userID, AvatarAppearance appearance);
/// <summary> /// <summary>
/// Called by the login service /// Called by the login service
/// </summary> /// </summary>
@ -217,23 +232,26 @@ namespace OpenSim.Services.Interfaces
foreach (KeyValuePair<string, string> _kvp in Data) foreach (KeyValuePair<string, string> _kvp in Data)
if (_kvp.Key.StartsWith("_ap_")) if (_kvp.Key.StartsWith("_ap_"))
attchs[_kvp.Key] = _kvp.Value; attchs[_kvp.Key] = _kvp.Value;
Hashtable aaAttachs = new Hashtable();
foreach (KeyValuePair<string, string> _kvp in attchs) foreach (KeyValuePair<string, string> _kvp in attchs)
{ {
string pointStr = _kvp.Key.Substring(4); string pointStr = _kvp.Key.Substring(4);
int point = 0; int point = 0;
if (!Int32.TryParse(pointStr, out point)) if (!Int32.TryParse(pointStr, out point))
continue; continue;
Hashtable tmp = new Hashtable();
UUID uuid = UUID.Zero; UUID uuid = UUID.Zero;
UUID.TryParse(_kvp.Value, out uuid); UUID.TryParse(_kvp.Value, out uuid);
tmp["item"] = uuid;
tmp["asset"] = UUID.Zero.ToString(); appearance.SetAttachment(point,uuid,UUID.Zero);
aaAttachs[point] = tmp;
} }
appearance.SetAttachments(aaAttachs);
} }
catch { } catch
{
// We really should report something here, returning null
// will at least break the wrapper
return null;
}
return appearance; return appearance;
} }

View File

@ -336,10 +336,10 @@ namespace OpenSim.Services.LLLoginService
// //
// Get the avatar // Get the avatar
// //
AvatarData avatar = null; AvatarAppearance avatar = null;
if (m_AvatarService != null) if (m_AvatarService != null)
{ {
avatar = m_AvatarService.GetAvatar(account.PrincipalID); avatar = m_AvatarService.GetAppearance(account.PrincipalID);
} }
// //
@ -607,7 +607,7 @@ namespace OpenSim.Services.LLLoginService
} }
} }
protected AgentCircuitData LaunchAgentAtGrid(GridRegion gatekeeper, GridRegion destination, UserAccount account, AvatarData avatar, protected AgentCircuitData LaunchAgentAtGrid(GridRegion gatekeeper, GridRegion destination, UserAccount account, AvatarAppearance avatar,
UUID session, UUID secureSession, Vector3 position, string currentWhere, string viewer, string channel, string mac, string id0, UUID session, UUID secureSession, Vector3 position, string currentWhere, string viewer, string channel, string mac, string id0,
IPEndPoint clientIP, out string where, out string reason, out GridRegion dest) IPEndPoint clientIP, out string where, out string reason, out GridRegion dest)
{ {
@ -703,14 +703,14 @@ namespace OpenSim.Services.LLLoginService
} }
private AgentCircuitData MakeAgent(GridRegion region, UserAccount account, private AgentCircuitData MakeAgent(GridRegion region, UserAccount account,
AvatarData avatar, UUID session, UUID secureSession, uint circuit, Vector3 position, AvatarAppearance avatar, UUID session, UUID secureSession, uint circuit, Vector3 position,
string ipaddress, string viewer, string channel, string mac, string id0) string ipaddress, string viewer, string channel, string mac, string id0)
{ {
AgentCircuitData aCircuit = new AgentCircuitData(); AgentCircuitData aCircuit = new AgentCircuitData();
aCircuit.AgentID = account.PrincipalID; aCircuit.AgentID = account.PrincipalID;
if (avatar != null) if (avatar != null)
aCircuit.Appearance = avatar.ToAvatarAppearance(account.PrincipalID); aCircuit.Appearance = new AvatarAppearance(avatar);
else else
aCircuit.Appearance = new AvatarAppearance(account.PrincipalID); aCircuit.Appearance = new AvatarAppearance(account.PrincipalID);

View File

@ -94,7 +94,7 @@ namespace OpenSim.Tests.Common.Mock
public event DeRezObject OnDeRezObject; public event DeRezObject OnDeRezObject;
public event Action<IClientAPI> OnRegionHandShakeReply; public event Action<IClientAPI> OnRegionHandShakeReply;
public event GenericCall2 OnRequestWearables; public event GenericCall1 OnRequestWearables;
public event GenericCall1 OnCompleteMovementToRegion; public event GenericCall1 OnCompleteMovementToRegion;
public event UpdateAgent OnPreAgentUpdate; public event UpdateAgent OnPreAgentUpdate;
public event UpdateAgent OnAgentUpdate; public event UpdateAgent OnAgentUpdate;

View File

@ -1114,6 +1114,7 @@
<ReferencePath>../../../bin/</ReferencePath> <ReferencePath>../../../bin/</ReferencePath>
<Reference name="System"/> <Reference name="System"/>
<Reference name="System.Core"/>
<Reference name="System.Xml"/> <Reference name="System.Xml"/>
<Reference name="OpenMetaverseTypes" path="../../../bin/"/> <Reference name="OpenMetaverseTypes" path="../../../bin/"/>
<Reference name="OpenMetaverse" path="../../../bin/"/> <Reference name="OpenMetaverse" path="../../../bin/"/>