aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Framework/Scenes/ScenePresence.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Framework/Scenes/ScenePresence.cs')
-rw-r--r--OpenSim/Region/Framework/Scenes/ScenePresence.cs169
1 files changed, 51 insertions, 118 deletions
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 68ac178..1abd134 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -75,7 +75,6 @@ namespace OpenSim.Region.Framework.Scenes
75 75
76 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 76 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
77 77
78 private static readonly byte[] BAKE_INDICES = new byte[] { 8, 9, 10, 11, 19, 20 };
79// private static readonly byte[] DEFAULT_TEXTURE = AvatarAppearance.GetDefaultTexture().GetBytes(); 78// private static readonly byte[] DEFAULT_TEXTURE = AvatarAppearance.GetDefaultTexture().GetBytes();
80 private static readonly Array DIR_CONTROL_FLAGS = Enum.GetValues(typeof(Dir_ControlFlags)); 79 private static readonly Array DIR_CONTROL_FLAGS = Enum.GetValues(typeof(Dir_ControlFlags));
81 private static readonly Vector3 HEAD_ADJUSTMENT = new Vector3(0f, 0f, 0.3f); 80 private static readonly Vector3 HEAD_ADJUSTMENT = new Vector3(0f, 0f, 0.3f);
@@ -137,8 +136,6 @@ namespace OpenSim.Region.Framework.Scenes
137 136
138 private SendCourseLocationsMethod m_sendCourseLocationsMethod; 137 private SendCourseLocationsMethod m_sendCourseLocationsMethod;
139 138
140 private bool m_startAnimationSet;
141
142 //private Vector3 m_requestedSitOffset = new Vector3(); 139 //private Vector3 m_requestedSitOffset = new Vector3();
143 140
144 private Vector3 m_LastFinitePos; 141 private Vector3 m_LastFinitePos;
@@ -713,13 +710,14 @@ namespace OpenSim.Region.Framework.Scenes
713 SetDirectionVectors(); 710 SetDirectionVectors();
714 } 711 }
715 712
713/*
716 public ScenePresence(IClientAPI client, Scene world, RegionInfo reginfo, byte[] visualParams, 714 public ScenePresence(IClientAPI client, Scene world, RegionInfo reginfo, byte[] visualParams,
717 AvatarWearable[] wearables) 715 AvatarWearable[] wearables)
718 : this(client, world, reginfo) 716 : this(client, world, reginfo)
719 { 717 {
720 m_appearance = new AvatarAppearance(m_uuid, wearables, visualParams); 718 m_appearance = new AvatarAppearance(m_uuid, wearables, visualParams);
721 } 719 }
722 720*/
723 public ScenePresence(IClientAPI client, Scene world, RegionInfo reginfo, AvatarAppearance appearance) 721 public ScenePresence(IClientAPI client, Scene world, RegionInfo reginfo, AvatarAppearance appearance)
724 : this(client, world, reginfo) 722 : this(client, world, reginfo)
725 { 723 {
@@ -733,8 +731,6 @@ namespace OpenSim.Region.Framework.Scenes
733 731
734 public void RegisterToEvents() 732 public void RegisterToEvents()
735 { 733 {
736 m_controllingClient.OnRequestWearables += SendWearables;
737 m_controllingClient.OnSetAppearance += SetAppearance;
738 m_controllingClient.OnCompleteMovementToRegion += CompleteMovement; 734 m_controllingClient.OnCompleteMovementToRegion += CompleteMovement;
739 //m_controllingClient.OnCompleteMovementToRegion += SendInitialData; 735 //m_controllingClient.OnCompleteMovementToRegion += SendInitialData;
740 m_controllingClient.OnAgentUpdate += HandleAgentUpdate; 736 m_controllingClient.OnAgentUpdate += HandleAgentUpdate;
@@ -1068,7 +1064,7 @@ namespace OpenSim.Region.Framework.Scenes
1068 /// <summary> 1064 /// <summary>
1069 /// Sets avatar height in the phyiscs plugin 1065 /// Sets avatar height in the phyiscs plugin
1070 /// </summary> 1066 /// </summary>
1071 internal void SetHeight(float height) 1067 public void SetHeight(float height)
1072 { 1068 {
1073 m_avHeight = height; 1069 m_avHeight = height;
1074 if (PhysicsActor != null && !IsChildAgent) 1070 if (PhysicsActor != null && !IsChildAgent)
@@ -1133,7 +1129,6 @@ namespace OpenSim.Region.Framework.Scenes
1133 if (friendsModule != null) 1129 if (friendsModule != null)
1134 friendsModule.SendFriendsOnlineIfNeeded(ControllingClient); 1130 friendsModule.SendFriendsOnlineIfNeeded(ControllingClient);
1135 } 1131 }
1136
1137 } 1132 }
1138 1133
1139 /// <summary> 1134 /// <summary>
@@ -2392,9 +2387,12 @@ namespace OpenSim.Region.Framework.Scenes
2392 if (m_appearance.Texture == null) 2387 if (m_appearance.Texture == null)
2393 return; 2388 return;
2394 2389
2395 Vector3 pos = m_pos; 2390 if (IsChildAgent)
2396 pos.Z += m_appearance.HipOffset; 2391 {
2397 2392 m_log.WarnFormat("[SCENEPRESENCE] A child agent is attempting to send out avatar data");
2393 return;
2394 }
2395
2398 remoteAvatar.m_controllingClient.SendAvatarDataImmediate(this); 2396 remoteAvatar.m_controllingClient.SendAvatarDataImmediate(this);
2399 m_scene.StatsReporter.AddAgentUpdates(1); 2397 m_scene.StatsReporter.AddAgentUpdates(1);
2400 } 2398 }
@@ -2437,6 +2435,12 @@ namespace OpenSim.Region.Framework.Scenes
2437 m_perfMonMS = Util.EnvironmentTickCount(); 2435 m_perfMonMS = Util.EnvironmentTickCount();
2438 2436
2439 // only send update from root agents to other clients; children are only "listening posts" 2437 // only send update from root agents to other clients; children are only "listening posts"
2438 if (IsChildAgent)
2439 {
2440 m_log.Warn("[SCENEPRESENCE] attempt to send update from a childagent");
2441 return;
2442 }
2443
2440 int count = 0; 2444 int count = 0;
2441 m_scene.ForEachScenePresence(delegate(ScenePresence sp) 2445 m_scene.ForEachScenePresence(delegate(ScenePresence sp)
2442 { 2446 {
@@ -2460,29 +2464,20 @@ namespace OpenSim.Region.Framework.Scenes
2460 // the inventory arrives 2464 // the inventory arrives
2461 // m_scene.GetAvatarAppearance(m_controllingClient, out m_appearance); 2465 // m_scene.GetAvatarAppearance(m_controllingClient, out m_appearance);
2462 2466
2463 Vector3 pos = m_pos;
2464 pos.Z += m_appearance.HipOffset;
2465
2466 m_controllingClient.SendAvatarDataImmediate(this); 2467 m_controllingClient.SendAvatarDataImmediate(this);
2468 m_controllingClient.SendAppearance(m_appearance.Owner,m_appearance.VisualParams,m_appearance.Texture.GetBytes());
2467 2469
2468 SendInitialFullUpdateToAllClients(); 2470 SendInitialFullUpdateToAllClients();
2469 } 2471 }
2470 2472
2471 /// <summary> 2473 /// <summary>
2472 /// Tell the client for this scene presence what items it should be wearing now
2473 /// </summary>
2474 public void SendWearables()
2475 {
2476 m_log.DebugFormat("[SCENE]: Received request for wearables of {0}", Name);
2477
2478 ControllingClient.SendWearables(m_appearance.Wearables, m_appearance.Serial++);
2479 }
2480
2481 /// <summary>
2482 /// 2474 ///
2483 /// </summary> 2475 /// </summary>
2484 public void SendAppearanceToAllOtherAgents() 2476 public void SendAppearanceToAllOtherAgents()
2485 { 2477 {
2478// DEBUG ON
2479 m_log.WarnFormat("[SP] Send appearance from {0} to all other agents",m_uuid);
2480// DEBUG OFF
2486 m_perfMonMS = Util.EnvironmentTickCount(); 2481 m_perfMonMS = Util.EnvironmentTickCount();
2487 2482
2488 m_scene.ForEachScenePresence(delegate(ScenePresence scenePresence) 2483 m_scene.ForEachScenePresence(delegate(ScenePresence scenePresence)
@@ -2502,87 +2497,13 @@ namespace OpenSim.Region.Framework.Scenes
2502 /// <param name="avatar"></param> 2497 /// <param name="avatar"></param>
2503 public void SendAppearanceToOtherAgent(ScenePresence avatar) 2498 public void SendAppearanceToOtherAgent(ScenePresence avatar)
2504 { 2499 {
2500// DEBUG ON
2501 m_log.WarnFormat("[SP] Send appearance from {0} to {1}",m_uuid,avatar.ControllingClient.AgentId);
2502// DEBUG OFF
2505 avatar.ControllingClient.SendAppearance( 2503 avatar.ControllingClient.SendAppearance(
2506 m_appearance.Owner, m_appearance.VisualParams, m_appearance.Texture.GetBytes()); 2504 m_appearance.Owner, m_appearance.VisualParams, m_appearance.Texture.GetBytes());
2507 } 2505 }
2508 2506
2509 /// <summary>
2510 /// Set appearance data (textureentry and slider settings) received from the client
2511 /// </summary>
2512 /// <param name="texture"></param>
2513 /// <param name="visualParam"></param>
2514 public void SetAppearance(Primitive.TextureEntry textureEntry, byte[] visualParams)
2515 {
2516 if (m_physicsActor != null)
2517 {
2518 if (!IsChildAgent)
2519 {
2520 // This may seem like it's redundant, remove the avatar from the physics scene
2521 // just to add it back again, but it saves us from having to update
2522 // 3 variables 10 times a second.
2523 bool flyingTemp = m_physicsActor.Flying;
2524 RemoveFromPhysicalScene();
2525 //m_scene.PhysicsScene.RemoveAvatar(m_physicsActor);
2526
2527 //PhysicsActor = null;
2528
2529 AddToPhysicalScene(flyingTemp);
2530 }
2531 }
2532
2533 #region Bake Cache Check
2534
2535 if (textureEntry != null)
2536 {
2537 for (int i = 0; i < BAKE_INDICES.Length; i++)
2538 {
2539 int j = BAKE_INDICES[i];
2540 Primitive.TextureEntryFace face = textureEntry.FaceTextures[j];
2541
2542 if (face != null && face.TextureID != AppearanceManager.DEFAULT_AVATAR_TEXTURE)
2543 {
2544 if (m_scene.AssetService.Get(face.TextureID.ToString()) == null)
2545 {
2546 m_log.Warn("[APPEARANCE]: Missing baked texture " + face.TextureID + " (" + j + ") for avatar " + this.Name);
2547 this.ControllingClient.SendRebakeAvatarTextures(face.TextureID);
2548 }
2549 }
2550 }
2551
2552 }
2553
2554
2555 #endregion Bake Cache Check
2556
2557 m_appearance.SetAppearance(textureEntry, visualParams);
2558 if (m_appearance.AvatarHeight > 0)
2559 SetHeight(m_appearance.AvatarHeight);
2560
2561 // This is not needed, because only the transient data changed
2562 //AvatarData adata = new AvatarData(m_appearance);
2563 //m_scene.AvatarService.SetAvatar(m_controllingClient.AgentId, adata);
2564
2565 SendAppearanceToAllOtherAgents();
2566 if (!m_startAnimationSet)
2567 {
2568 Animator.UpdateMovementAnimations();
2569 m_startAnimationSet = true;
2570 }
2571
2572 Vector3 pos = m_pos;
2573 pos.Z += m_appearance.HipOffset;
2574
2575 m_controllingClient.SendAvatarDataImmediate(this);
2576 }
2577
2578 public void SetWearable(int wearableId, AvatarWearable wearable)
2579 {
2580 m_appearance.SetWearable(wearableId, wearable);
2581 AvatarData adata = new AvatarData(m_appearance);
2582 m_scene.AvatarService.SetAvatar(m_controllingClient.AgentId, adata);
2583 m_controllingClient.SendWearables(m_appearance.Wearables, m_appearance.Serial++);
2584 }
2585
2586 // Because appearance setting is in a module, we actually need 2507 // Because appearance setting is in a module, we actually need
2587 // to give it access to our appearance directly, otherwise we 2508 // to give it access to our appearance directly, otherwise we
2588 // get a synchronization issue. 2509 // get a synchronization issue.
@@ -3017,6 +2938,9 @@ namespace OpenSim.Region.Framework.Scenes
3017 2938
3018 cAgent.AlwaysRun = m_setAlwaysRun; 2939 cAgent.AlwaysRun = m_setAlwaysRun;
3019 2940
2941 cAgent.Appearance = new AvatarAppearance(m_appearance);
2942
2943/*
3020 try 2944 try
3021 { 2945 {
3022 // We might not pass the Wearables in all cases... 2946 // We might not pass the Wearables in all cases...
@@ -3056,14 +2980,14 @@ namespace OpenSim.Region.Framework.Scenes
3056 { 2980 {
3057 //m_log.DebugFormat("[SCENE PRESENCE]: attachments {0}", attPoints.Count); 2981 //m_log.DebugFormat("[SCENE PRESENCE]: attachments {0}", attPoints.Count);
3058 int i = 0; 2982 int i = 0;
3059 AttachmentData[] attachs = new AttachmentData[attPoints.Count]; 2983 AvatarAttachment[] attachs = new AvatarAttachment[attPoints.Count];
3060 foreach (int point in attPoints) 2984 foreach (int point in attPoints)
3061 { 2985 {
3062 attachs[i++] = new AttachmentData(point, m_appearance.GetAttachedItem(point), m_appearance.GetAttachedAsset(point)); 2986 attachs[i++] = new AvatarAttachment(point, m_appearance.GetAttachedItem(point), m_appearance.GetAttachedAsset(point));
3063 } 2987 }
3064 cAgent.Attachments = attachs; 2988 cAgent.Attachments = attachs;
3065 } 2989 }
3066 2990*/
3067 lock (scriptedcontrols) 2991 lock (scriptedcontrols)
3068 { 2992 {
3069 ControllerData[] controls = new ControllerData[scriptedcontrols.Count]; 2993 ControllerData[] controls = new ControllerData[scriptedcontrols.Count];
@@ -3090,6 +3014,9 @@ namespace OpenSim.Region.Framework.Scenes
3090 3014
3091 public void CopyFrom(AgentData cAgent) 3015 public void CopyFrom(AgentData cAgent)
3092 { 3016 {
3017// DEBUG ON
3018 m_log.ErrorFormat("[SCENEPRESENCE] CALLING COPYFROM");
3019// DEBUG OFF
3093 m_originRegionID = cAgent.RegionID; 3020 m_originRegionID = cAgent.RegionID;
3094 3021
3095 m_callbackURI = cAgent.CallbackURI; 3022 m_callbackURI = cAgent.CallbackURI;
@@ -3115,6 +3042,9 @@ namespace OpenSim.Region.Framework.Scenes
3115 m_godLevel = cAgent.GodLevel; 3042 m_godLevel = cAgent.GodLevel;
3116 m_setAlwaysRun = cAgent.AlwaysRun; 3043 m_setAlwaysRun = cAgent.AlwaysRun;
3117 3044
3045 m_appearance = new AvatarAppearance(cAgent.Appearance);
3046
3047/*
3118 uint i = 0; 3048 uint i = 0;
3119 try 3049 try
3120 { 3050 {
@@ -3127,15 +3057,17 @@ namespace OpenSim.Region.Framework.Scenes
3127 UUID assetId = cAgent.Wearables[n + 1]; 3057 UUID assetId = cAgent.Wearables[n + 1];
3128 wears[i++] = new AvatarWearable(itemId, assetId); 3058 wears[i++] = new AvatarWearable(itemId, assetId);
3129 } 3059 }
3130 m_appearance.Wearables = wears; 3060 // m_appearance.Wearables = wears;
3131 Primitive.TextureEntry te; 3061 Primitive.TextureEntry textures = null;
3132 if (cAgent.AgentTextures != null && cAgent.AgentTextures.Length > 1) 3062 if (cAgent.AgentTextures != null && cAgent.AgentTextures.Length > 1)
3133 te = new Primitive.TextureEntry(cAgent.AgentTextures, 0, cAgent.AgentTextures.Length); 3063 textures = new Primitive.TextureEntry(cAgent.AgentTextures, 0, cAgent.AgentTextures.Length);
3134 else 3064
3135 te = AvatarAppearance.GetDefaultTexture(); 3065 byte[] visuals = null;
3136 if ((cAgent.VisualParams == null) || (cAgent.VisualParams.Length < AvatarAppearance.VISUALPARAM_COUNT)) 3066
3137 cAgent.VisualParams = AvatarAppearance.GetDefaultVisualParams(); 3067 if ((cAgent.VisualParams != null) && (cAgent.VisualParams.Length < AvatarAppearance.VISUALPARAM_COUNT))
3138 m_appearance.SetAppearance(te, (byte[])cAgent.VisualParams.Clone()); 3068 visuals = (byte[])cAgent.VisualParams.Clone();
3069
3070 m_appearance = new AvatarAppearance(cAgent.AgentID,wears,textures,visuals);
3139 } 3071 }
3140 catch (Exception e) 3072 catch (Exception e)
3141 { 3073 {
@@ -3148,14 +3080,14 @@ namespace OpenSim.Region.Framework.Scenes
3148 if (cAgent.Attachments != null) 3080 if (cAgent.Attachments != null)
3149 { 3081 {
3150 m_appearance.ClearAttachments(); 3082 m_appearance.ClearAttachments();
3151 foreach (AttachmentData att in cAgent.Attachments) 3083 foreach (AvatarAttachment att in cAgent.Attachments)
3152 { 3084 {
3153 m_appearance.SetAttachment(att.AttachPoint, att.ItemID, att.AssetID); 3085 m_appearance.SetAttachment(att.AttachPoint, att.ItemID, att.AssetID);
3154 } 3086 }
3155 } 3087 }
3156 } 3088 }
3157 catch { } 3089 catch { }
3158 3090*/
3159 try 3091 try
3160 { 3092 {
3161 lock (scriptedcontrols) 3093 lock (scriptedcontrols)
@@ -3724,15 +3656,16 @@ namespace OpenSim.Region.Framework.Scenes
3724 return; 3656 return;
3725 } 3657 }
3726 3658
3727 List<int> attPoints = m_appearance.GetAttachedPoints(); 3659 List<AvatarAttachment> attachments = m_appearance.GetAttachments();
3728 foreach (int p in attPoints) 3660 foreach (AvatarAttachment attach in attachments)
3729 { 3661 {
3730 if (m_isDeleted) 3662 if (m_isDeleted)
3731 return; 3663 return;
3732 3664
3733 UUID itemID = m_appearance.GetAttachedItem(p); 3665 int p = attach.AttachPoint;
3666 UUID itemID = attach.ItemID;
3734 3667
3735 //UUID assetID = m_appearance.GetAttachedAsset(p); 3668 //UUID assetID = attach.AssetID;
3736 // For some reason assetIDs are being written as Zero's in the DB -- need to track tat down 3669 // For some reason assetIDs are being written as Zero's in the DB -- need to track tat down
3737 // But they're not used anyway, the item is being looked up for now, so let's proceed. 3670 // But they're not used anyway, the item is being looked up for now, so let's proceed.
3738 //if (UUID.Zero == assetID) 3671 //if (UUID.Zero == assetID)