From 1324082b90a0c52a8f6d61802aff3442fb95df67 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Tue, 17 Nov 2009 15:05:40 +0000
Subject: refactor: move most animation methods from ScenePresence into a new
ScenePresenceAnimator class
---
.../Scenes/Animation/ScenePresenceAnimator.cs | 388 +++++++++++++++++
OpenSim/Region/Framework/Scenes/AnimationSet.cs | 21 +-
.../Hypergrid/HGSceneCommunicationService.cs | 2 +-
.../Framework/Scenes/SceneCommunicationService.cs | 2 +-
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 460 ++++-----------------
.../Shared/Api/Implementation/LSL_Api.cs | 23 +-
.../Shared/Api/Implementation/OSSL_Api.cs | 9 +-
7 files changed, 499 insertions(+), 406 deletions(-)
create mode 100644 OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs
new file mode 100644
index 0000000..d22e24a
--- /dev/null
+++ b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs
@@ -0,0 +1,388 @@
+/*
+ * Copyright (c) Contributors, http://opensimulator.org/
+ * See CONTRIBUTORS.TXT for a full list of copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of the OpenSimulator Project nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+using System;
+using OpenMetaverse;
+using OpenSim.Framework;
+using OpenSim.Region.Framework.Interfaces;
+using OpenSim.Region.Framework.Scenes;
+using OpenSim.Region.Physics.Manager;
+
+namespace OpenSim.Region.Framework.Scenes.Animation
+{
+ ///
+ /// Handle all animation duties for a scene presence
+ ///
+ public class ScenePresenceAnimator
+ {
+ public AnimationSet Animations
+ {
+ get { return m_animations; }
+ }
+ protected AnimationSet m_animations = new AnimationSet();
+
+ ///
+ /// The current movement animation
+ ///
+ public string CurrentMovementAnimation
+ {
+ get { return m_movementAnimation; }
+ }
+ protected string m_movementAnimation = "DEFAULT";
+
+ private int m_animTickFall;
+ private int m_animTickJump;
+
+ ///
+ /// The scene presence that this animator applies to
+ ///
+ protected ScenePresence m_scenePresence;
+
+ public ScenePresenceAnimator(ScenePresence sp)
+ {
+ m_scenePresence = sp;
+ }
+
+ public void AddAnimation(UUID animID, UUID objectID)
+ {
+ if (m_scenePresence.IsChildAgent)
+ return;
+
+ if (m_animations.Add(animID, m_scenePresence.ControllingClient.NextAnimationSequenceNumber, objectID))
+ SendAnimPack();
+ }
+
+ // Called from scripts
+ public void AddAnimation(string name, UUID objectID)
+ {
+ if (m_scenePresence.IsChildAgent)
+ return;
+
+ UUID animID = m_scenePresence.ControllingClient.GetDefaultAnimation(name);
+ if (animID == UUID.Zero)
+ return;
+
+ AddAnimation(animID, objectID);
+ }
+
+ public void RemoveAnimation(UUID animID)
+ {
+ if (m_scenePresence.IsChildAgent)
+ return;
+
+ if (m_animations.Remove(animID))
+ SendAnimPack();
+ }
+
+ // Called from scripts
+ public void RemoveAnimation(string name)
+ {
+ if (m_scenePresence.IsChildAgent)
+ return;
+
+ UUID animID = m_scenePresence.ControllingClient.GetDefaultAnimation(name);
+ if (animID == UUID.Zero)
+ return;
+
+ RemoveAnimation(animID);
+ }
+
+ public void ResetAnimations()
+ {
+ m_animations.Clear();
+ }
+
+ ///
+ /// The movement animation is reserved for "main" animations
+ /// that are mutually exclusive, e.g. flying and sitting.
+ ///
+ public void TrySetMovementAnimation(string anim)
+ {
+ //m_log.DebugFormat("Updating movement animation to {0}", anim);
+
+ if (!m_scenePresence.IsChildAgent)
+ {
+ if (m_animations.TrySetDefaultAnimation(
+ anim, m_scenePresence.ControllingClient.NextAnimationSequenceNumber, UUID.Zero))
+ {
+ // 16384 is CHANGED_ANIMATION
+ m_scenePresence.SendScriptEventToAttachments("changed", new Object[] { 16384 });
+ SendAnimPack();
+ }
+ }
+ }
+
+ ///
+ /// This method determines the proper movement related animation
+ ///
+ public string GetMovementAnimation()
+ {
+ const float FALL_DELAY = 0.33f;
+ const float PREJUMP_DELAY = 0.25f;
+
+ #region Inputs
+
+ AgentManager.ControlFlags controlFlags = (AgentManager.ControlFlags)m_scenePresence.AgentControlFlags;
+ PhysicsActor actor = m_scenePresence.PhysicsActor;
+
+ // Create forward and left vectors from the current avatar rotation
+ Matrix4 rotMatrix = Matrix4.CreateFromQuaternion(m_scenePresence.Rotation);
+ Vector3 fwd = Vector3.Transform(Vector3.UnitX, rotMatrix);
+ Vector3 left = Vector3.Transform(Vector3.UnitY, rotMatrix);
+
+ // Check control flags
+ bool heldForward = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_AT_POS) == AgentManager.ControlFlags.AGENT_CONTROL_AT_POS;
+ bool heldBack = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG;
+ bool heldLeft = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS) == AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS;
+ bool heldRight = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG;
+ //bool heldTurnLeft = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT) == AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT;
+ //bool heldTurnRight = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT) == AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT;
+ bool heldUp = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) == AgentManager.ControlFlags.AGENT_CONTROL_UP_POS;
+ bool heldDown = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG;
+ //bool flying = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_FLY) == AgentManager.ControlFlags.AGENT_CONTROL_FLY;
+ //bool mouselook = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK) == AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK;
+
+ // Direction in which the avatar is trying to move
+ Vector3 move = Vector3.Zero;
+ if (heldForward) { move.X += fwd.X; move.Y += fwd.Y; }
+ if (heldBack) { move.X -= fwd.X; move.Y -= fwd.Y; }
+ if (heldLeft) { move.X += left.X; move.Y += left.Y; }
+ if (heldRight) { move.X -= left.X; move.Y -= left.Y; }
+ if (heldUp) { move.Z += 1; }
+ if (heldDown) { move.Z -= 1; }
+
+ // Is the avatar trying to move?
+// bool moving = (move != Vector3.Zero);
+ bool jumping = m_animTickJump != 0;
+
+ #endregion Inputs
+
+ #region Flying
+
+ if (actor != null && actor.Flying)
+ {
+ m_animTickFall = 0;
+ m_animTickJump = 0;
+
+ if (move.X != 0f || move.Y != 0f)
+ {
+ return (m_scenePresence.Scene.m_useFlySlow ? "FLYSLOW" : "FLY");
+ }
+ else if (move.Z > 0f)
+ {
+ return "HOVER_UP";
+ }
+ else if (move.Z < 0f)
+ {
+ if (actor != null && actor.IsColliding)
+ return "LAND";
+ else
+ return "HOVER_DOWN";
+ }
+ else
+ {
+ return "HOVER";
+ }
+ }
+
+ #endregion Flying
+
+ #region Falling/Floating/Landing
+
+ if (actor == null || !actor.IsColliding)
+ {
+ float fallElapsed = (float)(Environment.TickCount - m_animTickFall) / 1000f;
+ float fallVelocity = (actor != null) ? actor.Velocity.Z : 0.0f;
+
+ if (m_animTickFall == 0 || (fallElapsed > FALL_DELAY && fallVelocity >= 0.0f))
+ {
+ // Just started falling
+ m_animTickFall = Environment.TickCount;
+ }
+ else if (!jumping && fallElapsed > FALL_DELAY)
+ {
+ // Falling long enough to trigger the animation
+ return "FALLDOWN";
+ }
+
+ return m_movementAnimation;
+ }
+
+ #endregion Falling/Floating/Landing
+
+ #region Ground Movement
+
+ if (m_movementAnimation == "FALLDOWN")
+ {
+ m_animTickFall = Environment.TickCount;
+
+ // TODO: SOFT_LAND support
+ return "LAND";
+ }
+ else if (m_movementAnimation == "LAND")
+ {
+ float landElapsed = (float)(Environment.TickCount - m_animTickFall) / 1000f;
+
+ if (landElapsed <= FALL_DELAY)
+ return "LAND";
+ }
+
+ m_animTickFall = 0;
+
+ if (move.Z > 0f)
+ {
+ // Jumping
+ if (!jumping)
+ {
+ // Begin prejump
+ m_animTickJump = Environment.TickCount;
+ return "PREJUMP";
+ }
+ else if (Environment.TickCount - m_animTickJump > PREJUMP_DELAY * 1000.0f)
+ {
+ // Start actual jump
+ if (m_animTickJump == -1)
+ {
+ // Already jumping! End the current jump
+ m_animTickJump = 0;
+ return "JUMP";
+ }
+
+ m_animTickJump = -1;
+ return "JUMP";
+ }
+ }
+ else
+ {
+ // Not jumping
+ m_animTickJump = 0;
+
+ if (move.X != 0f || move.Y != 0f)
+ {
+ // Walking / crouchwalking / running
+ if (move.Z < 0f)
+ return "CROUCHWALK";
+ else if (m_scenePresence.SetAlwaysRun)
+ return "RUN";
+ else
+ return "WALK";
+ }
+ else
+ {
+ // Not walking
+ if (move.Z < 0f)
+ return "CROUCH";
+ else
+ return "STAND";
+ }
+ }
+
+ #endregion Ground Movement
+
+ return m_movementAnimation;
+ }
+
+ ///
+ /// Update the movement animation of this avatar according to its current state
+ ///
+ public void UpdateMovementAnimations()
+ {
+ m_movementAnimation = GetMovementAnimation();
+
+ if (m_movementAnimation == "PREJUMP" && !m_scenePresence.Scene.m_usePreJump)
+ {
+ // This was the previous behavior before PREJUMP
+ TrySetMovementAnimation("JUMP");
+ }
+ else
+ {
+ TrySetMovementAnimation(m_movementAnimation);
+ }
+ }
+
+ public UUID[] GetAnimationArray()
+ {
+ UUID[] animIDs;
+ int[] sequenceNums;
+ UUID[] objectIDs;
+ m_animations.GetArrays(out animIDs, out sequenceNums, out objectIDs);
+ return animIDs;
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public void SendAnimPack(UUID[] animations, int[] seqs, UUID[] objectIDs)
+ {
+ if (m_scenePresence.IsChildAgent)
+ return;
+
+ m_scenePresence.Scene.ForEachClient(
+ delegate(IClientAPI client)
+ {
+ client.SendAnimations(animations, seqs, m_scenePresence.ControllingClient.AgentId, objectIDs);
+ });
+ }
+
+ public void SendAnimPackToClient(IClientAPI client)
+ {
+ if (m_scenePresence.IsChildAgent)
+ return;
+
+ UUID[] animIDs;
+ int[] sequenceNums;
+ UUID[] objectIDs;
+
+ m_animations.GetArrays(out animIDs, out sequenceNums, out objectIDs);
+
+ m_scenePresence.ControllingClient.SendAnimations(
+ animIDs, sequenceNums, m_scenePresence.ControllingClient.AgentId, objectIDs);
+ }
+
+ ///
+ /// Send animation information about this avatar to all clients.
+ ///
+ public void SendAnimPack()
+ {
+ //m_log.Debug("Sending animation pack to all");
+
+ if (m_scenePresence.IsChildAgent)
+ return;
+
+ UUID[] animIDs;
+ int[] sequenceNums;
+ UUID[] objectIDs;
+
+ m_animations.GetArrays(out animIDs, out sequenceNums, out objectIDs);
+
+ SendAnimPack(animIDs, sequenceNums, objectIDs);
+ }
+ }
+}
\ No newline at end of file
diff --git a/OpenSim/Region/Framework/Scenes/AnimationSet.cs b/OpenSim/Region/Framework/Scenes/AnimationSet.cs
index 740d168..3e6781e 100644
--- a/OpenSim/Region/Framework/Scenes/AnimationSet.cs
+++ b/OpenSim/Region/Framework/Scenes/AnimationSet.cs
@@ -39,13 +39,14 @@ namespace OpenSim.Region.Framework.Scenes
{
public static AvatarAnimations Animations = new AvatarAnimations();
- private Animation m_defaultAnimation = new Animation();
- private List m_animations = new List();
+ private OpenSim.Framework.Animation m_defaultAnimation = new OpenSim.Framework.Animation();
+ private List m_animations = new List();
- public Animation DefaultAnimation
+ public OpenSim.Framework.Animation DefaultAnimation
{
get { return m_defaultAnimation; }
}
+
public AnimationSet()
{
ResetDefaultAnimation();
@@ -71,7 +72,7 @@ namespace OpenSim.Region.Framework.Scenes
{
if (!HasAnimation(animID))
{
- m_animations.Add(new Animation(animID, sequenceNum, objectID));
+ m_animations.Add(new OpenSim.Framework.Animation(animID, sequenceNum, objectID));
return true;
}
}
@@ -115,7 +116,7 @@ namespace OpenSim.Region.Framework.Scenes
{
if (m_defaultAnimation.AnimID != animID)
{
- m_defaultAnimation = new Animation(animID, sequenceNum, objectID);
+ m_defaultAnimation = new OpenSim.Framework.Animation(animID, sequenceNum, objectID);
return true;
}
return false;
@@ -159,13 +160,13 @@ namespace OpenSim.Region.Framework.Scenes
}
}
- public Animation[] ToArray()
+ public OpenSim.Framework.Animation[] ToArray()
{
- Animation[] theArray = new Animation[m_animations.Count];
+ OpenSim.Framework.Animation[] theArray = new OpenSim.Framework.Animation[m_animations.Count];
uint i = 0;
try
{
- foreach (Animation anim in m_animations)
+ foreach (OpenSim.Framework.Animation anim in m_animations)
theArray[i++] = anim;
}
catch
@@ -175,9 +176,9 @@ namespace OpenSim.Region.Framework.Scenes
return theArray;
}
- public void FromArray(Animation[] theArray)
+ public void FromArray(OpenSim.Framework.Animation[] theArray)
{
- foreach (Animation anim in theArray)
+ foreach (OpenSim.Framework.Animation anim in theArray)
m_animations.Add(anim);
}
}
diff --git a/OpenSim/Region/Framework/Scenes/Hypergrid/HGSceneCommunicationService.cs b/OpenSim/Region/Framework/Scenes/Hypergrid/HGSceneCommunicationService.cs
index d7e62a8..0f9c190 100644
--- a/OpenSim/Region/Framework/Scenes/Hypergrid/HGSceneCommunicationService.cs
+++ b/OpenSim/Region/Framework/Scenes/Hypergrid/HGSceneCommunicationService.cs
@@ -82,7 +82,7 @@ namespace OpenSim.Region.Framework.Scenes.Hypergrid
IEventQueue eq = avatar.Scene.RequestModuleInterface();
// Reset animations; the viewer does that in teleports.
- avatar.ResetAnimations();
+ avatar.Animator.ResetAnimations();
if (regionHandle == m_regionInfo.RegionHandle)
{
diff --git a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
index 4a2db5e..76c6cab 100644
--- a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
@@ -801,7 +801,7 @@ namespace OpenSim.Region.Framework.Scenes
IEventQueue eq = avatar.Scene.RequestModuleInterface();
// Reset animations; the viewer does that in teleports.
- avatar.ResetAnimations();
+ avatar.Animator.ResetAnimations();
if (regionHandle == m_regionInfo.RegionHandle)
{
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 08c144a..33c1932 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -35,6 +35,7 @@ using OpenSim.Framework;
using OpenSim.Framework.Client;
using OpenSim.Framework.Communications.Cache;
using OpenSim.Region.Framework.Interfaces;
+using OpenSim.Region.Framework.Scenes.Animation;
using OpenSim.Region.Framework.Scenes.Types;
using OpenSim.Region.Physics.Manager;
using GridRegion = OpenSim.Services.Interfaces.GridRegion;
@@ -79,6 +80,7 @@ namespace OpenSim.Region.Framework.Scenes
// private static readonly byte[] DEFAULT_TEXTURE = AvatarAppearance.GetDefaultTexture().GetBytes();
private static readonly Array DIR_CONTROL_FLAGS = Enum.GetValues(typeof(Dir_ControlFlags));
private static readonly Vector3 HEAD_ADJUSTMENT = new Vector3(0f, 0f, 0.3f);
+
///
/// Experimentally determined "fudge factor" to make sit-target positions
/// the same as in SecondLife. Fudge factor was tested for 36 different
@@ -93,7 +95,15 @@ namespace OpenSim.Region.Framework.Scenes
private ISceneViewer m_sceneViewer;
- private AnimationSet m_animations = new AnimationSet();
+ ///
+ /// The animator for this avatar
+ ///
+ public ScenePresenceAnimator Animator
+ {
+ get { return m_animator; }
+ }
+ protected ScenePresenceAnimator m_animator;
+
private Dictionary scriptedcontrols = new Dictionary();
private ScriptControlled IgnoredControls = ScriptControlled.CONTROL_ZERO;
private ScriptControlled LastCommands = ScriptControlled.CONTROL_ZERO;
@@ -134,12 +144,7 @@ namespace OpenSim.Region.Framework.Scenes
private int m_perfMonMS;
private bool m_setAlwaysRun;
-
- private string m_movementAnimation = "DEFAULT";
- private int m_animTickFall;
- private int m_animTickJump;
- private bool m_useFlySlow;
- private bool m_usePreJump;
+
private bool m_forceFly;
private bool m_flyDisabled;
@@ -227,7 +232,6 @@ namespace OpenSim.Region.Framework.Scenes
DIR_CONTROL_FLAG_DOWN = AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG,
DIR_CONTROL_FLAG_DOWN_NUDGE = AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG
}
-
///
/// Position at which a significant movement was made
@@ -238,7 +242,10 @@ namespace OpenSim.Region.Framework.Scenes
string m_callbackURI;
ulong m_rootRegionHandle;
- private IScriptModule[] m_scriptEngines;
+ ///
+ /// Script engines present in the scene
+ ///
+ private IScriptModule[] m_scriptEngines;
#region Properties
@@ -586,11 +593,6 @@ namespace OpenSim.Region.Framework.Scenes
}
}
- public AnimationSet Animations
- {
- get { return m_animations; }
- }
-
private bool m_inTransit;
private bool m_mouseLook;
private bool m_leftButtonDown;
@@ -625,6 +627,7 @@ namespace OpenSim.Region.Framework.Scenes
private ScenePresence(IClientAPI client, Scene world, RegionInfo reginfo)
{
+ m_animator = new ScenePresenceAnimator(this);
m_sendCourseLocationsMethod = SendCoarseLocationsDefault;
CreateSceneViewer();
m_rootRegionHandle = reginfo.RegionHandle;
@@ -637,15 +640,12 @@ namespace OpenSim.Region.Framework.Scenes
m_regionInfo = reginfo;
m_localId = m_scene.AllocateLocalId();
- m_useFlySlow = m_scene.m_useFlySlow;
- m_usePreJump = m_scene.m_usePreJump;
-
IGroupsModule gm = m_scene.RequestModuleInterface();
if (gm != null)
m_grouptitle = gm.GetGroupTitle(m_uuid);
m_scriptEngines = m_scene.RequestModuleInterfaces();
-
+
AbsolutePosition = posLastSignificantMove = m_CameraCenter =
m_lastCameraCenter = m_controllingClient.StartPos;
@@ -656,7 +656,8 @@ namespace OpenSim.Region.Framework.Scenes
AdjustKnownSeeds();
- TrySetMovementAnimation("STAND"); // TODO: I think, this won't send anything, as we are still a child here...
+ // TODO: I think, this won't send anything, as we are still a child here...
+ Animator.TrySetMovementAnimation("STAND");
// we created a new ScenePresence (a new child agent) in a fresh region.
// Request info about all the (root) agents in this region
@@ -665,7 +666,6 @@ namespace OpenSim.Region.Framework.Scenes
RegisterToEvents();
SetDirectionVectors();
-
}
public ScenePresence(IClientAPI client, Scene world, RegionInfo reginfo, byte[] visualParams,
@@ -674,6 +674,7 @@ namespace OpenSim.Region.Framework.Scenes
{
CreateSceneViewer();
m_appearance = new AvatarAppearance(m_uuid, wearables, visualParams);
+
}
public ScenePresence(IClientAPI client, Scene world, RegionInfo reginfo, AvatarAppearance appearance)
@@ -857,7 +858,7 @@ namespace OpenSim.Region.Framework.Scenes
// Don't send an animation pack here, since on a region crossing this will sometimes cause a flying
// avatar to return to the standing position in mid-air. On login it looks like this is being sent
// elsewhere anyway
- //SendAnimPack();
+ // Animator.SendAnimPack();
m_scene.SwapRootAgentCount(false);
@@ -879,7 +880,7 @@ namespace OpenSim.Region.Framework.Scenes
ScenePresence presence = animAgents[i];
if (presence != this)
- presence.SendAnimPackToClient(ControllingClient);
+ presence.Animator.SendAnimPackToClient(ControllingClient);
}
m_scene.EventManager.TriggerOnMakeRootAgent(this);
@@ -894,7 +895,7 @@ namespace OpenSim.Region.Framework.Scenes
///
public void MakeChildAgent()
{
- m_animations.Clear();
+ Animator.ResetAnimations();
// m_log.DebugFormat(
// "[SCENEPRESENCE]: Downgrading root agent {0}, {1} to a child agent in {2}",
@@ -995,7 +996,7 @@ namespace OpenSim.Region.Framework.Scenes
AbsolutePosition = AbsolutePosition + new Vector3(0f, 0f, (1.56f / 6f));
}
- TrySetMovementAnimation("LAND");
+ Animator.TrySetMovementAnimation("LAND");
SendFullUpdateToAllClients();
}
@@ -1247,7 +1248,7 @@ namespace OpenSim.Region.Framework.Scenes
// TODO: This doesn't prevent the user from walking yet.
// Setting parent ID would fix this, if we knew what value
// to use. Or we could add a m_isSitting variable.
- TrySetMovementAnimation("SIT_GROUND_CONSTRAINED");
+ Animator.TrySetMovementAnimation("SIT_GROUND_CONSTRAINED");
}
// In the future, these values might need to go global.
@@ -1453,7 +1454,7 @@ namespace OpenSim.Region.Framework.Scenes
AddNewMovement(agent_control_v3, q);
if (update_movementflag)
- UpdateMovementAnimations();
+ Animator.UpdateMovementAnimations();
}
}
@@ -1561,7 +1562,7 @@ namespace OpenSim.Region.Framework.Scenes
}
}
///
- /// Perform the logic necessary to stand the client up. This method also executes
+ /// Perform the logic necessary to stand the avatar up. This method also executes
/// the stand animation.
///
public void StandUp()
@@ -1611,7 +1612,7 @@ namespace OpenSim.Region.Framework.Scenes
}
}
- TrySetMovementAnimation("STAND");
+ Animator.TrySetMovementAnimation("STAND");
}
private SceneObjectPart FindNextAvailableSitTarget(UUID targetID)
@@ -1850,7 +1851,7 @@ namespace OpenSim.Region.Framework.Scenes
Velocity = Vector3.Zero;
RemoveFromPhysicalScene();
- TrySetMovementAnimation(sitAnimation);
+ Animator.TrySetMovementAnimation(sitAnimation);
SendFullUpdateToAllClients();
// This may seem stupid, but Our Full updates don't send avatar rotation :P
// So we're also sending a terse update (which has avatar rotation)
@@ -1870,6 +1871,7 @@ namespace OpenSim.Region.Framework.Scenes
PhysicsActor.SetAlwaysRun = pSetAlwaysRun;
}
}
+
public BinBVHAnimation GenerateRandomAnimation()
{
int rnditerations = 3;
@@ -1917,7 +1919,6 @@ namespace OpenSim.Region.Framework.Scenes
}
}
-
AssetBase Animasset = new AssetBase(UUID.Random(), "Random Animation", (sbyte)AssetType.Animation);
Animasset.Data = anim.ToBytes();
Animasset.Temporary = true;
@@ -1925,297 +1926,19 @@ namespace OpenSim.Region.Framework.Scenes
Animasset.Description = "dance";
//BinBVHAnimation bbvhanim = new BinBVHAnimation(Animasset.Data);
-
m_scene.AssetService.Store(Animasset);
- AddAnimation(Animasset.FullID, UUID);
+ Animator.AddAnimation(Animasset.FullID, UUID);
return anim;
}
- public void AddAnimation(UUID animID, UUID objectID)
- {
- if (m_isChildAgent)
- return;
-
- if (m_animations.Add(animID, m_controllingClient.NextAnimationSequenceNumber, objectID))
- SendAnimPack();
- }
-
- // Called from scripts
- public void AddAnimation(string name, UUID objectID)
- {
- if (m_isChildAgent)
- return;
-
- UUID animID = m_controllingClient.GetDefaultAnimation(name);
- if (animID == UUID.Zero)
- return;
-
- AddAnimation(animID, objectID);
- }
-
- public void RemoveAnimation(UUID animID)
- {
- if (m_isChildAgent)
- return;
-
- if (m_animations.Remove(animID))
- SendAnimPack();
- }
-
- // Called from scripts
- public void RemoveAnimation(string name)
- {
- if (m_isChildAgent)
- return;
-
- UUID animID = m_controllingClient.GetDefaultAnimation(name);
- if (animID == UUID.Zero)
- return;
-
- RemoveAnimation(animID);
- }
-
- public UUID[] GetAnimationArray()
- {
- UUID[] animIDs;
- int[] sequenceNums;
- UUID[] objectIDs;
- m_animations.GetArrays(out animIDs, out sequenceNums, out objectIDs);
- return animIDs;
- }
public void HandleStartAnim(IClientAPI remoteClient, UUID animID)
{
- AddAnimation(animID, UUID.Zero);
+ Animator.AddAnimation(animID, UUID.Zero);
}
public void HandleStopAnim(IClientAPI remoteClient, UUID animID)
{
- RemoveAnimation(animID);
- }
-
- ///
- /// The movement animation is reserved for "main" animations
- /// that are mutually exclusive, e.g. flying and sitting.
- ///
- protected void TrySetMovementAnimation(string anim)
- {
- //m_log.DebugFormat("Updating movement animation to {0}", anim);
-
- if (!m_isChildAgent)
- {
- if (m_animations.TrySetDefaultAnimation(anim, m_controllingClient.NextAnimationSequenceNumber, UUID.Zero))
- {
- if (m_scriptEngines != null)
- {
- lock (m_attachments)
- {
- foreach (SceneObjectGroup grp in m_attachments)
- {
- // 16384 is CHANGED_ANIMATION
- //
- // Send this to all attachment root prims
- //
- foreach (IScriptModule m in m_scriptEngines)
- {
- if (m == null) // No script engine loaded
- continue;
-
- m.PostObjectEvent(grp.RootPart.UUID, "changed", new Object[] { 16384 });
- }
- }
- }
- }
- SendAnimPack();
- }
- }
- }
-
- ///
- /// This method determines the proper movement related animation
- ///
- public string GetMovementAnimation()
- {
- const float FALL_DELAY = 0.33f;
- const float PREJUMP_DELAY = 0.25f;
-
- #region Inputs
-
- AgentManager.ControlFlags controlFlags = (AgentManager.ControlFlags)m_AgentControlFlags;
- PhysicsActor actor = m_physicsActor;
-
- // Create forward and left vectors from the current avatar rotation
- Matrix4 rotMatrix = Matrix4.CreateFromQuaternion(m_bodyRot);
- Vector3 fwd = Vector3.Transform(Vector3.UnitX, rotMatrix);
- Vector3 left = Vector3.Transform(Vector3.UnitY, rotMatrix);
-
- // Check control flags
- bool heldForward = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_AT_POS) == AgentManager.ControlFlags.AGENT_CONTROL_AT_POS;
- bool heldBack = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG;
- bool heldLeft = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS) == AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS;
- bool heldRight = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG;
- //bool heldTurnLeft = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT) == AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT;
- //bool heldTurnRight = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT) == AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT;
- bool heldUp = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) == AgentManager.ControlFlags.AGENT_CONTROL_UP_POS;
- bool heldDown = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG;
- //bool flying = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_FLY) == AgentManager.ControlFlags.AGENT_CONTROL_FLY;
- //bool mouselook = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK) == AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK;
-
- // Direction in which the avatar is trying to move
- Vector3 move = Vector3.Zero;
- if (heldForward) { move.X += fwd.X; move.Y += fwd.Y; }
- if (heldBack) { move.X -= fwd.X; move.Y -= fwd.Y; }
- if (heldLeft) { move.X += left.X; move.Y += left.Y; }
- if (heldRight) { move.X -= left.X; move.Y -= left.Y; }
- if (heldUp) { move.Z += 1; }
- if (heldDown) { move.Z -= 1; }
-
- // Is the avatar trying to move?
-// bool moving = (move != Vector3.Zero);
- bool jumping = m_animTickJump != 0;
-
- #endregion Inputs
-
- #region Flying
-
- if (actor != null && actor.Flying)
- {
- m_animTickFall = 0;
- m_animTickJump = 0;
-
- if (move.X != 0f || move.Y != 0f)
- {
- return (m_useFlySlow ? "FLYSLOW" : "FLY");
- }
- else if (move.Z > 0f)
- {
- return "HOVER_UP";
- }
- else if (move.Z < 0f)
- {
- if (actor != null && actor.IsColliding)
- return "LAND";
- else
- return "HOVER_DOWN";
- }
- else
- {
- return "HOVER";
- }
- }
-
- #endregion Flying
-
- #region Falling/Floating/Landing
-
- if (actor == null || !actor.IsColliding)
- {
- float fallElapsed = (float)(Environment.TickCount - m_animTickFall) / 1000f;
- float fallVelocity = (actor != null) ? actor.Velocity.Z : 0.0f;
-
- if (m_animTickFall == 0 || (fallElapsed > FALL_DELAY && fallVelocity >= 0.0f))
- {
- // Just started falling
- m_animTickFall = Environment.TickCount;
- }
- else if (!jumping && fallElapsed > FALL_DELAY)
- {
- // Falling long enough to trigger the animation
- return "FALLDOWN";
- }
-
- return m_movementAnimation;
- }
-
- #endregion Falling/Floating/Landing
-
- #region Ground Movement
-
- if (m_movementAnimation == "FALLDOWN")
- {
- m_animTickFall = Environment.TickCount;
-
- // TODO: SOFT_LAND support
- return "LAND";
- }
- else if (m_movementAnimation == "LAND")
- {
- float landElapsed = (float)(Environment.TickCount - m_animTickFall) / 1000f;
-
- if (landElapsed <= FALL_DELAY)
- return "LAND";
- }
-
- m_animTickFall = 0;
-
- if (move.Z > 0f)
- {
- // Jumping
- if (!jumping)
- {
- // Begin prejump
- m_animTickJump = Environment.TickCount;
- return "PREJUMP";
- }
- else if (Environment.TickCount - m_animTickJump > PREJUMP_DELAY * 1000.0f)
- {
- // Start actual jump
- if (m_animTickJump == -1)
- {
- // Already jumping! End the current jump
- m_animTickJump = 0;
- return "JUMP";
- }
-
- m_animTickJump = -1;
- return "JUMP";
- }
- }
- else
- {
- // Not jumping
- m_animTickJump = 0;
-
- if (move.X != 0f || move.Y != 0f)
- {
- // Walking / crouchwalking / running
- if (move.Z < 0f)
- return "CROUCHWALK";
- else if (m_setAlwaysRun)
- return "RUN";
- else
- return "WALK";
- }
- else
- {
- // Not walking
- if (move.Z < 0f)
- return "CROUCH";
- else
- return "STAND";
- }
- }
-
- #endregion Ground Movement
-
- return m_movementAnimation;
- }
-
- ///
- /// Update the movement animation of this avatar according to its current state
- ///
- protected void UpdateMovementAnimations()
- {
- m_movementAnimation = GetMovementAnimation();
-
- if (m_movementAnimation == "PREJUMP" && !m_usePreJump)
- {
- // This was the previous behavior before PREJUMP
- TrySetMovementAnimation("JUMP");
- }
- else
- {
- TrySetMovementAnimation(m_movementAnimation);
- }
+ Animator.RemoveAnimation(animID);
}
///
@@ -2289,8 +2012,8 @@ namespace OpenSim.Region.Framework.Scenes
direc.Z *= 3.0f;
// TODO: PreJump and jump happen too quickly. Many times prejump gets ignored.
- TrySetMovementAnimation("PREJUMP");
- TrySetMovementAnimation("JUMP");
+ Animator.TrySetMovementAnimation("PREJUMP");
+ Animator.TrySetMovementAnimation("JUMP");
}
}
}
@@ -2504,7 +2227,7 @@ namespace OpenSim.Region.Framework.Scenes
{
avatar.SendFullUpdateToOtherClient(this);
avatar.SendAppearanceToOtherAgent(this);
- avatar.SendAnimPackToClient(ControllingClient);
+ avatar.Animator.SendAnimPackToClient(ControllingClient);
}
}
}
@@ -2512,7 +2235,7 @@ namespace OpenSim.Region.Framework.Scenes
m_scene.StatsReporter.AddAgentUpdates(avatars.Length);
m_scene.StatsReporter.AddAgentTime(Environment.TickCount - m_perfMonMS);
- //SendAnimPack();
+ //Animator.SendAnimPack();
}
public void SendFullUpdateToAllClients()
@@ -2529,7 +2252,7 @@ namespace OpenSim.Region.Framework.Scenes
m_scene.StatsReporter.AddAgentUpdates(avatars.Count);
m_scene.StatsReporter.AddAgentTime(Environment.TickCount - m_perfMonMS);
- SendAnimPack();
+ Animator.SendAnimPack();
}
///
@@ -2646,7 +2369,7 @@ namespace OpenSim.Region.Framework.Scenes
SendAppearanceToAllOtherAgents();
if (!m_startAnimationSet)
{
- UpdateMovementAnimations();
+ Animator.UpdateMovementAnimations();
m_startAnimationSet = true;
}
@@ -2674,54 +2397,6 @@ namespace OpenSim.Region.Framework.Scenes
set { m_appearance = value; }
}
- ///
- ///
- ///
- ///
- ///
- ///
- public void SendAnimPack(UUID[] animations, int[] seqs, UUID[] objectIDs)
- {
- if (m_isChildAgent)
- return;
-
- m_scene.ForEachClient(
- delegate(IClientAPI client) { client.SendAnimations(animations, seqs, m_controllingClient.AgentId, objectIDs); });
- }
-
- public void SendAnimPackToClient(IClientAPI client)
- {
- if (m_isChildAgent)
- return;
- UUID[] animIDs;
- int[] sequenceNums;
- UUID[] objectIDs;
-
- m_animations.GetArrays(out animIDs, out sequenceNums, out objectIDs);
-
- client.SendAnimations(animIDs, sequenceNums, m_controllingClient.AgentId, objectIDs);
- }
-
- ///
- /// Send animation information about this avatar to all clients.
- ///
- public void SendAnimPack()
- {
- //m_log.Debug("Sending animation pack to all");
-
- if (m_isChildAgent)
- return;
-
- UUID[] animIDs;
- int[] sequenceNums;
- UUID[] objectIDs;
-
- m_animations.GetArrays(out animIDs, out sequenceNums, out objectIDs);
-
- SendAnimPack(animIDs, sequenceNums, objectIDs);
- }
-
-
#endregion
#region Significant Movement Method
@@ -2919,13 +2594,9 @@ namespace OpenSim.Region.Framework.Scenes
public void Reset()
{
// Put the child agent back at the center
- AbsolutePosition = new Vector3(((float)Constants.RegionSize * 0.5f), ((float)Constants.RegionSize * 0.5f), 70);
- ResetAnimations();
- }
-
- public void ResetAnimations()
- {
- m_animations.Clear();
+ AbsolutePosition
+ = new Vector3(((float)Constants.RegionSize * 0.5f), ((float)Constants.RegionSize * 0.5f), 70);
+ Animator.ResetAnimations();
}
///
@@ -3149,7 +2820,7 @@ namespace OpenSim.Region.Framework.Scenes
// Animations
try
{
- cAgent.Anims = m_animations.ToArray();
+ cAgent.Anims = Animator.Animations.ToArray();
}
catch { }
@@ -3228,15 +2899,13 @@ namespace OpenSim.Region.Framework.Scenes
// Animations
try
{
- m_animations.Clear();
- m_animations.FromArray(cAgent.Anims);
+ Animator.ResetAnimations();
+ Animator.Animations.FromArray(cAgent.Anims);
}
catch { }
//cAgent.GroupID = ??
//Groups???
-
-
}
public bool CopyAgent(out IAgentData agent)
@@ -3318,7 +2987,7 @@ namespace OpenSim.Region.Framework.Scenes
//if ((Math.Abs(Velocity.X) > 0.1e-9f) || (Math.Abs(Velocity.Y) > 0.1e-9f))
// The Physics Scene will send updates every 500 ms grep: m_physicsActor.SubscribeEvents(
// as of this comment the interval is set in AddToPhysicalScene
- UpdateMovementAnimations();
+ Animator.UpdateMovementAnimations();
CollisionEventUpdate collisionData = (CollisionEventUpdate)e;
Dictionary coldata = collisionData.m_objCollisionList;
@@ -3327,7 +2996,7 @@ namespace OpenSim.Region.Framework.Scenes
if (coldata.Count != 0)
{
- switch (m_movementAnimation)
+ switch (Animator.CurrentMovementAnimation)
{
case "STAND":
case "WALK":
@@ -3415,6 +3084,7 @@ namespace OpenSim.Region.Framework.Scenes
}
m_attachments.Clear();
}
+
lock (m_knownChildRegions)
{
m_knownChildRegions.Clear();
@@ -3425,6 +3095,7 @@ namespace OpenSim.Region.Framework.Scenes
m_reprioritization_timer.Enabled = false;
m_reprioritization_timer.Elapsed -= new ElapsedEventHandler(Reprioritize);
}
+
// I don't get it but mono crashes when you try to dispose of this timer,
// unsetting the elapsed callback should be enough to allow for cleanup however.
//m_reprioritizationTimer.Dispose();
@@ -3497,6 +3168,35 @@ namespace OpenSim.Region.Framework.Scenes
return true;
}
+ ///
+ /// Send a script event to this scene presence's attachments
+ ///
+ /// The name of the event
+ /// The arguments for the event
+ public void SendScriptEventToAttachments(string eventName, Object[] args)
+ {
+ if (m_scriptEngines != null)
+ {
+ lock (m_attachments)
+ {
+ foreach (SceneObjectGroup grp in m_attachments)
+ {
+ // 16384 is CHANGED_ANIMATION
+ //
+ // Send this to all attachment root prims
+ //
+ foreach (IScriptModule m in m_scriptEngines)
+ {
+ if (m == null) // No script engine loaded
+ continue;
+
+ m.PostObjectEvent(grp.RootPart.UUID, "changed", new Object[] { 16384 });
+ }
+ }
+ }
+ }
+ }
+
public bool CrossAttachmentsIntoNewRegion(ulong regionHandle, bool silent)
{
lock (m_attachments)
@@ -3939,4 +3639,4 @@ namespace OpenSim.Region.Framework.Scenes
}
}
}
-}
+}
\ No newline at end of file
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index 0ea62d7..ff5dd98 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -3093,11 +3093,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
if (presence != null)
{
// Do NOT try to parse UUID, animations cannot be triggered by ID
- UUID animID=InventoryKey(anim, (int)AssetType.Animation);
+ UUID animID = InventoryKey(anim, (int)AssetType.Animation);
if (animID == UUID.Zero)
- presence.AddAnimation(anim, m_host.UUID);
+ presence.Animator.AddAnimation(anim, m_host.UUID);
else
- presence.AddAnimation(animID, m_host.UUID);
+ presence.Animator.AddAnimation(animID, m_host.UUID);
}
}
}
@@ -3137,9 +3137,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
if (presence != null)
{
if (animID == UUID.Zero)
- presence.RemoveAnimation(anim);
+ presence.Animator.RemoveAnimation(anim);
else
- presence.RemoveAnimation(animID);
+ presence.Animator.RemoveAnimation(animID);
}
}
}
@@ -3983,12 +3983,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
if (presence != null)
{
- AnimationSet currentAnims = presence.Animations;
+ AnimationSet currentAnims = presence.Animator.Animations;
string currentAnimationState = String.Empty;
if (animationstateNames.TryGetValue(currentAnims.DefaultAnimation.AnimID, out currentAnimationState))
return currentAnimationState;
}
}
+
return String.Empty;
}
@@ -5322,7 +5323,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
flags |= ScriptBaseClass.AGENT_TYPING;
}
- string agentMovementAnimation = agent.GetMovementAnimation();
+ string agentMovementAnimation = agent.Animator.GetMovementAnimation();
if (agentMovementAnimation == "CROUCH")
{
@@ -5354,7 +5355,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
flags |= ScriptBaseClass.AGENT_SITTING;
}
- if (agent.Animations.DefaultAnimation.AnimID == AnimationSet.Animations.AnimsUUID["SIT_GROUND_CONSTRAINED"])
+ if (agent.Animator.Animations.DefaultAnimation.AnimID
+ == AnimationSet.Animations.AnimsUUID["SIT_GROUND_CONSTRAINED"])
{
flags |= ScriptBaseClass.AGENT_SITTING;
}
@@ -7144,7 +7146,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
if (av == null || av.IsChildAgent) // only if in the region
return l;
UUID[] anims;
- anims = av.GetAnimationArray();
+ anims = av.Animator.GetAnimationArray();
foreach (UUID foo in anims)
l.Add(foo.ToString());
return l;
@@ -7272,7 +7274,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
{
LSL_Vector lower;
LSL_Vector upper;
- if (presence.Animations.DefaultAnimation.AnimID == AnimationSet.Animations.AnimsUUID["SIT_GROUND_CONSTRAINED"])
+ if (presence.Animator.Animations.DefaultAnimation.AnimID
+ == AnimationSet.Animations.AnimsUUID["SIT_GROUND_CONSTRAINED"])
{
// This is for ground sitting avatars
float height = presence.Appearance.AvatarHeight / 2.66666667f;
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
index 3ffcff0..7fdbac8 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
@@ -741,9 +741,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
}
}
if (animID == UUID.Zero)
- target.AddAnimation(animation, m_host.UUID);
+ target.Animator.AddAnimation(animation, m_host.UUID);
else
- target.AddAnimation(animID, m_host.UUID);
+ target.Animator.AddAnimation(animID, m_host.UUID);
}
}
}
@@ -773,10 +773,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
}
}
}
+
if (animID == UUID.Zero)
- target.RemoveAnimation(animation);
+ target.Animator.RemoveAnimation(animation);
else
- target.RemoveAnimation(animID);
+ target.Animator.RemoveAnimation(animID);
}
}
}
--
cgit v1.1