aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region
diff options
context:
space:
mode:
authorJeff Ames2007-12-10 15:08:44 +0000
committerJeff Ames2007-12-10 15:08:44 +0000
commit40fd37f95af68a213b0c3a465858c27fa7c8cfdf (patch)
tree27424718d3b777adee5088deecd813573223bc33 /OpenSim/Region
parentmore work on texture downloading. (diff)
downloadopensim-SC_OLD-40fd37f95af68a213b0c3a465858c27fa7c8cfdf.zip
opensim-SC_OLD-40fd37f95af68a213b0c3a465858c27fa7c8cfdf.tar.gz
opensim-SC_OLD-40fd37f95af68a213b0c3a465858c27fa7c8cfdf.tar.bz2
opensim-SC_OLD-40fd37f95af68a213b0c3a465858c27fa7c8cfdf.tar.xz
Refactored animation handling in ScenePresence. Now maintains a list of current animations.
* Fixes weirdness when typing and sitting at the same time * Should fix bug #32 (getting stuck in edit appearance pose) * Crouchwalk and possibly jump may need more looking into
Diffstat (limited to '')
-rw-r--r--OpenSim/Region/ClientStack/ClientView.cs23
-rw-r--r--OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs5
-rw-r--r--OpenSim/Region/Environment/Scenes/Scene.cs1
-rw-r--r--OpenSim/Region/Environment/Scenes/ScenePresence.cs179
-rw-r--r--OpenSim/Region/Examples/SimpleApp/MyNpcCharacter.cs7
5 files changed, 124 insertions, 91 deletions
diff --git a/OpenSim/Region/ClientStack/ClientView.cs b/OpenSim/Region/ClientStack/ClientView.cs
index 1a544b8..db25ee6 100644
--- a/OpenSim/Region/ClientStack/ClientView.cs
+++ b/OpenSim/Region/ClientStack/ClientView.cs
@@ -392,6 +392,7 @@ namespace OpenSim.Region.ClientStack
392 public event AgentSit OnAgentSit; 392 public event AgentSit OnAgentSit;
393 public event AvatarPickerRequest OnAvatarPickerRequest; 393 public event AvatarPickerRequest OnAvatarPickerRequest;
394 public event StartAnim OnStartAnim; 394 public event StartAnim OnStartAnim;
395 public event StopAnim OnStopAnim;
395 public event Action<IClientAPI> OnRequestAvatarsData; 396 public event Action<IClientAPI> OnRequestAvatarsData;
396 public event LinkObjects OnLinkObjects; 397 public event LinkObjects OnLinkObjects;
397 public event DelinkObjects OnDelinkObjects; 398 public event DelinkObjects OnDelinkObjects;
@@ -1265,7 +1266,7 @@ namespace OpenSim.Region.ClientStack
1265 OutPacket(avp, ThrottleOutPacketType.Task); 1266 OutPacket(avp, ThrottleOutPacketType.Task);
1266 } 1267 }
1267 1268
1268 public void SendAnimation(LLUUID animID, int seq, LLUUID sourceAgentId) 1269 public void SendAnimations(LLUUID[] animations, int[] seqs, LLUUID sourceAgentId)
1269 { 1270 {
1270 AvatarAnimationPacket ani = new AvatarAnimationPacket(); 1271 AvatarAnimationPacket ani = new AvatarAnimationPacket();
1271 ani.AnimationSourceList = new AvatarAnimationPacket.AnimationSourceListBlock[1]; 1272 ani.AnimationSourceList = new AvatarAnimationPacket.AnimationSourceListBlock[1];
@@ -1273,10 +1274,15 @@ namespace OpenSim.Region.ClientStack
1273 ani.AnimationSourceList[0].ObjectID = sourceAgentId; 1274 ani.AnimationSourceList[0].ObjectID = sourceAgentId;
1274 ani.Sender = new AvatarAnimationPacket.SenderBlock(); 1275 ani.Sender = new AvatarAnimationPacket.SenderBlock();
1275 ani.Sender.ID = sourceAgentId; 1276 ani.Sender.ID = sourceAgentId;
1276 ani.AnimationList = new AvatarAnimationPacket.AnimationListBlock[1]; 1277 ani.AnimationList = new AvatarAnimationPacket.AnimationListBlock[animations.Length];
1277 ani.AnimationList[0] = new AvatarAnimationPacket.AnimationListBlock(); 1278
1278 ani.AnimationList[0].AnimID = animID; 1279 for (int i = 0; i < animations.Length; ++i)
1279 ani.AnimationList[0].AnimSequenceID = seq; 1280 {
1281 ani.AnimationList[i] = new AvatarAnimationPacket.AnimationListBlock();
1282 ani.AnimationList[i].AnimID = animations[i];
1283 ani.AnimationList[i].AnimSequenceID = seqs[i];
1284 }
1285
1280 OutPacket(ani, ThrottleOutPacketType.Task); 1286 OutPacket(ani, ThrottleOutPacketType.Task);
1281 } 1287 }
1282 1288
@@ -2485,6 +2491,13 @@ namespace OpenSim.Region.ClientStack
2485 OnStartAnim(this, AgentAni.AnimationList[i].AnimID, 1); 2491 OnStartAnim(this, AgentAni.AnimationList[i].AnimID, 1);
2486 } 2492 }
2487 } 2493 }
2494 else
2495 {
2496 if (OnStopAnim != null)
2497 {
2498 OnStopAnim(this, AgentAni.AnimationList[i].AnimID);
2499 }
2500 }
2488 } 2501 }
2489 break; 2502 break;
2490 case PacketType.AgentRequestSit: 2503 case PacketType.AgentRequestSit:
diff --git a/OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs b/OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs
index 4fdfc32..07e5362 100644
--- a/OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs
+++ b/OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs
@@ -133,11 +133,6 @@ namespace OpenSim.Region.Environment.Scenes
133 } 133 }
134 } 134 }
135 135
136 public void StartAnimation(LLUUID animID, int seq, LLUUID agentId)
137 {
138 Broadcast(delegate(IClientAPI client) { client.SendAnimation(animID, seq, agentId); });
139 }
140
141 public virtual void ProcessObjectGrab(uint localID, LLVector3 offsetPos, IClientAPI remoteClient) 136 public virtual void ProcessObjectGrab(uint localID, LLVector3 offsetPos, IClientAPI remoteClient)
142 { 137 {
143 EventManager.TriggerObjectGrab(localID, offsetPos, remoteClient); 138 EventManager.TriggerObjectGrab(localID, offsetPos, remoteClient);
diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs
index e9d83a1..01bcd83 100644
--- a/OpenSim/Region/Environment/Scenes/Scene.cs
+++ b/OpenSim/Region/Environment/Scenes/Scene.cs
@@ -950,7 +950,6 @@ namespace OpenSim.Region.Environment.Scenes
950 950
951 protected virtual void SubscribeToClientEvents(IClientAPI client) 951 protected virtual void SubscribeToClientEvents(IClientAPI client)
952 { 952 {
953 // client.OnStartAnim += StartAnimation;
954 client.OnRegionHandShakeReply += SendLayerData; 953 client.OnRegionHandShakeReply += SendLayerData;
955 //remoteClient.OnRequestWearables += new GenericCall(this.GetInitialPrims); 954 //remoteClient.OnRequestWearables += new GenericCall(this.GetInitialPrims);
956 client.OnModifyTerrain += ModifyTerrain; 955 client.OnModifyTerrain += ModifyTerrain;
diff --git a/OpenSim/Region/Environment/Scenes/ScenePresence.cs b/OpenSim/Region/Environment/Scenes/ScenePresence.cs
index 21c0f3f..c277011 100644
--- a/OpenSim/Region/Environment/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Environment/Scenes/ScenePresence.cs
@@ -43,8 +43,8 @@ namespace OpenSim.Region.Environment.Scenes
43 public static AvatarAnimations Animations; 43 public static AvatarAnimations Animations;
44 public static byte[] DefaultTexture; 44 public static byte[] DefaultTexture;
45 45
46 public LLUUID CurrentAnimation; 46 private List<LLUUID> m_animations = new List<LLUUID>();
47 public int AnimationSeq; 47 private List<int> m_animationSeqs = new List<int>();
48 48
49 private bool m_updateflag = false; 49 private bool m_updateflag = false;
50 private byte m_movementflag = 0; 50 private byte m_movementflag = 0;
@@ -55,7 +55,6 @@ namespace OpenSim.Region.Environment.Scenes
55 private float m_sitAvatarHeight = 2.0f; 55 private float m_sitAvatarHeight = 2.0f;
56 private float m_godlevel = 0; 56 private float m_godlevel = 0;
57 57
58 private bool m_isTyping = false;
59 private bool m_setAlwaysRun = false; 58 private bool m_setAlwaysRun = false;
60 59
61 private Quaternion m_bodyRot; 60 private Quaternion m_bodyRot;
@@ -74,7 +73,6 @@ namespace OpenSim.Region.Environment.Scenes
74 private readonly Vector3[] Dir_Vectors = new Vector3[6]; 73 private readonly Vector3[] Dir_Vectors = new Vector3[6];
75 private LLVector3 lastPhysPos = new LLVector3(); 74 private LLVector3 lastPhysPos = new LLVector3();
76 75
77
78 // Position of agent's camera in world 76 // Position of agent's camera in world
79 protected Vector3 m_CameraCenter = new Vector3(0, 0, 0); 77 protected Vector3 m_CameraCenter = new Vector3(0, 0, 0);
80 78
@@ -286,6 +284,9 @@ namespace OpenSim.Region.Environment.Scenes
286 Animations = new AvatarAnimations(); 284 Animations = new AvatarAnimations();
287 Animations.LoadAnims(); 285 Animations.LoadAnims();
288 286
287 m_animations.Add(Animations.AnimsLLUUID["STAND"]);
288 m_animationSeqs.Add(1);
289
289 RegisterToEvents(); 290 RegisterToEvents();
290 291
291 SetDirectionVectors(); 292 SetDirectionVectors();
@@ -303,7 +304,6 @@ namespace OpenSim.Region.Environment.Scenes
303 m_scene.LandManager.sendLandUpdate(this); 304 m_scene.LandManager.sendLandUpdate(this);
304 } 305 }
305 306
306
307 public ScenePresence(IClientAPI client, Scene world, RegionInfo reginfo, AvatarAppearance appearance) 307 public ScenePresence(IClientAPI client, Scene world, RegionInfo reginfo, AvatarAppearance appearance)
308 { 308 {
309 //couldn't move the following into SetInitialValues as they are readonly 309 //couldn't move the following into SetInitialValues as they are readonly
@@ -319,6 +319,9 @@ namespace OpenSim.Region.Environment.Scenes
319 Animations = new AvatarAnimations(); 319 Animations = new AvatarAnimations();
320 Animations.LoadAnims(); 320 Animations.LoadAnims();
321 321
322 m_animations.Add(Animations.AnimsLLUUID["STAND"]);
323 m_animationSeqs.Add(1);
324
322 RegisterToEvents(); 325 RegisterToEvents();
323 SetDirectionVectors(); 326 SetDirectionVectors();
324 327
@@ -350,8 +353,9 @@ namespace OpenSim.Region.Environment.Scenes
350 m_controllingClient.OnAgentRequestSit += HandleAgentRequestSit; 353 m_controllingClient.OnAgentRequestSit += HandleAgentRequestSit;
351 m_controllingClient.OnAgentSit += HandleAgentSit; 354 m_controllingClient.OnAgentSit += HandleAgentSit;
352 m_controllingClient.OnSetAlwaysRun += HandleSetAlwaysRun; 355 m_controllingClient.OnSetAlwaysRun += HandleSetAlwaysRun;
356 m_controllingClient.OnStartAnim += HandleStartAnim;
357 m_controllingClient.OnStopAnim += HandleStopAnim;
353 358
354 // ControllingClient.OnStartAnim += new StartAnim(this.SendAnimPack);
355 // ControllingClient.OnChildAgentStatus += new StatusChange(this.ChildStatusChange); 359 // ControllingClient.OnChildAgentStatus += new StatusChange(this.ChildStatusChange);
356 //ControllingClient.OnStopMovement += new GenericCall2(this.StopMovement); 360 //ControllingClient.OnStopMovement += new GenericCall2(this.StopMovement);
357 } 361 }
@@ -786,7 +790,7 @@ namespace OpenSim.Region.Environment.Scenes
786 Velocity = new LLVector3(0, 0, 0); 790 Velocity = new LLVector3(0, 0, 0);
787 RemoveFromPhysicalScene(); 791 RemoveFromPhysicalScene();
788 792
789 SendAnimPack(Animations.AnimsLLUUID["SIT"], 1); 793 SetMovementAnimation(Animations.AnimsLLUUID["SIT"], 1);
790 SendFullUpdateToAllClients(); 794 SendFullUpdateToAllClients();
791 } 795 }
792 796
@@ -799,6 +803,57 @@ namespace OpenSim.Region.Environment.Scenes
799 } 803 }
800 } 804 }
801 805
806 public void AddAnimation(LLUUID animID, int seq)
807 {
808 if (!m_animations.Contains(animID))
809 {
810 m_animations.Add(animID);
811 m_animationSeqs.Add(seq);
812 SendAnimPack();
813 }
814 }
815
816 public void RemoveAnimation(LLUUID animID)
817 {
818 if (m_animations.Contains(animID))
819 {
820 if (m_animations[0] == animID)
821 {
822 SetMovementAnimation(Animations.AnimsLLUUID["STAND"], 1);
823 }
824 else
825 {
826 m_animations.Remove(animID);
827 SendAnimPack();
828 }
829 }
830 }
831
832 public void HandleStartAnim(IClientAPI remoteClient, LLUUID animID, int seq)
833 {
834 AddAnimation(animID, seq);
835 }
836
837 public void HandleStopAnim(IClientAPI remoteClient, LLUUID animID)
838 {
839 RemoveAnimation(animID);
840 }
841
842 /// <summary>
843 /// The movement animation is the first element of the animation list,
844 /// reserved for "main" animations that are mutually exclusive,
845 /// like flying and sitting, for example.
846 /// </summary>
847 protected void SetMovementAnimation(LLUUID anim, int seq)
848 {
849 if (m_animations[0] != anim)
850 {
851 m_animations[0] = anim;
852 m_animationSeqs[0] = seq;
853 SendAnimPack();
854 }
855 }
856
802 protected void UpdateMovementAnimations(bool update_movementflag) 857 protected void UpdateMovementAnimations(bool update_movementflag)
803 { 858 {
804 if (update_movementflag) 859 if (update_movementflag)
@@ -807,81 +862,49 @@ namespace OpenSim.Region.Environment.Scenes
807 { 862 {
808 if (m_physicsActor.Flying) 863 if (m_physicsActor.Flying)
809 { 864 {
810 SendAnimPack(Animations.AnimsLLUUID["FLY"], 1); 865 SetMovementAnimation(Animations.AnimsLLUUID["FLY"], 1);
811 } 866 }
812 else 867 else if (((m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0) &&
868 PhysicsActor.IsColliding)
813 { 869 {
814 if (((m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0) && 870 SetMovementAnimation(Animations.AnimsLLUUID["CROUCHWALK"], 1);
815 PhysicsActor.IsColliding)
816 {
817 SendAnimPack(Animations.AnimsLLUUID["CROUCHWALK"], 1);
818 }
819 else
820 {
821 if (!PhysicsActor.IsColliding && m_physicsActor.Velocity.Z < -6)
822 {
823 SendAnimPack(Animations.AnimsLLUUID["FALLDOWN"], 1);
824 }
825 else if (!PhysicsActor.IsColliding && Velocity.Z > 0 && (m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) != 0)
826 {
827 SendAnimPack(Animations.AnimsLLUUID["JUMP"], 1);
828 }
829 else
830 {
831 if (!m_setAlwaysRun)
832 {
833 SendAnimPack(Animations.AnimsLLUUID["WALK"], 1);
834 }
835 else
836 {
837 SendAnimPack(Animations.AnimsLLUUID["RUN"], 1);
838 }
839 }
840 }
841 } 871 }
842 } 872 else if (!PhysicsActor.IsColliding && m_physicsActor.Velocity.Z < -6)
843 else if (m_parentID != 0)
844 {
845 if (m_isTyping)
846 { 873 {
847 SendAnimPack(Animations.AnimsLLUUID["TYPE"], 1); 874 SetMovementAnimation(Animations.AnimsLLUUID["FALLDOWN"], 1);
848 } 875 }
849 else 876 else if (!PhysicsActor.IsColliding && Velocity.Z > 0 && (m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) != 0)
850 { 877 {
851 // TODO: stop the typing animation, continue sitting 878 SetMovementAnimation(Animations.AnimsLLUUID["JUMP"], 1);
852 SendAnimPack(Animations.AnimsLLUUID["SIT"], 1);
853 } 879 }
880 else if (m_setAlwaysRun)
881 {
882 SetMovementAnimation(Animations.AnimsLLUUID["RUN"], 1);
883 }
884 else
885 SetMovementAnimation(Animations.AnimsLLUUID["WALK"], 1);
854 } 886 }
855 else 887 else
856 { 888 {
857 if (((m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0) && 889 if (((m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0) &&
858 PhysicsActor.IsColliding) 890 PhysicsActor.IsColliding)
859 { 891 {
860 SendAnimPack(Animations.AnimsLLUUID["CROUCH"], 1); 892 SetMovementAnimation(Animations.AnimsLLUUID["CROUCH"], 1);
861 } 893 }
862 else if (m_isTyping) 894 else if (!PhysicsActor.IsColliding && m_physicsActor.Velocity.Z < -6 && !m_physicsActor.Flying)
863 { 895 {
864 SendAnimPack(Animations.AnimsLLUUID["TYPE"], 1); 896 SetMovementAnimation(Animations.AnimsLLUUID["FALLDOWN"], 1);
865 } 897 }
866 else 898 else if (!PhysicsActor.IsColliding && Velocity.Z > 0 && !m_physicsActor.Flying && (m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) != 0)
867 { 899 {
868 if (!PhysicsActor.IsColliding && m_physicsActor.Velocity.Z < -6 && !m_physicsActor.Flying) 900 SetMovementAnimation(Animations.AnimsLLUUID["JUMP"], 1);
869 { 901 }
870 SendAnimPack(Animations.AnimsLLUUID["FALLDOWN"], 1); 902 else if (m_physicsActor.Flying)
871 } 903 {
872 else if (!PhysicsActor.IsColliding && Velocity.Z > 0 && !m_physicsActor.Flying && (m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) != 0) 904 SetMovementAnimation(Animations.AnimsLLUUID["FLY"], 1);
873 {
874 SendAnimPack(Animations.AnimsLLUUID["JUMP"], 1);
875 }
876 else
877 {
878 if (!m_physicsActor.Flying)
879 {
880 SendAnimPack(Animations.AnimsLLUUID["STAND"], 1);
881 }
882 }
883
884 } 905 }
906 else
907 SetMovementAnimation(Animations.AnimsLLUUID["STAND"], 1);
885 } 908 }
886 } 909 }
887 } 910 }
@@ -912,8 +935,8 @@ namespace OpenSim.Region.Environment.Scenes
912 { 935 {
913 direc.z *= 3; 936 direc.z *= 3;
914 //System.Console.WriteLine("Jump"); 937 //System.Console.WriteLine("Jump");
915 SendAnimPack(Animations.AnimsLLUUID["PREJUMP"], 1); 938 SetMovementAnimation(Animations.AnimsLLUUID["PREJUMP"], 1);
916 SendAnimPack(Animations.AnimsLLUUID["JUMP"], 1); 939 SetMovementAnimation(Animations.AnimsLLUUID["JUMP"], 1);
917 } 940 }
918 } 941 }
919 } 942 }
@@ -932,9 +955,10 @@ namespace OpenSim.Region.Environment.Scenes
932 return; 955 return;
933 } 956 }
934 957
935 m_isTyping = typing; 958 if (typing)
936 959 AddAnimation(Animations.AnimsLLUUID["TYPE"], 1);
937 UpdateMovementAnimations(true); 960 else
961 RemoveAnimation(Animations.AnimsLLUUID["TYPE"]);
938 } 962 }
939 963
940 #endregion 964 #endregion
@@ -1122,15 +1146,14 @@ namespace OpenSim.Region.Environment.Scenes
1122 /// <summary> 1146 /// <summary>
1123 /// 1147 ///
1124 /// </summary> 1148 /// </summary>
1125 /// <param name="animID"></param> 1149 /// <param name="animations"></param>
1126 /// <param name="seq"></param> 1150 /// <param name="seqs"></param>
1127 public void SendAnimPack(LLUUID animID, int seq) 1151 public void SendAnimPack(LLUUID[] animations, int[] seqs)
1128 { 1152 {
1129 CurrentAnimation = animID; 1153 m_scene.Broadcast(delegate(IClientAPI client)
1130 AnimationSeq = seq; 1154 {
1131 LLUUID sourceAgentId = m_controllingClient.AgentId; 1155 client.SendAnimations(animations, seqs, m_controllingClient.AgentId);
1132 1156 });
1133 m_scene.Broadcast(delegate(IClientAPI client) { client.SendAnimation(animID, seq, sourceAgentId); });
1134 } 1157 }
1135 1158
1136 /// <summary> 1159 /// <summary>
@@ -1138,7 +1161,7 @@ namespace OpenSim.Region.Environment.Scenes
1138 /// </summary> 1161 /// </summary>
1139 public void SendAnimPack() 1162 public void SendAnimPack()
1140 { 1163 {
1141 SendAnimPack(CurrentAnimation, AnimationSeq); 1164 SendAnimPack(m_animations.ToArray(), m_animationSeqs.ToArray());
1142 } 1165 }
1143 1166
1144 #endregion 1167 #endregion
diff --git a/OpenSim/Region/Examples/SimpleApp/MyNpcCharacter.cs b/OpenSim/Region/Examples/SimpleApp/MyNpcCharacter.cs
index 82272f8..530b933 100644
--- a/OpenSim/Region/Examples/SimpleApp/MyNpcCharacter.cs
+++ b/OpenSim/Region/Examples/SimpleApp/MyNpcCharacter.cs
@@ -58,6 +58,7 @@ namespace SimpleApp
58 public event SetAppearance OnSetAppearance; 58 public event SetAppearance OnSetAppearance;
59 public event AvatarNowWearing OnAvatarNowWearing; 59 public event AvatarNowWearing OnAvatarNowWearing;
60 public event StartAnim OnStartAnim; 60 public event StartAnim OnStartAnim;
61 public event StopAnim OnStopAnim;
61 public event LinkObjects OnLinkObjects; 62 public event LinkObjects OnLinkObjects;
62 public event DelinkObjects OnDelinkObjects; 63 public event DelinkObjects OnDelinkObjects;
63 public event RequestMapBlocks OnRequestMapBlocks; 64 public event RequestMapBlocks OnRequestMapBlocks;
@@ -198,18 +199,20 @@ namespace SimpleApp
198 public virtual void SendStartPingCheck(byte seq) 199 public virtual void SendStartPingCheck(byte seq)
199 { 200 {
200 } 201 }
202
201 public virtual void SendAvatarPickerReply(AvatarPickerReplyPacket response) 203 public virtual void SendAvatarPickerReply(AvatarPickerReplyPacket response)
202 { 204 {
203
204 } 205 }
205 206
206 public virtual void SendKillObject(ulong regionHandle, uint localID) 207 public virtual void SendKillObject(ulong regionHandle, uint localID)
207 { 208 {
208 } 209 }
210
209 public virtual void SetChildAgentThrottle(byte[] throttle) 211 public virtual void SetChildAgentThrottle(byte[] throttle)
210 { 212 {
211 } 213 }
212 public virtual void SendAnimation(LLUUID animID, int seq, LLUUID sourceAgentId) 214
215 public virtual void SendAnimations(LLUUID[] animations, int[] seqs, LLUUID sourceAgentId)
213 { 216 {
214 } 217 }
215 218