diff options
Diffstat (limited to 'OpenSim/Region/Framework/Scenes/ScenePresence.cs')
-rw-r--r-- | OpenSim/Region/Framework/Scenes/ScenePresence.cs | 162 |
1 files changed, 48 insertions, 114 deletions
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 13d9964..6576e64 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. |
@@ -2976,6 +2897,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
2976 | 2897 | ||
2977 | public void CopyTo(AgentData cAgent) | 2898 | public void CopyTo(AgentData cAgent) |
2978 | { | 2899 | { |
2900 | cAgent.CallbackURI = m_callbackURI; | ||
2901 | |||
2979 | cAgent.AgentID = UUID; | 2902 | cAgent.AgentID = UUID; |
2980 | cAgent.RegionID = Scene.RegionInfo.RegionID; | 2903 | cAgent.RegionID = Scene.RegionInfo.RegionID; |
2981 | 2904 | ||
@@ -3015,6 +2938,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
3015 | 2938 | ||
3016 | cAgent.AlwaysRun = m_setAlwaysRun; | 2939 | cAgent.AlwaysRun = m_setAlwaysRun; |
3017 | 2940 | ||
2941 | cAgent.Appearance = new AvatarAppearance(m_appearance); | ||
2942 | |||
2943 | /* | ||
3018 | try | 2944 | try |
3019 | { | 2945 | { |
3020 | // We might not pass the Wearables in all cases... | 2946 | // We might not pass the Wearables in all cases... |
@@ -3054,14 +2980,14 @@ namespace OpenSim.Region.Framework.Scenes | |||
3054 | { | 2980 | { |
3055 | //m_log.DebugFormat("[SCENE PRESENCE]: attachments {0}", attPoints.Count); | 2981 | //m_log.DebugFormat("[SCENE PRESENCE]: attachments {0}", attPoints.Count); |
3056 | int i = 0; | 2982 | int i = 0; |
3057 | AttachmentData[] attachs = new AttachmentData[attPoints.Count]; | 2983 | AvatarAttachment[] attachs = new AvatarAttachment[attPoints.Count]; |
3058 | foreach (int point in attPoints) | 2984 | foreach (int point in attPoints) |
3059 | { | 2985 | { |
3060 | 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)); |
3061 | } | 2987 | } |
3062 | cAgent.Attachments = attachs; | 2988 | cAgent.Attachments = attachs; |
3063 | } | 2989 | } |
3064 | 2990 | */ | |
3065 | lock (scriptedcontrols) | 2991 | lock (scriptedcontrols) |
3066 | { | 2992 | { |
3067 | ControllerData[] controls = new ControllerData[scriptedcontrols.Count]; | 2993 | ControllerData[] controls = new ControllerData[scriptedcontrols.Count]; |
@@ -3088,6 +3014,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
3088 | 3014 | ||
3089 | public void CopyFrom(AgentData cAgent) | 3015 | public void CopyFrom(AgentData cAgent) |
3090 | { | 3016 | { |
3017 | // DEBUG ON | ||
3018 | m_log.ErrorFormat("[SCENEPRESENCE] CALLING COPYFROM"); | ||
3019 | // DEBUG OFF | ||
3091 | m_originRegionID = cAgent.RegionID; | 3020 | m_originRegionID = cAgent.RegionID; |
3092 | 3021 | ||
3093 | m_callbackURI = cAgent.CallbackURI; | 3022 | m_callbackURI = cAgent.CallbackURI; |
@@ -3113,6 +3042,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
3113 | m_godLevel = cAgent.GodLevel; | 3042 | m_godLevel = cAgent.GodLevel; |
3114 | m_setAlwaysRun = cAgent.AlwaysRun; | 3043 | m_setAlwaysRun = cAgent.AlwaysRun; |
3115 | 3044 | ||
3045 | m_appearance = new AvatarAppearance(cAgent.Appearance); | ||
3046 | |||
3047 | /* | ||
3116 | uint i = 0; | 3048 | uint i = 0; |
3117 | try | 3049 | try |
3118 | { | 3050 | { |
@@ -3125,15 +3057,17 @@ namespace OpenSim.Region.Framework.Scenes | |||
3125 | UUID assetId = cAgent.Wearables[n + 1]; | 3057 | UUID assetId = cAgent.Wearables[n + 1]; |
3126 | wears[i++] = new AvatarWearable(itemId, assetId); | 3058 | wears[i++] = new AvatarWearable(itemId, assetId); |
3127 | } | 3059 | } |
3128 | m_appearance.Wearables = wears; | 3060 | // m_appearance.Wearables = wears; |
3129 | Primitive.TextureEntry te; | 3061 | Primitive.TextureEntry textures = null; |
3130 | if (cAgent.AgentTextures != null && cAgent.AgentTextures.Length > 1) | 3062 | if (cAgent.AgentTextures != null && cAgent.AgentTextures.Length > 1) |
3131 | te = new Primitive.TextureEntry(cAgent.AgentTextures, 0, cAgent.AgentTextures.Length); | 3063 | textures = new Primitive.TextureEntry(cAgent.AgentTextures, 0, cAgent.AgentTextures.Length); |
3132 | else | 3064 | |
3133 | te = AvatarAppearance.GetDefaultTexture(); | 3065 | byte[] visuals = null; |
3134 | if ((cAgent.VisualParams == null) || (cAgent.VisualParams.Length < AvatarAppearance.VISUALPARAM_COUNT)) | 3066 | |
3135 | cAgent.VisualParams = AvatarAppearance.GetDefaultVisualParams(); | 3067 | if ((cAgent.VisualParams != null) && (cAgent.VisualParams.Length < AvatarAppearance.VISUALPARAM_COUNT)) |
3136 | 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); | ||
3137 | } | 3071 | } |
3138 | catch (Exception e) | 3072 | catch (Exception e) |
3139 | { | 3073 | { |
@@ -3146,14 +3080,14 @@ namespace OpenSim.Region.Framework.Scenes | |||
3146 | if (cAgent.Attachments != null) | 3080 | if (cAgent.Attachments != null) |
3147 | { | 3081 | { |
3148 | m_appearance.ClearAttachments(); | 3082 | m_appearance.ClearAttachments(); |
3149 | foreach (AttachmentData att in cAgent.Attachments) | 3083 | foreach (AvatarAttachment att in cAgent.Attachments) |
3150 | { | 3084 | { |
3151 | m_appearance.SetAttachment(att.AttachPoint, att.ItemID, att.AssetID); | 3085 | m_appearance.SetAttachment(att.AttachPoint, att.ItemID, att.AssetID); |
3152 | } | 3086 | } |
3153 | } | 3087 | } |
3154 | } | 3088 | } |
3155 | catch { } | 3089 | catch { } |
3156 | 3090 | */ | |
3157 | try | 3091 | try |
3158 | { | 3092 | { |
3159 | lock (scriptedcontrols) | 3093 | lock (scriptedcontrols) |