diff options
Diffstat (limited to 'OpenSim')
8 files changed, 571 insertions, 460 deletions
diff --git a/OpenSim/Framework/PriorityQueue.cs b/OpenSim/Framework/PriorityQueue.cs index d6c39a7..4f05f65 100644 --- a/OpenSim/Framework/PriorityQueue.cs +++ b/OpenSim/Framework/PriorityQueue.cs | |||
@@ -134,6 +134,21 @@ namespace OpenSim.Framework | |||
134 | return true; | 134 | return true; |
135 | } | 135 | } |
136 | 136 | ||
137 | |||
138 | public void Remove(List<uint> ids) | ||
139 | { | ||
140 | LookupItem lookup; | ||
141 | |||
142 | foreach (uint localid in ids) | ||
143 | { | ||
144 | if (m_lookupTable.TryGetValue(localid, out lookup)) | ||
145 | { | ||
146 | lookup.Heap.Remove(lookup.Handle); | ||
147 | m_lookupTable.Remove(localid); | ||
148 | } | ||
149 | } | ||
150 | } | ||
151 | |||
137 | /// <summary> | 152 | /// <summary> |
138 | /// Remove an item from one of the queues. Specifically, it removes the | 153 | /// Remove an item from one of the queues. Specifically, it removes the |
139 | /// oldest item from the next queue in order to provide fair access to | 154 | /// oldest item from the next queue in order to provide fair access to |
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs index 06f1301..e19877c 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs | |||
@@ -1660,6 +1660,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
1660 | // foreach (uint id in localIDs) | 1660 | // foreach (uint id in localIDs) |
1661 | // m_log.DebugFormat("[CLIENT]: Sending KillObjectPacket to {0} for {1} in {2}", Name, id, regionHandle); | 1661 | // m_log.DebugFormat("[CLIENT]: Sending KillObjectPacket to {0} for {1} in {2}", Name, id, regionHandle); |
1662 | 1662 | ||
1663 | // remove pending entities | ||
1664 | lock (m_entityProps.SyncRoot) | ||
1665 | m_entityProps.Remove(localIDs); | ||
1666 | lock (m_entityUpdates.SyncRoot) | ||
1667 | m_entityUpdates.Remove(localIDs); | ||
1668 | |||
1663 | KillObjectPacket kill = (KillObjectPacket)PacketPool.Instance.GetPacket(PacketType.KillObject); | 1669 | KillObjectPacket kill = (KillObjectPacket)PacketPool.Instance.GetPacket(PacketType.KillObject); |
1664 | // TODO: don't create new blocks if recycling an old packet | 1670 | // TODO: don't create new blocks if recycling an old packet |
1665 | kill.ObjectData = new KillObjectPacket.ObjectDataBlock[localIDs.Count]; | 1671 | kill.ObjectData = new KillObjectPacket.ObjectDataBlock[localIDs.Count]; |
@@ -1671,28 +1677,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
1671 | kill.Header.Reliable = true; | 1677 | kill.Header.Reliable = true; |
1672 | kill.Header.Zerocoded = true; | 1678 | kill.Header.Zerocoded = true; |
1673 | 1679 | ||
1674 | if (localIDs.Count == 1 && m_scene.GetScenePresence(localIDs[0]) != null) | 1680 | OutPacket(kill, ThrottleOutPacketType.Task); |
1675 | { | 1681 | } |
1676 | OutPacket(kill, ThrottleOutPacketType.Task); | ||
1677 | } | ||
1678 | else | ||
1679 | { | ||
1680 | // We MUST lock for both manipulating the kill record and sending the packet, in order to avoid a race | ||
1681 | // condition where a kill can be processed before an out-of-date update for the same object. | ||
1682 | // ProcessEntityUpdates() also takes the m_killRecord lock. | ||
1683 | // lock (m_killRecord) | ||
1684 | // { | ||
1685 | // foreach (uint localID in localIDs) | ||
1686 | // m_killRecord.Add(localID); | ||
1687 | |||
1688 | // The throttle queue used here must match that being used for updates. Otherwise, there is a | ||
1689 | // chance that a kill packet put on a separate queue will be sent to the client before an existing | ||
1690 | // update packet on another queue. Receiving updates after kills results in unowned and undeletable | ||
1691 | // scene objects in a viewer until that viewer is relogged in. | ||
1692 | OutPacket(kill, ThrottleOutPacketType.Task); | ||
1693 | // } | ||
1694 | } | ||
1695 | } | ||
1696 | 1682 | ||
1697 | /// <summary> | 1683 | /// <summary> |
1698 | /// Send information about the items contained in a folder to the client. | 1684 | /// Send information about the items contained in a folder to the client. |
@@ -5328,13 +5314,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
5328 | Vector3 velocity = new Vector3(0, 0, 0); | 5314 | Vector3 velocity = new Vector3(0, 0, 0); |
5329 | Vector3 acceleration = new Vector3(0, 0, 0); | 5315 | Vector3 acceleration = new Vector3(0, 0, 0); |
5330 | rotation.Normalize(); | 5316 | rotation.Normalize(); |
5331 | Vector3 vrot = new Vector3(rotation.X, rotation.Y, rotation.Z); | ||
5332 | 5317 | ||
5333 | data.CollisionPlane.ToBytes(objectData, 0); | 5318 | data.CollisionPlane.ToBytes(objectData, 0); |
5334 | offsetPosition.ToBytes(objectData, 16); | 5319 | offsetPosition.ToBytes(objectData, 16); |
5335 | velocity.ToBytes(objectData, 28); | 5320 | velocity.ToBytes(objectData, 28); |
5336 | acceleration.ToBytes(objectData, 40); | 5321 | acceleration.ToBytes(objectData, 40); |
5337 | vrot.ToBytes(objectData, 52); | 5322 | rotation.ToBytes(objectData, 52); |
5338 | data.AngularVelocity.ToBytes(objectData, 64); | 5323 | data.AngularVelocity.ToBytes(objectData, 64); |
5339 | 5324 | ||
5340 | ObjectUpdatePacket.ObjectDataBlock update = new ObjectUpdatePacket.ObjectDataBlock(); | 5325 | ObjectUpdatePacket.ObjectDataBlock update = new ObjectUpdatePacket.ObjectDataBlock(); |
@@ -5394,8 +5379,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
5394 | 5379 | ||
5395 | Quaternion rotation = data.RotationOffset; | 5380 | Quaternion rotation = data.RotationOffset; |
5396 | rotation.Normalize(); | 5381 | rotation.Normalize(); |
5397 | Vector3 vrot = new Vector3(rotation.X, rotation.Y, rotation.Z); | 5382 | rotation.ToBytes(objectData, 36); |
5398 | vrot.ToBytes(objectData, 36); | ||
5399 | data.AngularVelocity.ToBytes(objectData, 48); | 5383 | data.AngularVelocity.ToBytes(objectData, 48); |
5400 | 5384 | ||
5401 | ObjectUpdatePacket.ObjectDataBlock update = new ObjectUpdatePacket.ObjectDataBlock(); | 5385 | ObjectUpdatePacket.ObjectDataBlock update = new ObjectUpdatePacket.ObjectDataBlock(); |
diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index d5eca03..37aae08 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs | |||
@@ -981,10 +981,12 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
981 | 981 | ||
982 | // May need to logout or other cleanup | 982 | // May need to logout or other cleanup |
983 | // AgentHasMovedAway(sp, logout); | 983 | // AgentHasMovedAway(sp, logout); |
984 | AgentHasMovedAway(sp, true); // until logout use is checked | 984 | // AgentHasMovedAway(sp, true); // until logout use is checked |
985 | 985 | ||
986 | // Well, this is it. The agent is over there. | 986 | // Well, this is it. The agent is over there. |
987 | KillEntity(sp.Scene, sp.LocalId); | 987 | // KillEntity(sp.Scene, sp.LocalId); |
988 | |||
989 | sp.HasMovedAway(); | ||
988 | 990 | ||
989 | // Now let's make it officially a child agent | 991 | // Now let's make it officially a child agent |
990 | sp.MakeChildAgent(); | 992 | sp.MakeChildAgent(); |
@@ -1139,6 +1141,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1139 | 1141 | ||
1140 | m_entityTransferStateMachine.UpdateInTransit(sp.UUID, AgentTransferState.CleaningUp); | 1142 | m_entityTransferStateMachine.UpdateInTransit(sp.UUID, AgentTransferState.CleaningUp); |
1141 | 1143 | ||
1144 | sp.HasMovedAway(); | ||
1145 | |||
1142 | // Need to signal neighbours whether child agents may need closing irrespective of whether this | 1146 | // Need to signal neighbours whether child agents may need closing irrespective of whether this |
1143 | // one needed closing. We also need to close child agents as quickly as possible to avoid complicated | 1147 | // one needed closing. We also need to close child agents as quickly as possible to avoid complicated |
1144 | // race conditions with rapid agent releporting (e.g. from A1 to a non-neighbour B, back | 1148 | // race conditions with rapid agent releporting (e.g. from A1 to a non-neighbour B, back |
@@ -1147,12 +1151,9 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1147 | // abandoned without proper close by viewer but then re-used by an incoming connection. | 1151 | // abandoned without proper close by viewer but then re-used by an incoming connection. |
1148 | sp.CloseChildAgents(newRegionX, newRegionY); | 1152 | sp.CloseChildAgents(newRegionX, newRegionY); |
1149 | 1153 | ||
1150 | // May need to logout or other cleanup | 1154 | // AgentHasMovedAway(sp, true); |
1151 | // AgentHasMovedAway(sp, logout); | ||
1152 | AgentHasMovedAway(sp, true); | ||
1153 | |||
1154 | // Well, this is it. The agent is over there. | 1155 | // Well, this is it. The agent is over there. |
1155 | KillEntity(sp.Scene, sp.LocalId); | 1156 | // KillEntity(sp.Scene, sp.LocalId); |
1156 | 1157 | ||
1157 | // Now let's make it officially a child agent | 1158 | // Now let's make it officially a child agent |
1158 | sp.MakeChildAgent(); | 1159 | sp.MakeChildAgent(); |
diff --git a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs index 668087f..fdadd32 100644 --- a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs +++ b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs | |||
@@ -576,6 +576,16 @@ namespace OpenSim.Region.Framework.Scenes.Animation | |||
576 | m_scenePresence.SendAnimPack(animations, seqs, objectIDs); | 576 | m_scenePresence.SendAnimPack(animations, seqs, objectIDs); |
577 | } | 577 | } |
578 | 578 | ||
579 | public void GetArrays(out UUID[] animIDs, out int[] sequenceNums, out UUID[] objectIDs) | ||
580 | { | ||
581 | animIDs = null; | ||
582 | sequenceNums = null; | ||
583 | objectIDs = null; | ||
584 | |||
585 | if(m_animations != null) | ||
586 | m_animations.GetArrays(out animIDs, out sequenceNums, out objectIDs); | ||
587 | } | ||
588 | |||
579 | public void SendAnimPackToClient(IClientAPI client) | 589 | public void SendAnimPackToClient(IClientAPI client) |
580 | { | 590 | { |
581 | if (m_scenePresence.IsChildAgent) | 591 | if (m_scenePresence.IsChildAgent) |
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 0266faf..aa81000 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs | |||
@@ -3000,13 +3000,18 @@ namespace OpenSim.Region.Framework.Scenes | |||
3000 | if (sp == null) | 3000 | if (sp == null) |
3001 | { | 3001 | { |
3002 | m_log.DebugFormat( | 3002 | m_log.DebugFormat( |
3003 | "[SCENE]: Adding new child scene presence {0} {1} to scene {2} at pos {3}", | 3003 | "[SCENE]: Adding new child scene presence {0} {1} to scene {2} at pos {3}, tpflags: {4}", |
3004 | client.Name, client.AgentId, RegionInfo.RegionName, client.StartPos); | 3004 | client.Name, client.AgentId, RegionInfo.RegionName, client.StartPos, |
3005 | ((TPFlags)aCircuit.teleportFlags).ToString()); | ||
3005 | 3006 | ||
3006 | m_clientManager.Add(client); | 3007 | m_clientManager.Add(client); |
3007 | SubscribeToClientEvents(client); | 3008 | SubscribeToClientEvents(client); |
3008 | 3009 | ||
3009 | sp = m_sceneGraph.CreateAndAddChildScenePresence(client, aCircuit.Appearance, type); | 3010 | sp = m_sceneGraph.CreateAndAddChildScenePresence(client, aCircuit.Appearance, type); |
3011 | |||
3012 | sp.TeleportFlags = (TPFlags)aCircuit.teleportFlags; | ||
3013 | |||
3014 | /* done in completMovement | ||
3010 | InventoryFolderBase cof = InventoryService.GetFolderForType(client.AgentId, (AssetType)46); | 3015 | InventoryFolderBase cof = InventoryService.GetFolderForType(client.AgentId, (AssetType)46); |
3011 | if (cof == null) | 3016 | if (cof == null) |
3012 | sp.COF = UUID.Zero; | 3017 | sp.COF = UUID.Zero; |
@@ -3014,9 +3019,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
3014 | sp.COF = cof.ID; | 3019 | sp.COF = cof.ID; |
3015 | 3020 | ||
3016 | m_log.DebugFormat("[SCENE]: COF for {0} is {1}", client.AgentId, sp.COF); | 3021 | m_log.DebugFormat("[SCENE]: COF for {0} is {1}", client.AgentId, sp.COF); |
3022 | */ | ||
3017 | m_eventManager.TriggerOnNewPresence(sp); | 3023 | m_eventManager.TriggerOnNewPresence(sp); |
3018 | 3024 | ||
3019 | sp.TeleportFlags = (TPFlags)aCircuit.teleportFlags; | ||
3020 | } | 3025 | } |
3021 | else | 3026 | else |
3022 | { | 3027 | { |
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index 28758a9..d3dd5d7 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | |||
@@ -2636,6 +2636,16 @@ namespace OpenSim.Region.Framework.Scenes | |||
2636 | m_rootPart.UpdateFlag = UpdateRequired.TERSE; | 2636 | m_rootPart.UpdateFlag = UpdateRequired.TERSE; |
2637 | } | 2637 | } |
2638 | 2638 | ||
2639 | if (IsAttachment) | ||
2640 | { | ||
2641 | ScenePresence sp = m_scene.GetScenePresence(AttachedAvatar); | ||
2642 | if (sp != null) | ||
2643 | { | ||
2644 | sp.SendAttachmentScheduleUpdate(this); | ||
2645 | return; | ||
2646 | } | ||
2647 | } | ||
2648 | |||
2639 | SceneObjectPart[] parts = m_parts.GetArray(); | 2649 | SceneObjectPart[] parts = m_parts.GetArray(); |
2640 | for (int i = 0; i < parts.Length; i++) | 2650 | for (int i = 0; i < parts.Length; i++) |
2641 | { | 2651 | { |
@@ -2697,15 +2707,25 @@ namespace OpenSim.Region.Framework.Scenes | |||
2697 | return; | 2707 | return; |
2698 | 2708 | ||
2699 | // m_log.DebugFormat("[SOG]: Sending immediate full group update for {0} {1}", Name, UUID); | 2709 | // m_log.DebugFormat("[SOG]: Sending immediate full group update for {0} {1}", Name, UUID); |
2700 | 2710 | ||
2701 | RootPart.SendFullUpdateToAllClients(); | 2711 | if (IsAttachment) |
2712 | { | ||
2713 | ScenePresence sp = m_scene.GetScenePresence(AttachedAvatar); | ||
2714 | if (sp != null) | ||
2715 | { | ||
2716 | sp.SendAttachmentUpdate(this,UpdateRequired.FULL); | ||
2717 | return; | ||
2718 | } | ||
2719 | } | ||
2720 | |||
2721 | RootPart.SendFullUpdateToAllClientsInternal(); | ||
2702 | 2722 | ||
2703 | SceneObjectPart[] parts = m_parts.GetArray(); | 2723 | SceneObjectPart[] parts = m_parts.GetArray(); |
2704 | for (int i = 0; i < parts.Length; i++) | 2724 | for (int i = 0; i < parts.Length; i++) |
2705 | { | 2725 | { |
2706 | SceneObjectPart part = parts[i]; | 2726 | SceneObjectPart part = parts[i]; |
2707 | if (part != RootPart) | 2727 | if (part != RootPart) |
2708 | part.SendFullUpdateToAllClients(); | 2728 | part.SendFullUpdateToAllClientsInternal(); |
2709 | } | 2729 | } |
2710 | } | 2730 | } |
2711 | 2731 | ||
@@ -2739,9 +2759,19 @@ namespace OpenSim.Region.Framework.Scenes | |||
2739 | if (IsDeleted) | 2759 | if (IsDeleted) |
2740 | return; | 2760 | return; |
2741 | 2761 | ||
2762 | if (IsAttachment) | ||
2763 | { | ||
2764 | ScenePresence sp = m_scene.GetScenePresence(AttachedAvatar); | ||
2765 | if (sp != null) | ||
2766 | { | ||
2767 | sp.SendAttachmentUpdate(this, UpdateRequired.TERSE); | ||
2768 | return; | ||
2769 | } | ||
2770 | } | ||
2771 | |||
2742 | SceneObjectPart[] parts = m_parts.GetArray(); | 2772 | SceneObjectPart[] parts = m_parts.GetArray(); |
2743 | for (int i = 0; i < parts.Length; i++) | 2773 | for (int i = 0; i < parts.Length; i++) |
2744 | parts[i].SendTerseUpdateToAllClients(); | 2774 | parts[i].SendTerseUpdateToAllClientsInternal(); |
2745 | } | 2775 | } |
2746 | 2776 | ||
2747 | /// <summary> | 2777 | /// <summary> |
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 98ea880..6fbe732 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | |||
@@ -862,7 +862,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
862 | { | 862 | { |
863 | Vector3 offset = (m_offsetPosition - oldpos); | 863 | Vector3 offset = (m_offsetPosition - oldpos); |
864 | av.AbsolutePosition += offset; | 864 | av.AbsolutePosition += offset; |
865 | av.SendAvatarDataToAllAgents(); | 865 | // av.SendAvatarDataToAllAgents(); |
866 | av.SendTerseUpdateToAllClients(); | ||
866 | } | 867 | } |
867 | } | 868 | } |
868 | } | 869 | } |
@@ -3236,7 +3237,19 @@ namespace OpenSim.Region.Framework.Scenes | |||
3236 | 3237 | ||
3237 | // m_log.DebugFormat( | 3238 | // m_log.DebugFormat( |
3238 | // "[SOG]: Sendinging part full update to {0} for {1} {2}", remoteClient.Name, part.Name, part.LocalId); | 3239 | // "[SOG]: Sendinging part full update to {0} for {1} {2}", remoteClient.Name, part.Name, part.LocalId); |
3239 | 3240 | ||
3241 | |||
3242 | if (ParentGroup.IsAttachment) | ||
3243 | { | ||
3244 | ScenePresence sp = ParentGroup.Scene.GetScenePresence(ParentGroup.AttachedAvatar); | ||
3245 | if (sp != null) | ||
3246 | { | ||
3247 | sp.SendAttachmentUpdate(this, UpdateRequired.FULL); | ||
3248 | } | ||
3249 | } | ||
3250 | |||
3251 | /* this does nothing | ||
3252 | SendFullUpdateToClient(remoteClient, Position) ignores position parameter | ||
3240 | if (IsRoot) | 3253 | if (IsRoot) |
3241 | { | 3254 | { |
3242 | if (ParentGroup.IsAttachment) | 3255 | if (ParentGroup.IsAttachment) |
@@ -3248,6 +3261,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
3248 | SendFullUpdateToClient(remoteClient, AbsolutePosition); | 3261 | SendFullUpdateToClient(remoteClient, AbsolutePosition); |
3249 | } | 3262 | } |
3250 | } | 3263 | } |
3264 | */ | ||
3251 | else | 3265 | else |
3252 | { | 3266 | { |
3253 | SendFullUpdateToClient(remoteClient); | 3267 | SendFullUpdateToClient(remoteClient); |
@@ -3257,7 +3271,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
3257 | /// <summary> | 3271 | /// <summary> |
3258 | /// Send a full update for this part to all clients. | 3272 | /// Send a full update for this part to all clients. |
3259 | /// </summary> | 3273 | /// </summary> |
3260 | public void SendFullUpdateToAllClients() | 3274 | public void SendFullUpdateToAllClientsInternal() |
3261 | { | 3275 | { |
3262 | if (ParentGroup == null) | 3276 | if (ParentGroup == null) |
3263 | return; | 3277 | return; |
@@ -3276,6 +3290,36 @@ namespace OpenSim.Region.Framework.Scenes | |||
3276 | }); | 3290 | }); |
3277 | } | 3291 | } |
3278 | 3292 | ||
3293 | public void SendFullUpdateToAllClients() | ||
3294 | { | ||
3295 | if (ParentGroup == null) | ||
3296 | return; | ||
3297 | |||
3298 | // Update the "last" values | ||
3299 | m_lastPosition = OffsetPosition; | ||
3300 | m_lastRotation = RotationOffset; | ||
3301 | m_lastVelocity = Velocity; | ||
3302 | m_lastAcceleration = Acceleration; | ||
3303 | m_lastAngularVelocity = AngularVelocity; | ||
3304 | m_lastUpdateSentTime = Environment.TickCount; | ||
3305 | |||
3306 | if (ParentGroup.IsAttachment) | ||
3307 | { | ||
3308 | ScenePresence sp = ParentGroup.Scene.GetScenePresence(ParentGroup.AttachedAvatar); | ||
3309 | if (sp != null) | ||
3310 | { | ||
3311 | sp.SendAttachmentUpdate(this, UpdateRequired.FULL); | ||
3312 | } | ||
3313 | } | ||
3314 | else | ||
3315 | { | ||
3316 | ParentGroup.Scene.ForEachScenePresence(delegate(ScenePresence avatar) | ||
3317 | { | ||
3318 | SendFullUpdate(avatar.ControllingClient); | ||
3319 | }); | ||
3320 | } | ||
3321 | } | ||
3322 | |||
3279 | /// <summary> | 3323 | /// <summary> |
3280 | /// Sends a full update to the client | 3324 | /// Sends a full update to the client |
3281 | /// </summary> | 3325 | /// </summary> |
@@ -3345,24 +3389,24 @@ namespace OpenSim.Region.Framework.Scenes | |||
3345 | !OffsetPosition.ApproxEquals(m_lastPosition, POSITION_TOLERANCE) || | 3389 | !OffsetPosition.ApproxEquals(m_lastPosition, POSITION_TOLERANCE) || |
3346 | Environment.TickCount - m_lastUpdateSentTime > TIME_MS_TOLERANCE) | 3390 | Environment.TickCount - m_lastUpdateSentTime > TIME_MS_TOLERANCE) |
3347 | { | 3391 | { |
3348 | SendTerseUpdateToAllClients(); | 3392 | SendTerseUpdateToAllClientsInternal(); |
3349 | |||
3350 | } | 3393 | } |
3351 | break; | 3394 | break; |
3352 | } | 3395 | } |
3353 | case UpdateRequired.FULL: | 3396 | case UpdateRequired.FULL: |
3354 | { | 3397 | { |
3355 | ClearUpdateSchedule(); | 3398 | ClearUpdateSchedule(); |
3356 | SendFullUpdateToAllClients(); | 3399 | SendFullUpdateToAllClientsInternal(); |
3357 | break; | 3400 | break; |
3358 | } | 3401 | } |
3359 | } | 3402 | } |
3360 | } | 3403 | } |
3361 | 3404 | ||
3405 | |||
3362 | /// <summary> | 3406 | /// <summary> |
3363 | /// Send a terse update to all clients | 3407 | /// Send a terse update to all clients |
3364 | /// </summary> | 3408 | /// </summary> |
3365 | public void SendTerseUpdateToAllClients() | 3409 | public void SendTerseUpdateToAllClientsInternal() |
3366 | { | 3410 | { |
3367 | if (ParentGroup == null || ParentGroup.Scene == null) | 3411 | if (ParentGroup == null || ParentGroup.Scene == null) |
3368 | return; | 3412 | return; |
@@ -3381,6 +3425,36 @@ namespace OpenSim.Region.Framework.Scenes | |||
3381 | }); | 3425 | }); |
3382 | } | 3426 | } |
3383 | 3427 | ||
3428 | public void SendTerseUpdateToAllClients() | ||
3429 | { | ||
3430 | if (ParentGroup == null || ParentGroup.Scene == null) | ||
3431 | return; | ||
3432 | |||
3433 | // Update the "last" values | ||
3434 | m_lastPosition = OffsetPosition; | ||
3435 | m_lastRotation = RotationOffset; | ||
3436 | m_lastVelocity = Velocity; | ||
3437 | m_lastAcceleration = Acceleration; | ||
3438 | m_lastAngularVelocity = AngularVelocity; | ||
3439 | m_lastUpdateSentTime = Environment.TickCount; | ||
3440 | |||
3441 | if (ParentGroup.IsAttachment) | ||
3442 | { | ||
3443 | ScenePresence sp = ParentGroup.Scene.GetScenePresence(ParentGroup.AttachedAvatar); | ||
3444 | if (sp != null) | ||
3445 | { | ||
3446 | sp.SendAttachmentUpdate(this, UpdateRequired.TERSE); | ||
3447 | } | ||
3448 | } | ||
3449 | else | ||
3450 | { | ||
3451 | ParentGroup.Scene.ForEachClient(delegate(IClientAPI client) | ||
3452 | { | ||
3453 | SendTerseUpdateToClient(client); | ||
3454 | }); | ||
3455 | } | ||
3456 | } | ||
3457 | |||
3384 | public void SetAxisRotation(int axis, int rotate) | 3458 | public void SetAxisRotation(int axis, int rotate) |
3385 | { | 3459 | { |
3386 | ParentGroup.SetAxisRotation(axis, rotate); | 3460 | ParentGroup.SetAxisRotation(axis, rotate); |
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 73283ed..4fa95fd 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs | |||
@@ -1268,79 +1268,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
1268 | 1268 | ||
1269 | m_scene.SwapRootAgentCount(false); | 1269 | m_scene.SwapRootAgentCount(false); |
1270 | 1270 | ||
1271 | // The initial login scene presence is already root when it gets here | ||
1272 | // and it has already rezzed the attachments and started their scripts. | ||
1273 | // We do the following only for non-login agents, because their scripts | ||
1274 | // haven't started yet. | ||
1275 | /* moved down | ||
1276 | if (PresenceType == PresenceType.Npc || (TeleportFlags & TeleportFlags.ViaLogin) != 0) | ||
1277 | { | ||
1278 | // Viewers which have a current outfit folder will actually rez their own attachments. However, | ||
1279 | // viewers without (e.g. v1 viewers) will not, so we still need to make this call. | ||
1280 | if (Scene.AttachmentsModule != null) | ||
1281 | Util.FireAndForget( | ||
1282 | o => | ||
1283 | { | ||
1284 | // if (PresenceType != PresenceType.Npc && Util.FireAndForgetMethod != FireAndForgetMethod.None) | ||
1285 | // System.Threading.Thread.Sleep(7000); | ||
1286 | |||
1287 | Scene.AttachmentsModule.RezAttachments(this); | ||
1288 | }); | ||
1289 | } | ||
1290 | else | ||
1291 | |||
1292 | { | ||
1293 | // We need to restart scripts here so that they receive the correct changed events (CHANGED_TELEPORT | ||
1294 | // and CHANGED_REGION) when the attachments have been rezzed in the new region. This cannot currently | ||
1295 | // be done in AttachmentsModule.CopyAttachments(AgentData ad, IScenePresence sp) itself since we are | ||
1296 | // not transporting the required data. | ||
1297 | // | ||
1298 | // We need to restart scripts here so that they receive the correct changed events (CHANGED_TELEPORT | ||
1299 | // and CHANGED_REGION) when the attachments have been rezzed in the new region. This cannot currently | ||
1300 | // be done in AttachmentsModule.CopyAttachments(AgentData ad, IScenePresence sp) itself since we are | ||
1301 | // not transporting the required data. | ||
1302 | // | ||
1303 | // We must take a copy of the attachments list here (rather than locking) to avoid a deadlock where a script in one of | ||
1304 | // the attachments may start processing an event (which locks ScriptInstance.m_Script) that then calls a method here | ||
1305 | // which needs to lock m_attachments. ResumeScripts() needs to take a ScriptInstance.m_Script lock to try to unset the Suspend status. | ||
1306 | // | ||
1307 | // FIXME: In theory, this deadlock should not arise since scripts should not be processing events until ResumeScripts(). | ||
1308 | // But XEngine starts all scripts unsuspended. Starting them suspended will not currently work because script rezzing | ||
1309 | // is placed in an asynchronous queue in XEngine and so the ResumeScripts() call will almost certainly execute before the | ||
1310 | // script is rezzed. This means the ResumeScripts() does absolutely nothing when using XEngine. | ||
1311 | // | ||
1312 | // One cannot simply iterate over attachments in a fire and forget thread because this would no longer | ||
1313 | // be locked, allowing race conditions if other code changes the attachments list. | ||
1314 | |||
1315 | List<SceneObjectGroup> attachments = GetAttachments(); | ||
1316 | |||
1317 | if (attachments.Count > 0) | ||
1318 | { | ||
1319 | m_log.DebugFormat( | ||
1320 | "[SCENE PRESENCE]: Restarting scripts in attachments for {0} in {1}", Name, Scene.Name); | ||
1321 | |||
1322 | // Resume scripts this possible should also be moved down after sending the avatar to viewer ? | ||
1323 | foreach (SceneObjectGroup sog in attachments) | ||
1324 | { | ||
1325 | // sending attachments before the avatar ? | ||
1326 | // moved to completemovement where it already was | ||
1327 | // sog.ScheduleGroupForFullUpdate(); | ||
1328 | sog.RootPart.ParentGroup.CreateScriptInstances(0, false, m_scene.DefaultScriptEngine, GetStateSource()); | ||
1329 | sog.ResumeScripts(); | ||
1330 | } | ||
1331 | } | ||
1332 | } | ||
1333 | */ | ||
1334 | /* | ||
1335 | SendAvatarDataToAllAgents(); | ||
1336 | |||
1337 | // send the animations of the other presences to me | ||
1338 | m_scene.ForEachRootScenePresence(delegate(ScenePresence presence) | ||
1339 | { | ||
1340 | if (presence != this) | ||
1341 | presence.Animator.SendAnimPackToClient(ControllingClient); | ||
1342 | }); | ||
1343 | */ | ||
1344 | 1271 | ||
1345 | // If we don't reset the movement flag here, an avatar that crosses to a neighbouring sim and returns will | 1272 | // If we don't reset the movement flag here, an avatar that crosses to a neighbouring sim and returns will |
1346 | // stall on the border crossing since the existing child agent will still have the last movement | 1273 | // stall on the border crossing since the existing child agent will still have the last movement |
@@ -1414,6 +1341,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
1414 | RemoveFromPhysicalScene(); | 1341 | RemoveFromPhysicalScene(); |
1415 | ParentID = 0; // Child agents can't be sitting | 1342 | ParentID = 0; // Child agents can't be sitting |
1416 | 1343 | ||
1344 | // we dont have land information for child | ||
1345 | m_previusParcelHide = false; | ||
1346 | m_previusParcelUUID = UUID.Zero; | ||
1347 | m_currentParcelHide = false; | ||
1348 | m_currentParcelUUID = UUID.Zero; | ||
1417 | // FIXME: Set RegionHandle to the region handle of the scene this agent is moving into | 1349 | // FIXME: Set RegionHandle to the region handle of the scene this agent is moving into |
1418 | 1350 | ||
1419 | m_scene.EventManager.TriggerOnMakeChildAgent(this); | 1351 | m_scene.EventManager.TriggerOnMakeChildAgent(this); |
@@ -1826,13 +1758,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
1826 | // Tell the client that we're totally ready | 1758 | // Tell the client that we're totally ready |
1827 | ControllingClient.MoveAgentIntoRegion(m_scene.RegionInfo, AbsolutePosition, look); | 1759 | ControllingClient.MoveAgentIntoRegion(m_scene.RegionInfo, AbsolutePosition, look); |
1828 | 1760 | ||
1829 | // Remember in HandleUseCircuitCode, we delayed this to here | ||
1830 | // this prims etc, moved down | ||
1831 | // if (m_teleportFlags > 0) | ||
1832 | // SendInitialDataToMe(); | ||
1833 | |||
1834 | // m_log.DebugFormat("[SCENE PRESENCE] Completed movement"); | ||
1835 | |||
1836 | m_log.DebugFormat("[CompleteMovement] MoveAgentIntoRegion: {0}ms", Util.EnvironmentTickCountSubtract(ts)); | 1761 | m_log.DebugFormat("[CompleteMovement] MoveAgentIntoRegion: {0}ms", Util.EnvironmentTickCountSubtract(ts)); |
1837 | 1762 | ||
1838 | if (!string.IsNullOrEmpty(m_callbackURI)) | 1763 | if (!string.IsNullOrEmpty(m_callbackURI)) |
@@ -1878,19 +1803,82 @@ namespace OpenSim.Region.Framework.Scenes | |||
1878 | if (!IsChildAgent) | 1803 | if (!IsChildAgent) |
1879 | { | 1804 | { |
1880 | 1805 | ||
1881 | ValidateAndSendAppearanceAndAgentData(); | 1806 | // ValidateAndSendAppearanceAndAgentData(); |
1807 | |||
1808 | // do it here in line | ||
1809 | // so sequence is clear | ||
1810 | |||
1811 | // verify baked textures and cache | ||
1812 | |||
1813 | bool cachedbaked = false; | ||
1814 | |||
1815 | if (m_scene.AvatarFactory != null) | ||
1816 | cachedbaked = m_scene.AvatarFactory.ValidateBakedTextureCache(this); | ||
1817 | |||
1818 | // not sure we need this | ||
1819 | if (!cachedbaked) | ||
1820 | { | ||
1821 | if (m_scene.AvatarFactory != null) | ||
1822 | m_scene.AvatarFactory.QueueAppearanceSave(UUID); | ||
1823 | } | ||
1824 | |||
1825 | List<ScenePresence> allpresences = m_scene.GetScenePresences(); | ||
1826 | |||
1827 | // send avatar object to all presences including us, so they cross it into region | ||
1828 | // then hide if necessary | ||
1829 | SendInitialAvatarDataToAllAgents(allpresences); | ||
1830 | |||
1831 | // send this look | ||
1832 | SendAppearanceToAgent(this); | ||
1833 | |||
1834 | // send this animations | ||
1835 | UUID[] animIDs = null; | ||
1836 | int[] animseqs = null; | ||
1837 | UUID[] animsobjs = null; | ||
1838 | |||
1839 | if (Animator != null) | ||
1840 | Animator.GetArrays(out animIDs, out animseqs, out animsobjs); | ||
1841 | |||
1842 | bool haveAnims = (animIDs != null && animseqs != null && animsobjs != null); | ||
1843 | |||
1844 | if(haveAnims) | ||
1845 | SendAnimPackToAgent(this, animIDs, animseqs, animsobjs); | ||
1846 | |||
1847 | // we should be able to receive updates, etc | ||
1848 | // so release them | ||
1849 | m_inTransit = false; | ||
1850 | |||
1851 | // send look and animations to others | ||
1852 | // if not cached we send greys | ||
1853 | // uncomented if will wait till avatar does baking | ||
1854 | //if (cachedbaked) | ||
1855 | { | ||
1856 | foreach (ScenePresence p in allpresences) | ||
1857 | { | ||
1858 | if (p == this) | ||
1859 | continue; | ||
1860 | |||
1861 | if (ParcelHideThisAvatar && currentParcelUUID != p.currentParcelUUID && p.GodLevel < 200) | ||
1862 | continue; | ||
1863 | |||
1864 | SendAppearanceToAgentNF(p); | ||
1865 | if (haveAnims) | ||
1866 | SendAnimPackToAgentNF(p, animIDs, animseqs, animsobjs); | ||
1867 | } | ||
1868 | } // greys if | ||
1882 | 1869 | ||
1883 | m_log.DebugFormat("[CompleteMovement] ValidateAndSendAppearanceAndAgentData: {0}ms", Util.EnvironmentTickCountSubtract(ts)); | 1870 | m_log.DebugFormat("[CompleteMovement] ValidateAndSendAppearanceAndAgentData: {0}ms", Util.EnvironmentTickCountSubtract(ts)); |
1884 | 1871 | ||
1885 | // attachments | 1872 | // attachments |
1873 | |||
1886 | if (isNPC || (TeleportFlags & TeleportFlags.ViaLogin) != 0) | 1874 | if (isNPC || (TeleportFlags & TeleportFlags.ViaLogin) != 0) |
1887 | { | 1875 | { |
1888 | if (Scene.AttachmentsModule != null) | 1876 | if (Scene.AttachmentsModule != null) |
1889 | // Util.FireAndForget( | 1877 | // Util.FireAndForget( |
1890 | // o => | 1878 | // o => |
1891 | // { | 1879 | // { |
1892 | Scene.AttachmentsModule.RezAttachments(this); | 1880 | Scene.AttachmentsModule.RezAttachments(this); |
1893 | // }); | 1881 | // }); |
1894 | } | 1882 | } |
1895 | else | 1883 | else |
1896 | { | 1884 | { |
@@ -1902,26 +1890,24 @@ namespace OpenSim.Region.Framework.Scenes | |||
1902 | // Resume scripts this possible should also be moved down after sending the avatar to viewer ? | 1890 | // Resume scripts this possible should also be moved down after sending the avatar to viewer ? |
1903 | foreach (SceneObjectGroup sog in m_attachments) | 1891 | foreach (SceneObjectGroup sog in m_attachments) |
1904 | { | 1892 | { |
1905 | sog.SendFullUpdateToClient(ControllingClient); | ||
1906 | SendFullUpdateToClient(ControllingClient); | 1893 | SendFullUpdateToClient(ControllingClient); |
1894 | SendAttachmentFullUpdateToAgentNF(sog, this); | ||
1907 | 1895 | ||
1908 | if (!sog.HasPrivateAttachmentPoint) | 1896 | if (!sog.HasPrivateAttachmentPoint) |
1909 | { | 1897 | { |
1910 | // sog.ScheduleGroupForFullUpdate(); | 1898 | // sog.ScheduleGroupForFullUpdate(); |
1911 | m_scene.ForEachScenePresence(delegate(ScenePresence p) | 1899 | foreach(ScenePresence p in allpresences) |
1912 | { | 1900 | { |
1913 | if (p == this) | 1901 | if (p == this) |
1914 | return; | 1902 | continue; |
1915 | 1903 | ||
1916 | if (ParcelHideThisAvatar && currentParcelUUID != p.currentParcelUUID && p.GodLevel < 200) | 1904 | if (ParcelHideThisAvatar && currentParcelUUID != p.currentParcelUUID && p.GodLevel < 200) |
1917 | return; | 1905 | continue; |
1918 | 1906 | ||
1919 | p.ControllingClient.SendPartFullUpdate(sog.RootPart,LocalId + 1); | ||
1920 | sog.SendFullUpdateToClient(p.ControllingClient); | ||
1921 | SendFullUpdateToClient(p.ControllingClient); // resend our data by updates path | 1907 | SendFullUpdateToClient(p.ControllingClient); // resend our data by updates path |
1922 | }); | 1908 | SendAttachmentFullUpdateToAgentNF(sog, p); |
1909 | }; | ||
1923 | } | 1910 | } |
1924 | |||
1925 | sog.RootPart.ParentGroup.CreateScriptInstances(0, false, m_scene.DefaultScriptEngine, GetStateSource()); | 1911 | sog.RootPart.ParentGroup.CreateScriptInstances(0, false, m_scene.DefaultScriptEngine, GetStateSource()); |
1926 | sog.ResumeScripts(); | 1912 | sog.ResumeScripts(); |
1927 | } | 1913 | } |
@@ -1947,25 +1933,14 @@ namespace OpenSim.Region.Framework.Scenes | |||
1947 | 1933 | ||
1948 | m_log.DebugFormat("[CompleteMovement] SendInitialDataToMe: {0}ms", Util.EnvironmentTickCountSubtract(ts)); | 1934 | m_log.DebugFormat("[CompleteMovement] SendInitialDataToMe: {0}ms", Util.EnvironmentTickCountSubtract(ts)); |
1949 | 1935 | ||
1950 | if (!IsChildAgent) | 1936 | if (!IsChildAgent && openChildAgents) |
1951 | { | 1937 | { |
1952 | // moved from makeroot missing in sendInitialDataToMe | ||
1953 | // its already there | ||
1954 | /* | ||
1955 | m_scene.ForEachRootScenePresence(delegate(ScenePresence presence) | ||
1956 | { | ||
1957 | if (presence != this) | ||
1958 | presence.Animator.SendAnimPackToClient(ControllingClient); | ||
1959 | }); | ||
1960 | */ | ||
1961 | if (openChildAgents) | ||
1962 | { | ||
1963 | IFriendsModule friendsModule = m_scene.RequestModuleInterface<IFriendsModule>(); | 1938 | IFriendsModule friendsModule = m_scene.RequestModuleInterface<IFriendsModule>(); |
1964 | if (friendsModule != null) | 1939 | if (friendsModule != null) |
1965 | friendsModule.SendFriendsOnlineIfNeeded(ControllingClient); | 1940 | friendsModule.SendFriendsOnlineIfNeeded(ControllingClient); |
1966 | 1941 | ||
1967 | m_log.DebugFormat("[CompleteMovement] friendsModule: {0}ms", Util.EnvironmentTickCountSubtract(ts)); | 1942 | m_log.DebugFormat("[CompleteMovement] friendsModule: {0}ms", Util.EnvironmentTickCountSubtract(ts)); |
1968 | } | 1943 | |
1969 | } | 1944 | } |
1970 | } | 1945 | } |
1971 | finally | 1946 | finally |
@@ -3543,14 +3518,12 @@ namespace OpenSim.Region.Framework.Scenes | |||
3543 | } | 3518 | } |
3544 | 3519 | ||
3545 | SendOtherAgentsAvatarFullToMe(); | 3520 | SendOtherAgentsAvatarFullToMe(); |
3546 | |||
3547 | EntityBase[] entities = Scene.Entities.GetEntities(); | 3521 | EntityBase[] entities = Scene.Entities.GetEntities(); |
3548 | foreach (EntityBase e in entities) | 3522 | foreach (EntityBase e in entities) |
3549 | { | 3523 | { |
3550 | if (e != null && e is SceneObjectGroup) | 3524 | if (e != null && e is SceneObjectGroup && !((SceneObjectGroup)e).IsAttachment) |
3551 | ((SceneObjectGroup)e).SendFullUpdateToClient(ControllingClient); | 3525 | ((SceneObjectGroup)e).SendFullUpdateToClient(ControllingClient); |
3552 | } | 3526 | } |
3553 | |||
3554 | }); | 3527 | }); |
3555 | } | 3528 | } |
3556 | 3529 | ||
@@ -3558,6 +3531,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
3558 | /// Do everything required once a client completes its movement into a region and becomes | 3531 | /// Do everything required once a client completes its movement into a region and becomes |
3559 | /// a root agent. | 3532 | /// a root agent. |
3560 | /// </summary> | 3533 | /// </summary> |
3534 | /// | ||
3535 | /* only called from on place, do done inline there | ||
3561 | private void ValidateAndSendAppearanceAndAgentData() | 3536 | private void ValidateAndSendAppearanceAndAgentData() |
3562 | { | 3537 | { |
3563 | //m_log.DebugFormat("[SCENE PRESENCE] SendInitialData: {0} ({1})", Name, UUID); | 3538 | //m_log.DebugFormat("[SCENE PRESENCE] SendInitialData: {0} ({1})", Name, UUID); |
@@ -3579,11 +3554,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
3579 | m_scene.AvatarFactory.QueueAppearanceSave(UUID); | 3554 | m_scene.AvatarFactory.QueueAppearanceSave(UUID); |
3580 | } | 3555 | } |
3581 | 3556 | ||
3557 | // send avatar object to all viewers so they cross it into region | ||
3582 | bool newhide = m_currentParcelHide; | 3558 | bool newhide = m_currentParcelHide; |
3583 | m_currentParcelHide = false; | 3559 | m_currentParcelHide = false; |
3584 | 3560 | ||
3585 | SendAvatarDataToAllAgents(); | 3561 | SendAvatarDataToAllAgents(); |
3586 | 3562 | ||
3563 | // now hide | ||
3587 | if (newhide) | 3564 | if (newhide) |
3588 | { | 3565 | { |
3589 | ParcelLoginCheck(m_currentParcelUUID); | 3566 | ParcelLoginCheck(m_currentParcelUUID); |
@@ -3592,14 +3569,14 @@ namespace OpenSim.Region.Framework.Scenes | |||
3592 | 3569 | ||
3593 | SendAppearanceToAgent(this); | 3570 | SendAppearanceToAgent(this); |
3594 | 3571 | ||
3595 | // if (cachedappearance) | 3572 | m_inTransit = false; |
3596 | // { | 3573 | |
3597 | SendAppearanceToAllOtherAgents(); | 3574 | SendAppearanceToAllOtherAgents(); |
3598 | // } | 3575 | |
3599 | if(Animator!= null) | 3576 | if(Animator!= null) |
3600 | Animator.SendAnimPack(); | 3577 | Animator.SendAnimPack(); |
3601 | } | 3578 | } |
3602 | 3579 | */ | |
3603 | /// <summary> | 3580 | /// <summary> |
3604 | /// Send avatar full data appearance and animations for all other root agents to this agent, this agent | 3581 | /// Send avatar full data appearance and animations for all other root agents to this agent, this agent |
3605 | /// can be either a child or root | 3582 | /// can be either a child or root |
@@ -3607,16 +3584,21 @@ namespace OpenSim.Region.Framework.Scenes | |||
3607 | public void SendOtherAgentsAvatarFullToMe() | 3584 | public void SendOtherAgentsAvatarFullToMe() |
3608 | { | 3585 | { |
3609 | int count = 0; | 3586 | int count = 0; |
3610 | m_scene.ForEachRootScenePresence(delegate(ScenePresence scenePresence) | 3587 | m_scene.ForEachRootScenePresence(delegate(ScenePresence p) |
3611 | { | 3588 | { |
3612 | // only send information about other root agents | 3589 | // only send information about other root agents |
3613 | if (scenePresence.UUID == UUID) | 3590 | if (p.UUID == UUID) |
3614 | return; | 3591 | return; |
3615 | 3592 | ||
3616 | scenePresence.SendAvatarDataToAgent(this); | 3593 | // get the avatar, then a kill if can't see it |
3617 | scenePresence.SendAppearanceToAgent(this); | 3594 | p.SendInitialAvatarDataToAgent(this); |
3618 | scenePresence.SendAnimPackToAgent(this); | 3595 | |
3619 | // for now attachments are sent with all SOG | 3596 | if (p.ParcelHideThisAvatar && currentParcelUUID != p.currentParcelUUID && GodLevel < 200) |
3597 | return; | ||
3598 | |||
3599 | p.SendAppearanceToAgentNF(this); | ||
3600 | p.SendAnimPackToAgentNF(this); | ||
3601 | p.SendAttachmentsToAgentNF(this); | ||
3620 | count++; | 3602 | count++; |
3621 | }); | 3603 | }); |
3622 | 3604 | ||
@@ -3636,7 +3618,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
3636 | m_log.WarnFormat( | 3618 | m_log.WarnFormat( |
3637 | "[SCENE PRESENCE]: Attempt to send avatar data from a child agent for {0} in {1}", | 3619 | "[SCENE PRESENCE]: Attempt to send avatar data from a child agent for {0} in {1}", |
3638 | Name, Scene.RegionInfo.RegionName); | 3620 | Name, Scene.RegionInfo.RegionName); |
3639 | |||
3640 | return; | 3621 | return; |
3641 | } | 3622 | } |
3642 | 3623 | ||
@@ -3652,6 +3633,36 @@ namespace OpenSim.Region.Framework.Scenes | |||
3652 | m_scene.StatsReporter.AddAgentUpdates(count); | 3633 | m_scene.StatsReporter.AddAgentUpdates(count); |
3653 | } | 3634 | } |
3654 | 3635 | ||
3636 | // sends avatar object to all clients so they cross it into region | ||
3637 | // then sends kills to hide | ||
3638 | public void SendInitialAvatarDataToAllAgents(List<ScenePresence> presences) | ||
3639 | { | ||
3640 | m_lastSize = Appearance.AvatarSize; | ||
3641 | int count = 0; | ||
3642 | |||
3643 | foreach (ScenePresence p in presences) | ||
3644 | { | ||
3645 | p.ControllingClient.SendAvatarDataImmediate(this); | ||
3646 | if (p != this && ParcelHideThisAvatar && currentParcelUUID != p.currentParcelUUID && p.GodLevel < 200) | ||
3647 | // either just kill the object | ||
3648 | // p.ControllingClient.SendKillObject(new List<uint> {LocalId}); | ||
3649 | // or also attachments viewer may still know about | ||
3650 | SendKillTo(p); | ||
3651 | count++; | ||
3652 | } | ||
3653 | m_scene.StatsReporter.AddAgentUpdates(count); | ||
3654 | } | ||
3655 | |||
3656 | public void SendInitialAvatarDataToAgent(ScenePresence p) | ||
3657 | { | ||
3658 | p.ControllingClient.SendAvatarDataImmediate(this); | ||
3659 | if (p != this && ParcelHideThisAvatar && currentParcelUUID != p.currentParcelUUID && p.GodLevel < 200) | ||
3660 | // either just kill the object | ||
3661 | // p.ControllingClient.SendKillObject(new List<uint> {LocalId}); | ||
3662 | // or also attachments viewer may still know about | ||
3663 | SendKillTo(p); | ||
3664 | } | ||
3665 | |||
3655 | /// <summary> | 3666 | /// <summary> |
3656 | /// Send avatar data to an agent. | 3667 | /// Send avatar data to an agent. |
3657 | /// </summary> | 3668 | /// </summary> |
@@ -3666,9 +3677,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
3666 | 3677 | ||
3667 | public void SendAvatarDataToAgentNF(ScenePresence avatar) | 3678 | public void SendAvatarDataToAgentNF(ScenePresence avatar) |
3668 | { | 3679 | { |
3669 | avatar.ControllingClient.SendAvatarDataImmediate(this); | 3680 | avatar.ControllingClient.SendAvatarDataImmediate(this); |
3670 | } | 3681 | } |
3671 | 3682 | ||
3672 | /// <summary> | 3683 | /// <summary> |
3673 | /// Send this agent's appearance to all other root and child agents in the scene | 3684 | /// Send this agent's appearance to all other root and child agents in the scene |
3674 | /// This agent must be root. | 3685 | /// This agent must be root. |
@@ -3714,6 +3725,12 @@ namespace OpenSim.Region.Framework.Scenes | |||
3714 | UUID, Appearance.VisualParams, Appearance.Texture.GetBytes()); | 3725 | UUID, Appearance.VisualParams, Appearance.Texture.GetBytes()); |
3715 | } | 3726 | } |
3716 | 3727 | ||
3728 | public void SendAppearanceToAgentNF(ScenePresence avatar) | ||
3729 | { | ||
3730 | avatar.ControllingClient.SendAppearance( | ||
3731 | UUID, Appearance.VisualParams, Appearance.Texture.GetBytes()); | ||
3732 | } | ||
3733 | |||
3717 | public void SendAnimPackToAgent(ScenePresence p) | 3734 | public void SendAnimPackToAgent(ScenePresence p) |
3718 | { | 3735 | { |
3719 | if (IsChildAgent || Animator == null) | 3736 | if (IsChildAgent || Animator == null) |
@@ -3725,6 +3742,29 @@ namespace OpenSim.Region.Framework.Scenes | |||
3725 | Animator.SendAnimPackToClient(p.ControllingClient); | 3742 | Animator.SendAnimPackToClient(p.ControllingClient); |
3726 | } | 3743 | } |
3727 | 3744 | ||
3745 | public void SendAnimPackToAgent(ScenePresence p, UUID[] animations, int[] seqs, UUID[] objectIDs) | ||
3746 | { | ||
3747 | if (IsChildAgent) | ||
3748 | return; | ||
3749 | |||
3750 | if (ParcelHideThisAvatar && currentParcelUUID != p.currentParcelUUID && p.GodLevel < 200) | ||
3751 | return; | ||
3752 | |||
3753 | p.ControllingClient.SendAnimations(animations, seqs, ControllingClient.AgentId, objectIDs); | ||
3754 | } | ||
3755 | |||
3756 | public void SendAnimPackToAgentNF(ScenePresence p) | ||
3757 | { | ||
3758 | if (IsChildAgent || Animator == null) | ||
3759 | return; | ||
3760 | Animator.SendAnimPackToClient(p.ControllingClient); | ||
3761 | } | ||
3762 | |||
3763 | public void SendAnimPackToAgentNF(ScenePresence p, UUID[] animations, int[] seqs, UUID[] objectIDs) | ||
3764 | { | ||
3765 | p.ControllingClient.SendAnimations(animations, seqs, ControllingClient.AgentId, objectIDs); | ||
3766 | } | ||
3767 | |||
3728 | public void SendAnimPack(UUID[] animations, int[] seqs, UUID[] objectIDs) | 3768 | public void SendAnimPack(UUID[] animations, int[] seqs, UUID[] objectIDs) |
3729 | { | 3769 | { |
3730 | if (IsChildAgent) | 3770 | if (IsChildAgent) |
@@ -4136,19 +4176,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
4136 | cAgent.Far = DrawDistance; | 4176 | cAgent.Far = DrawDistance; |
4137 | 4177 | ||
4138 | // Throttles | 4178 | // Throttles |
4139 | float multiplier = 1; | 4179 | cAgent.Throttles = ControllingClient.GetThrottlesPacked(1); |
4140 | |||
4141 | /* this is also used to send to new main regions not children | ||
4142 | |||
4143 | int childRegions = KnownRegionCount; | ||
4144 | if (childRegions != 0) | ||
4145 | multiplier = 1f / childRegions; | ||
4146 | |||
4147 | // Minimum throttle for a child region is 1/4 of the root region throttle | ||
4148 | if (multiplier <= 0.25f) | ||
4149 | multiplier = 0.25f; | ||
4150 | */ | ||
4151 | cAgent.Throttles = ControllingClient.GetThrottlesPacked(multiplier); | ||
4152 | 4180 | ||
4153 | cAgent.HeadRotation = m_headrotation; | 4181 | cAgent.HeadRotation = m_headrotation; |
4154 | cAgent.BodyRotation = Rotation; | 4182 | cAgent.BodyRotation = Rotation; |
@@ -4729,9 +4757,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
4729 | { | 4757 | { |
4730 | if (p != this && sog.HasPrivateAttachmentPoint) | 4758 | if (p != this && sog.HasPrivateAttachmentPoint) |
4731 | return; | 4759 | return; |
4760 | |||
4732 | if (ParcelHideThisAvatar && currentParcelUUID != p.currentParcelUUID && p.GodLevel < 200) | 4761 | if (ParcelHideThisAvatar && currentParcelUUID != p.currentParcelUUID && p.GodLevel < 200) |
4733 | return; | 4762 | return; |
4734 | sog.SendFullUpdateToClient(p.ControllingClient); | 4763 | |
4764 | SendAttachmentFullUpdateToAgentNF(sog, p); | ||
4735 | SendFullUpdateToClient(p.ControllingClient); // resend our data by updates path | 4765 | SendFullUpdateToClient(p.ControllingClient); // resend our data by updates path |
4736 | }); | 4766 | }); |
4737 | } | 4767 | } |
@@ -4746,163 +4776,235 @@ namespace OpenSim.Region.Framework.Scenes | |||
4746 | { | 4776 | { |
4747 | foreach (SceneObjectGroup sog in m_attachments) | 4777 | foreach (SceneObjectGroup sog in m_attachments) |
4748 | { | 4778 | { |
4749 | if (p == this || !sog.HasPrivateAttachmentPoint) | 4779 | SendAttachmentFullUpdateToAgentNF(sog, p); |
4750 | { | ||
4751 | p.ControllingClient.SendPartFullUpdate(sog.RootPart, LocalId + 1); | ||
4752 | sog.SendFullUpdateToClient(p.ControllingClient); | ||
4753 | } | ||
4754 | } | 4780 | } |
4755 | SendFullUpdateToClient(p.ControllingClient); // resend our data by updates path | 4781 | SendFullUpdateToClient(p.ControllingClient); // resend our data by updates path |
4756 | } | 4782 | } |
4757 | } | 4783 | } |
4758 | 4784 | ||
4759 | // send attachments to a client without filters except for huds | 4785 | public void SendAttachmentFullUpdateToAgentNF(SceneObjectGroup sog, ScenePresence p) |
4760 | // for now they are checked in several places down the line... | ||
4761 | // kills all parts before sending | ||
4762 | public void SendAttachmentsToAgentNFPK(ScenePresence p) | ||
4763 | { | 4786 | { |
4764 | lock (m_attachments) | 4787 | if (p != this && sog.HasPrivateAttachmentPoint) |
4765 | { | 4788 | return; |
4766 | List<uint> pk = new List<uint>(); | ||
4767 | foreach (SceneObjectGroup sog in m_attachments) | ||
4768 | { | ||
4769 | foreach (SceneObjectPart part in sog.Parts) | ||
4770 | pk.Add(part.LocalId); | ||
4771 | } | ||
4772 | 4789 | ||
4773 | p.ControllingClient.SendKillObject(pk); | 4790 | SceneObjectPart[] parts = sog.Parts; |
4791 | SceneObjectPart rootpart = sog.RootPart; | ||
4774 | 4792 | ||
4775 | foreach (SceneObjectGroup sog in m_attachments) | 4793 | p.ControllingClient.SendEntityUpdate(rootpart, PrimUpdateFlags.FullUpdate); |
4776 | { | 4794 | |
4777 | if (p == this || !sog.HasPrivateAttachmentPoint) | 4795 | for (int i = 0; i < parts.Length; i++) |
4778 | sog.SendFullUpdateToClient(p.ControllingClient); | 4796 | { |
4779 | } | 4797 | SceneObjectPart part = parts[i]; |
4780 | SendFullUpdateToClient(p.ControllingClient); // resend our data by updates path | 4798 | if (part == rootpart) |
4799 | continue; | ||
4800 | p.ControllingClient.SendEntityUpdate(part, PrimUpdateFlags.FullUpdate); | ||
4781 | } | 4801 | } |
4782 | } | 4802 | } |
4783 | 4803 | ||
4784 | |||
4785 | public void SendAttachmentScheduleUpdate(SceneObjectGroup sog) | 4804 | public void SendAttachmentScheduleUpdate(SceneObjectGroup sog) |
4786 | { | 4805 | { |
4787 | if (IsChildAgent) | 4806 | if (IsChildAgent || IsInTransit) |
4788 | return; | 4807 | return; |
4789 | 4808 | ||
4790 | m_scene.ForEachScenePresence(delegate(ScenePresence p) | 4809 | SceneObjectPart[] origparts = sog.Parts; |
4810 | SceneObjectPart[] parts = new SceneObjectPart[origparts.Length]; | ||
4811 | PrimUpdateFlags[] flags = new PrimUpdateFlags[origparts.Length]; | ||
4812 | |||
4813 | SceneObjectPart rootpart = sog.RootPart; | ||
4814 | UpdateRequired rootreq = sog.RootPart.UpdateFlag; | ||
4815 | |||
4816 | int j = 0; | ||
4817 | bool allterse = true; | ||
4818 | |||
4819 | for (int i = 0; i < origparts.Length; i++) | ||
4791 | { | 4820 | { |
4792 | if (p != this && sog.HasPrivateAttachmentPoint) | 4821 | switch (origparts[i].UpdateFlag) |
4793 | return; | 4822 | { |
4794 | if (ParcelHideThisAvatar && currentParcelUUID != p.currentParcelUUID && p.GodLevel < 200) | 4823 | case UpdateRequired.TERSE: |
4795 | return; | 4824 | flags[j] = PrimUpdateFlags.Position | PrimUpdateFlags.Rotation | PrimUpdateFlags.Velocity |
4825 | | PrimUpdateFlags.Acceleration | PrimUpdateFlags.AngularVelocity; | ||
4826 | parts[j] = origparts[i]; | ||
4827 | j++; | ||
4828 | break; | ||
4796 | 4829 | ||
4797 | SceneObjectPart[] parts = sog.Parts; | 4830 | case UpdateRequired.FULL: |
4831 | flags[j] = PrimUpdateFlags.FullUpdate; | ||
4832 | parts[j] = origparts[i]; | ||
4833 | j++; | ||
4834 | allterse = false; | ||
4835 | break; | ||
4836 | } | ||
4837 | origparts[i].UpdateFlag = 0; | ||
4838 | } | ||
4798 | 4839 | ||
4799 | for (int i = 0; i < parts.Length; i++) | 4840 | if (j == 0) |
4841 | return; | ||
4842 | |||
4843 | if (rootreq == UpdateRequired.NONE) | ||
4844 | { | ||
4845 | if (allterse) | ||
4846 | rootreq = UpdateRequired.TERSE; | ||
4847 | else | ||
4848 | rootreq = UpdateRequired.FULL; | ||
4849 | } | ||
4850 | |||
4851 | PrimUpdateFlags rootflag = PrimUpdateFlags.FullUpdate; | ||
4852 | if (rootreq == UpdateRequired.TERSE) | ||
4853 | rootflag = PrimUpdateFlags.Position | PrimUpdateFlags.Rotation | PrimUpdateFlags.Velocity | ||
4854 | | PrimUpdateFlags.Acceleration | PrimUpdateFlags.AngularVelocity; | ||
4855 | |||
4856 | int nparts = j; | ||
4857 | |||
4858 | bool priv = sog.HasPrivateAttachmentPoint; | ||
4859 | |||
4860 | List<ScenePresence> allPresences = m_scene.GetScenePresences(); | ||
4861 | foreach (ScenePresence p in allPresences) | ||
4862 | { | ||
4863 | if (p != this) | ||
4864 | { | ||
4865 | if (priv || | ||
4866 | (ParcelHideThisAvatar && currentParcelUUID != p.currentParcelUUID && p.GodLevel < 200)) | ||
4867 | continue; | ||
4868 | } | ||
4869 | |||
4870 | p.ControllingClient.SendEntityUpdate(rootpart, rootflag); | ||
4871 | |||
4872 | for (int i = 0; i < nparts; i++) | ||
4800 | { | 4873 | { |
4801 | SceneObjectPart part = parts[i]; | 4874 | SceneObjectPart part = parts[i]; |
4802 | if (part.UpdateFlag == UpdateRequired.TERSE) | 4875 | if (part == rootpart) |
4803 | { | 4876 | continue; |
4804 | p.ControllingClient.SendEntityUpdate(part, | 4877 | p.ControllingClient.SendEntityUpdate(part, flags[i]); |
4805 | PrimUpdateFlags.Position | PrimUpdateFlags.Rotation | PrimUpdateFlags.Velocity | ||
4806 | | PrimUpdateFlags.Acceleration | PrimUpdateFlags.AngularVelocity); | ||
4807 | part.UpdateFlag = 0; | ||
4808 | } | ||
4809 | else if (part.UpdateFlag == UpdateRequired.FULL) | ||
4810 | { | ||
4811 | p.ControllingClient.SendEntityUpdate(part, PrimUpdateFlags.FullUpdate); | ||
4812 | part.UpdateFlag = 0; | ||
4813 | } | ||
4814 | } | 4878 | } |
4815 | }); | 4879 | } |
4816 | } | 4880 | } |
4817 | 4881 | ||
4818 | public void SendAttachmentScheduleUpdate(SceneObjectPart part) | 4882 | public void SendAttachmentUpdate(SceneObjectGroup sog, UpdateRequired UpdateFlag) |
4819 | { | 4883 | { |
4820 | if (IsChildAgent) | 4884 | if (IsChildAgent || IsInTransit) |
4821 | return; | 4885 | return; |
4822 | 4886 | ||
4823 | m_scene.ForEachScenePresence(delegate(ScenePresence p) | 4887 | PrimUpdateFlags flag; |
4888 | switch (UpdateFlag) | ||
4824 | { | 4889 | { |
4825 | if (p != this && part.ParentGroup.HasPrivateAttachmentPoint) | 4890 | case UpdateRequired.TERSE: |
4826 | return; | 4891 | flag = PrimUpdateFlags.Position | PrimUpdateFlags.Rotation | PrimUpdateFlags.Velocity |
4892 | | PrimUpdateFlags.Acceleration | PrimUpdateFlags.AngularVelocity; | ||
4893 | break; | ||
4827 | 4894 | ||
4828 | if (ParcelHideThisAvatar && currentParcelUUID != p.currentParcelUUID && p.GodLevel < 200) | 4895 | case UpdateRequired.FULL: |
4896 | flag = PrimUpdateFlags.FullUpdate; | ||
4897 | break; | ||
4898 | |||
4899 | default: | ||
4829 | return; | 4900 | return; |
4901 | } | ||
4902 | |||
4903 | SceneObjectPart[] parts = sog.Parts; | ||
4904 | SceneObjectPart rootpart = sog.RootPart; | ||
4830 | 4905 | ||
4831 | if (part.UpdateFlag == UpdateRequired.TERSE) | 4906 | bool priv = sog.HasPrivateAttachmentPoint; |
4907 | |||
4908 | List<ScenePresence> allPresences = m_scene.GetScenePresences(); | ||
4909 | foreach (ScenePresence p in allPresences) | ||
4910 | { | ||
4911 | if (p != this) | ||
4832 | { | 4912 | { |
4833 | p.ControllingClient.SendEntityUpdate(part, | 4913 | if (priv || |
4834 | PrimUpdateFlags.Position | PrimUpdateFlags.Rotation | PrimUpdateFlags.Velocity | 4914 | (ParcelHideThisAvatar && currentParcelUUID != p.currentParcelUUID && p.GodLevel < 200)) |
4835 | | PrimUpdateFlags.Acceleration | PrimUpdateFlags.AngularVelocity); | 4915 | continue; |
4836 | part.UpdateFlag = 0; | ||
4837 | } | 4916 | } |
4838 | else if (part.UpdateFlag == UpdateRequired.FULL) | 4917 | |
4918 | p.ControllingClient.SendEntityUpdate(rootpart, flag); | ||
4919 | rootpart.UpdateFlag = 0; | ||
4920 | |||
4921 | for (int i = 0; i < parts.Length; i++) | ||
4839 | { | 4922 | { |
4840 | p.ControllingClient.SendEntityUpdate(part, PrimUpdateFlags.FullUpdate); | 4923 | SceneObjectPart part = parts[i]; |
4924 | if (part == rootpart) | ||
4925 | continue; | ||
4926 | p.ControllingClient.SendEntityUpdate(part, flag); | ||
4841 | part.UpdateFlag = 0; | 4927 | part.UpdateFlag = 0; |
4842 | } | 4928 | } |
4843 | }); | 4929 | } |
4844 | } | 4930 | } |
4845 | 4931 | ||
4846 | public void SendAttachmentUpdate(SceneObjectGroup sog, UpdateRequired UpdateFlag) | 4932 | public void SendAttachmentScheduleUpdate(SceneObjectPart part) |
4847 | { | 4933 | { |
4848 | if (IsChildAgent) | 4934 | if (IsChildAgent || IsInTransit) |
4849 | return; | 4935 | return; |
4850 | 4936 | ||
4851 | m_scene.ForEachScenePresence(delegate(ScenePresence p) | 4937 | |
4938 | PrimUpdateFlags flag; | ||
4939 | switch (part.UpdateFlag) | ||
4852 | { | 4940 | { |
4853 | if (p != this && sog.HasPrivateAttachmentPoint) | 4941 | case UpdateRequired.TERSE: |
4854 | return; | 4942 | flag = PrimUpdateFlags.Position | PrimUpdateFlags.Rotation | PrimUpdateFlags.Velocity |
4943 | | PrimUpdateFlags.Acceleration | PrimUpdateFlags.AngularVelocity; | ||
4944 | break; | ||
4855 | 4945 | ||
4856 | if (ParcelHideThisAvatar && currentParcelUUID != p.currentParcelUUID && p.GodLevel < 200) | 4946 | case UpdateRequired.FULL: |
4947 | flag = PrimUpdateFlags.FullUpdate; | ||
4948 | break; | ||
4949 | |||
4950 | default: | ||
4857 | return; | 4951 | return; |
4952 | } | ||
4858 | 4953 | ||
4859 | SceneObjectPart[] parts = sog.Parts; | 4954 | bool priv = part.ParentGroup.HasPrivateAttachmentPoint; |
4860 | 4955 | ||
4861 | for (int i = 0; i < parts.Length; i++) | 4956 | List<ScenePresence> allPresences = m_scene.GetScenePresences(); |
4957 | foreach (ScenePresence p in allPresences) | ||
4958 | { | ||
4959 | if (p != this) | ||
4862 | { | 4960 | { |
4863 | SceneObjectPart part = parts[i]; | 4961 | |
4864 | if (UpdateFlag == UpdateRequired.TERSE) | 4962 | if (priv || |
4865 | { | 4963 | (ParcelHideThisAvatar && currentParcelUUID != p.currentParcelUUID && p.GodLevel < 200)) |
4866 | p.ControllingClient.SendEntityUpdate(part, | 4964 | continue; |
4867 | PrimUpdateFlags.Position | PrimUpdateFlags.Rotation | PrimUpdateFlags.Velocity | ||
4868 | | PrimUpdateFlags.Acceleration | PrimUpdateFlags.AngularVelocity); | ||
4869 | part.UpdateFlag = 0; | ||
4870 | } | ||
4871 | else if (UpdateFlag == UpdateRequired.FULL) | ||
4872 | { | ||
4873 | p.ControllingClient.SendEntityUpdate(part, PrimUpdateFlags.FullUpdate); | ||
4874 | part.UpdateFlag = 0; | ||
4875 | } | ||
4876 | } | 4965 | } |
4877 | }); | 4966 | |
4967 | p.ControllingClient.SendEntityUpdate(part, flag); | ||
4968 | part.UpdateFlag = 0; | ||
4969 | } | ||
4878 | } | 4970 | } |
4879 | 4971 | ||
4880 | public void SendAttachmentUpdate(SceneObjectPart part, UpdateRequired UpdateFlag) | 4972 | public void SendAttachmentUpdate(SceneObjectPart part, UpdateRequired UpdateFlag) |
4881 | { | 4973 | { |
4882 | if (IsChildAgent) | 4974 | if (IsChildAgent || IsInTransit) |
4883 | return; | 4975 | return; |
4884 | 4976 | ||
4885 | m_scene.ForEachScenePresence(delegate(ScenePresence p) | 4977 | PrimUpdateFlags flag; |
4978 | switch (UpdateFlag) | ||
4886 | { | 4979 | { |
4887 | if (p != this && part.ParentGroup.HasPrivateAttachmentPoint) | 4980 | case UpdateRequired.TERSE: |
4888 | return; | 4981 | flag = PrimUpdateFlags.Position | PrimUpdateFlags.Rotation | PrimUpdateFlags.Velocity |
4982 | | PrimUpdateFlags.Acceleration | PrimUpdateFlags.AngularVelocity; | ||
4983 | break; | ||
4889 | 4984 | ||
4890 | if (ParcelHideThisAvatar && currentParcelUUID != p.currentParcelUUID && p.GodLevel < 200) | 4985 | case UpdateRequired.FULL: |
4986 | flag = PrimUpdateFlags.FullUpdate; | ||
4987 | break; | ||
4988 | |||
4989 | default: | ||
4891 | return; | 4990 | return; |
4991 | } | ||
4892 | 4992 | ||
4893 | if (UpdateFlag == UpdateRequired.TERSE) | 4993 | bool priv = part.ParentGroup.HasPrivateAttachmentPoint; |
4894 | { | 4994 | |
4895 | p.ControllingClient.SendEntityUpdate(part, | 4995 | List<ScenePresence> allPresences = m_scene.GetScenePresences(); |
4896 | PrimUpdateFlags.Position | PrimUpdateFlags.Rotation | PrimUpdateFlags.Velocity | 4996 | foreach (ScenePresence p in allPresences) |
4897 | | PrimUpdateFlags.Acceleration | PrimUpdateFlags.AngularVelocity); | 4997 | { |
4898 | part.UpdateFlag = 0; | 4998 | if (p != this) |
4899 | } | ||
4900 | else if (UpdateFlag == UpdateRequired.FULL) | ||
4901 | { | 4999 | { |
4902 | p.ControllingClient.SendEntityUpdate(part, PrimUpdateFlags.FullUpdate); | 5000 | if ( priv || |
4903 | part.UpdateFlag = 0; | 5001 | (ParcelHideThisAvatar && currentParcelUUID != p.currentParcelUUID && p.GodLevel < 200)) |
5002 | continue; | ||
4904 | } | 5003 | } |
4905 | }); | 5004 | |
5005 | p.ControllingClient.SendEntityUpdate(part, flag); | ||
5006 | part.UpdateFlag = 0; | ||
5007 | } | ||
4906 | } | 5008 | } |
4907 | 5009 | ||
4908 | /// <summary> | 5010 | /// <summary> |
@@ -5650,153 +5752,23 @@ namespace OpenSim.Region.Framework.Scenes | |||
5650 | 5752 | ||
5651 | private void parcelGodCheck(UUID currentParcelID, bool isGod) | 5753 | private void parcelGodCheck(UUID currentParcelID, bool isGod) |
5652 | { | 5754 | { |
5653 | List<ScenePresence> allpresences = null; | 5755 | List<ScenePresence> allpresences = m_scene.GetScenePresences(); |
5654 | |||
5655 | |||
5656 | allpresences = m_scene.GetScenePresences(); | ||
5657 | |||
5658 | if (isGod) | ||
5659 | { | ||
5660 | List<ScenePresence> viewsToSendme = new List<ScenePresence>(); | ||
5661 | |||
5662 | foreach (ScenePresence p in allpresences) | ||
5663 | { | ||
5664 | if (p.IsDeleted || p == this || p.ControllingClient == null || !p.ControllingClient.IsActive) | ||
5665 | continue; | ||
5666 | |||
5667 | if (p.ParcelHideThisAvatar && p.currentParcelUUID != currentParcelID) | ||
5668 | { | ||
5669 | viewsToSendme.Add(p); // i see them | ||
5670 | } | ||
5671 | } | ||
5672 | |||
5673 | if (viewsToSendme.Count > 0) | ||
5674 | { | ||
5675 | foreach (ScenePresence p in viewsToSendme) | ||
5676 | { | ||
5677 | if (p.IsChildAgent) | ||
5678 | continue; | ||
5679 | |||
5680 | p.SendAvatarDataToAgentNF(this); | ||
5681 | p.SendAppearanceToAgent(this); | ||
5682 | if (p.Animator != null) | ||
5683 | p.Animator.SendAnimPackToClient(ControllingClient); | ||
5684 | p.SendAttachmentsToAgentNF(this); | ||
5685 | } | ||
5686 | } | ||
5687 | } | ||
5688 | else | ||
5689 | { | ||
5690 | List<ScenePresence> killsToSendme = new List<ScenePresence>(); | ||
5691 | |||
5692 | foreach (ScenePresence p in allpresences) | ||
5693 | { | ||
5694 | if (p.IsDeleted || p == this || p.ControllingClient == null || !p.ControllingClient.IsActive) | ||
5695 | continue; | ||
5696 | |||
5697 | if (p.ParcelHideThisAvatar && p.currentParcelUUID != currentParcelID) | ||
5698 | { | ||
5699 | killsToSendme.Add(p); | ||
5700 | } | ||
5701 | } | ||
5702 | |||
5703 | if (killsToSendme.Count > 0) | ||
5704 | { | ||
5705 | foreach (ScenePresence p in killsToSendme) | ||
5706 | { | ||
5707 | m_log.Debug("[AVATAR]: killMe: " + Lastname + " " + p.Lastname); | ||
5708 | try { ControllingClient.SendKillObject(new List<uint> { p.LocalId }); } | ||
5709 | catch (NullReferenceException) { } | ||
5710 | } | ||
5711 | } | ||
5712 | } | ||
5713 | |||
5714 | } | ||
5715 | |||
5716 | private void ParcelLoginCheck(UUID currentParcelID) | ||
5717 | { | ||
5718 | List<ScenePresence> killsToSendto = new List<ScenePresence>(); | ||
5719 | List<uint> killsToSendme = new List<uint>(); | ||
5720 | List<ScenePresence> viewsToSendto = new List<ScenePresence>(); | ||
5721 | List<ScenePresence> viewsToSendme = new List<ScenePresence>(); | ||
5722 | List<ScenePresence> allpresences = null; | ||
5723 | |||
5724 | allpresences = m_scene.GetScenePresences(); | ||
5725 | 5756 | ||
5726 | foreach (ScenePresence p in allpresences) | 5757 | foreach (ScenePresence p in allpresences) |
5727 | { | 5758 | { |
5728 | if (p.IsDeleted || p == this || p.ControllingClient == null || !p.ControllingClient.IsActive) | 5759 | if (p.IsDeleted || p.IsChildAgent || p == this || p.ControllingClient == null || !p.ControllingClient.IsActive) |
5729 | continue; | 5760 | continue; |
5730 | |||
5731 | if (currentParcelID != p.currentParcelUUID) | ||
5732 | { | ||
5733 | if (p.GodLevel < 200) | ||
5734 | killsToSendto.Add(p); | ||
5735 | // if (GodLevel < 200 && p.ParcelHideThisAvatar) | ||
5736 | // killsToSendme.Add(p.LocalId); | ||
5737 | } | ||
5738 | else | ||
5739 | { | ||
5740 | viewsToSendto.Add(p); | ||
5741 | viewsToSendme.Add(p); | ||
5742 | } | ||
5743 | } | ||
5744 | allpresences.Clear(); | ||
5745 | |||
5746 | // send the things | ||
5747 | // kill main avatar object | ||
5748 | if (killsToSendto.Count > 0 && PresenceType != PresenceType.Npc) | ||
5749 | { | ||
5750 | foreach (ScenePresence p in killsToSendto) | ||
5751 | { | ||
5752 | m_log.Debug("[AVATAR]: killTo: " + Lastname + " " + p.Lastname); | ||
5753 | try { p.ControllingClient.SendKillObject(new List<uint> { LocalId }); } | ||
5754 | catch (NullReferenceException) { } | ||
5755 | } | ||
5756 | } | ||
5757 | |||
5758 | if (killsToSendme.Count > 0) | ||
5759 | { | ||
5760 | m_log.Debug("[AVATAR]: killMe: " + Lastname + " " + killsToSendme.Count.ToString()); | ||
5761 | try | ||
5762 | { | ||
5763 | ControllingClient.SendKillObject(killsToSendme); | ||
5764 | } | ||
5765 | catch (NullReferenceException) { } | ||
5766 | 5761 | ||
5767 | } | 5762 | if (p.ParcelHideThisAvatar && p.currentParcelUUID != currentParcelID) |
5768 | /* | ||
5769 | if (viewsToSendto.Count > 0 && PresenceType != PresenceType.Npc) | ||
5770 | { | ||
5771 | foreach (ScenePresence p in viewsToSendto) | ||
5772 | { | ||
5773 | m_log.Debug("[AVATAR]: viewTo: " + Lastname + " " + p.Lastname); | ||
5774 | p.ControllingClient.SendAvatarDataImmediate(this); | ||
5775 | SendAppearanceToAgent(p); | ||
5776 | SendAttachmentsToClient(p.ControllingClient); | ||
5777 | if (Animator != null) | ||
5778 | Animator.SendAnimPackToClient(p.ControllingClient); | ||
5779 | } | ||
5780 | } | ||
5781 | |||
5782 | if (viewsToSendme.Count > 0) | ||
5783 | { | ||
5784 | foreach (ScenePresence p in viewsToSendme) | ||
5785 | { | 5763 | { |
5786 | m_log.Debug("[AVATAR]: viewMe: " + Lastname + "<-" + p.Lastname); | 5764 | if (isGod) |
5787 | if (p.IsChildAgent) | 5765 | p.SendViewTo(this); |
5788 | continue; | 5766 | else |
5789 | ControllingClient.SendAvatarDataImmediate(p); | 5767 | p.SendKillTo(this); |
5790 | p.SendAppearanceToAgent(this); | ||
5791 | p.SendAttachmentsToClient(ControllingClient); | ||
5792 | if (p.Animator != null) | ||
5793 | p.Animator.SendAnimPackToClient(ControllingClient); | ||
5794 | } | 5768 | } |
5795 | } | 5769 | } |
5796 | */ | ||
5797 | } | 5770 | } |
5798 | 5771 | ||
5799 | |||
5800 | public void parcelRegionCross() | 5772 | public void parcelRegionCross() |
5801 | { | 5773 | { |
5802 | if (!ParcelHideThisAvatar || GodLevel >= 200) | 5774 | if (!ParcelHideThisAvatar || GodLevel >= 200) |
@@ -5805,26 +5777,15 @@ namespace OpenSim.Region.Framework.Scenes | |||
5805 | List<ScenePresence> allpresences = null; | 5777 | List<ScenePresence> allpresences = null; |
5806 | allpresences = m_scene.GetScenePresences(); | 5778 | allpresences = m_scene.GetScenePresences(); |
5807 | 5779 | ||
5808 | List<uint> killsToSendme = new List<uint>(); | ||
5809 | |||
5810 | foreach (ScenePresence p in allpresences) | 5780 | foreach (ScenePresence p in allpresences) |
5811 | { | 5781 | { |
5812 | if (p.IsDeleted || p == this || p.ControllingClient == null || !p.ControllingClient.IsActive) | 5782 | if (p.IsDeleted || p == this || p.IsChildAgent || p.ControllingClient == null || !p.ControllingClient.IsActive) |
5813 | continue; | 5783 | continue; |
5814 | 5784 | ||
5815 | if (p.currentParcelUUID == m_currentParcelUUID) | 5785 | if (p.currentParcelUUID == m_currentParcelUUID) |
5816 | { | 5786 | { |
5817 | killsToSendme.Add(p.LocalId); | 5787 | p.SendKillTo(this); |
5818 | } | ||
5819 | } | ||
5820 | |||
5821 | if (killsToSendme.Count > 0) | ||
5822 | { | ||
5823 | try | ||
5824 | { | ||
5825 | ControllingClient.SendKillObject(killsToSendme); | ||
5826 | } | 5788 | } |
5827 | catch (NullReferenceException) { } | ||
5828 | } | 5789 | } |
5829 | } | 5790 | } |
5830 | 5791 | ||
@@ -5832,15 +5793,12 @@ namespace OpenSim.Region.Framework.Scenes | |||
5832 | bool currentParcelHide, bool previusParcelHide, bool oldhide,bool check) | 5793 | bool currentParcelHide, bool previusParcelHide, bool oldhide,bool check) |
5833 | { | 5794 | { |
5834 | List<ScenePresence> killsToSendto = new List<ScenePresence>(); | 5795 | List<ScenePresence> killsToSendto = new List<ScenePresence>(); |
5835 | List<uint> killsToSendme = new List<uint>(); | 5796 | List<ScenePresence> killsToSendme = new List<ScenePresence>(); |
5836 | List<ScenePresence> viewsToSendto = new List<ScenePresence>(); | 5797 | List<ScenePresence> viewsToSendto = new List<ScenePresence>(); |
5837 | List<ScenePresence> viewsToSendme = new List<ScenePresence>(); | 5798 | List<ScenePresence> viewsToSendme = new List<ScenePresence>(); |
5838 | List<ScenePresence> allpresences = null; | 5799 | List<ScenePresence> allpresences = null; |
5839 | 5800 | ||
5840 | if (IsInTransit) | 5801 | if (IsInTransit || IsChildAgent) |
5841 | return; | ||
5842 | |||
5843 | if (IsChildAgent) | ||
5844 | return; | 5802 | return; |
5845 | 5803 | ||
5846 | if (check) | 5804 | if (check) |
@@ -5903,7 +5861,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
5903 | if(p.GodLevel < 200) | 5861 | if(p.GodLevel < 200) |
5904 | killsToSendto.Add(p); // they dont see me | 5862 | killsToSendto.Add(p); // they dont see me |
5905 | if(GodLevel < 200) | 5863 | if(GodLevel < 200) |
5906 | killsToSendme.Add(p.LocalId); // i dont see them | 5864 | killsToSendme.Add(p); // i dont see them |
5907 | } | 5865 | } |
5908 | // only those on new parcel need see | 5866 | // only those on new parcel need see |
5909 | if (currentParcelID == p.currentParcelUUID) | 5867 | if (currentParcelID == p.currentParcelUUID) |
@@ -5949,10 +5907,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
5949 | { | 5907 | { |
5950 | if (p.IsDeleted || p == this || p.ControllingClient == null || !p.ControllingClient.IsActive) | 5908 | if (p.IsDeleted || p == this || p.ControllingClient == null || !p.ControllingClient.IsActive) |
5951 | continue; | 5909 | continue; |
5952 | // only those old parcel need receive kills | 5910 | // only those old parcel need kills |
5953 | if (previusParcelID == p.currentParcelUUID && GodLevel < 200) | 5911 | if (previusParcelID == p.currentParcelUUID && GodLevel < 200) |
5954 | { | 5912 | { |
5955 | killsToSendme.Add(p.LocalId); // i dont see them | 5913 | killsToSendme.Add(p); // i dont see them |
5956 | } | 5914 | } |
5957 | else | 5915 | else |
5958 | { | 5916 | { |
@@ -5966,37 +5924,30 @@ namespace OpenSim.Region.Framework.Scenes | |||
5966 | } | 5924 | } |
5967 | 5925 | ||
5968 | // send the things | 5926 | // send the things |
5969 | // kill main avatar object | 5927 | |
5970 | if (killsToSendto.Count > 0 && PresenceType != PresenceType.Npc) | 5928 | if (killsToSendto.Count > 0) |
5971 | { | 5929 | { |
5972 | foreach (ScenePresence p in killsToSendto) | 5930 | foreach (ScenePresence p in killsToSendto) |
5973 | { | 5931 | { |
5974 | m_log.Debug("[AVATAR]: killTo: " + Lastname + " " + p.Lastname); | 5932 | m_log.Debug("[AVATAR]: killTo: " + Lastname + " " + p.Lastname); |
5975 | try { p.ControllingClient.SendKillObject(new List<uint> { LocalId }); } | 5933 | SendKillTo(p); |
5976 | catch (NullReferenceException) { } | ||
5977 | } | 5934 | } |
5978 | } | 5935 | } |
5979 | 5936 | ||
5980 | if (killsToSendme.Count > 0) | 5937 | if (killsToSendme.Count > 0) |
5981 | { | 5938 | { |
5982 | m_log.Debug("[AVATAR]: killtoMe: " + Lastname + " " + killsToSendme.Count.ToString()); | 5939 | foreach (ScenePresence p in killsToSendme) |
5983 | try | ||
5984 | { | 5940 | { |
5985 | ControllingClient.SendKillObject(killsToSendme); | 5941 | m_log.Debug("[AVATAR]: killToMe: " + Lastname + " " + p.Lastname); |
5942 | p.SendKillTo(this); | ||
5986 | } | 5943 | } |
5987 | catch (NullReferenceException) { } | ||
5988 | |||
5989 | } | 5944 | } |
5990 | 5945 | ||
5991 | if (viewsToSendto.Count > 0 && PresenceType != PresenceType.Npc) | 5946 | if (viewsToSendto.Count > 0) |
5992 | { | 5947 | { |
5993 | foreach (ScenePresence p in viewsToSendto) | 5948 | foreach (ScenePresence p in viewsToSendto) |
5994 | { | 5949 | { |
5995 | SendAvatarDataToAgentNF(p); | 5950 | SendViewTo(p); |
5996 | SendAppearanceToAgent(p); | ||
5997 | if (Animator != null) | ||
5998 | Animator.SendAnimPackToClient(p.ControllingClient); | ||
5999 | SendAttachmentsToAgentNF(p); | ||
6000 | } | 5951 | } |
6001 | } | 5952 | } |
6002 | 5953 | ||
@@ -6007,14 +5958,55 @@ namespace OpenSim.Region.Framework.Scenes | |||
6007 | if (p.IsChildAgent) | 5958 | if (p.IsChildAgent) |
6008 | continue; | 5959 | continue; |
6009 | // m_log.Debug("[AVATAR]: viewMe: " + Lastname + "<-" + p.Lastname); | 5960 | // m_log.Debug("[AVATAR]: viewMe: " + Lastname + "<-" + p.Lastname); |
6010 | 5961 | p.SendViewTo(this); | |
6011 | p.SendAvatarDataToAgentNF(this); | ||
6012 | p.SendAppearanceToAgent(this); | ||
6013 | if (p.Animator != null) | ||
6014 | p.Animator.SendAnimPackToClient(ControllingClient); | ||
6015 | p.SendAttachmentsToAgentNF(this); | ||
6016 | } | 5962 | } |
6017 | } | 5963 | } |
6018 | } | 5964 | } |
5965 | |||
5966 | public void HasMovedAway() | ||
5967 | { | ||
5968 | List<ScenePresence> allpresences = m_scene.GetScenePresences(); | ||
5969 | foreach (ScenePresence p in allpresences) | ||
5970 | { | ||
5971 | if (p == this) | ||
5972 | continue; | ||
5973 | SendKillTo(p); | ||
5974 | if (!p.IsChildAgent) | ||
5975 | p.SendKillTo(this); | ||
5976 | } | ||
5977 | if (Scene.AttachmentsModule != null) | ||
5978 | Scene.AttachmentsModule.DeleteAttachmentsFromScene(this, true); | ||
5979 | } | ||
5980 | |||
5981 | // kill with attachs root kills | ||
5982 | public void SendKillTo(ScenePresence p) | ||
5983 | { | ||
5984 | List<uint> ids = new List<uint>(m_attachments.Count + 1); | ||
5985 | foreach (SceneObjectGroup sog in m_attachments) | ||
5986 | { | ||
5987 | ids.Add(sog.RootPart.LocalId); | ||
5988 | } | ||
5989 | |||
5990 | ids.Add(LocalId); | ||
5991 | p.ControllingClient.SendKillObject(ids); | ||
5992 | } | ||
5993 | |||
5994 | /* | ||
5995 | // kill with hack | ||
5996 | public void SendKillTo(ScenePresence p) | ||
5997 | { | ||
5998 | foreach (SceneObjectGroup sog in m_attachments) | ||
5999 | p.ControllingClient.SendPartFullUpdate(sog.RootPart, LocalId + 1); | ||
6000 | p.ControllingClient.SendKillObject(new List<uint> { LocalId }); | ||
6001 | } | ||
6002 | */ | ||
6003 | public void SendViewTo(ScenePresence p) | ||
6004 | { | ||
6005 | SendAvatarDataToAgentNF(p); | ||
6006 | SendAppearanceToAgent(p); | ||
6007 | if (Animator != null) | ||
6008 | Animator.SendAnimPackToClient(p.ControllingClient); | ||
6009 | SendAttachmentsToAgentNF(p); | ||
6010 | } | ||
6019 | } | 6011 | } |
6020 | } | 6012 | } |