Teravus, Awesome! I'll play with this over the weekend.
Thanks. On Thu, Oct 28, 2010 at 9:54 AM, Teravus Ovares <[email protected]> wrote: > You need to pump avatar movement updates for the autopilot code to work. > > Even if there are no movement flags, calling > ScenePresence.HandleAgentUpdate with a proper AgentUpdateArgs will 'move' > the avatar a step towards the target of the autopilot. > > The following code is for an older version of OpenSimulator but it might > work with a few modifications on the current version. > (AddRegion is INonSharedRegionModule.AddRegion) > > private int m_agentupdatepump = 5; > private Scene m_scene; > private List<ScenePresence> m_activeCharactersSP; > private List<Character> m_activeCharacters; > > private Quaternion fourtyFiveDegreeAngle = new > Quaternion(0,0,-0.70711f,0.70711f); > > > public virtual void AddRegion(Scene scene) > { > m_scene = scene; > m_scene.EventManager.OnFrame += EventManager_OnFrame; > } > > void EventManager_OnFrame() > { > m_frame++; > > if ((m_frame % m_agentupdatepump) == 0) > { > PumpAgentUpdate(); > } > > if (m_frame >= (int.MaxValue - 1)) > { > m_frame = 0; > } > } > > void PumpAgentUpdate() > { > lock (m_activeCharacters) > { > foreach (Character c in m_activeCharacters) > { > ScenePresence cSP = m_scene.GetScenePresence(c.AgentId); > PumpAgentUpdate(c, cSP); > } > } > } > > void PumpAgentUpdate(Character pC, ScenePresence pSP) > { > AgentUpdateArgs updateargs = new AgentUpdateArgs(); > updateargs.AgentID = pC.AgentId; > > updateargs.BodyRotation = Vector3.RotationBetween(Vector3.UnitX, > Vector3.Normalize(pC.m_lastTarget - pSP.AbsolutePosition)); > > if (pC.ClientSideOrientation == fourtyFiveDegreeAngle) > pC.ClientSideOrientation = Quaternion.Identity; > > updateargs.CameraAtAxis = Vector3.Zero; > updateargs.CameraCenter = new Vector3(pSP.AbsolutePosition - (new > Vector3(0,0,1) * updateargs.BodyRotation)); > updateargs.CameraLeftAxis = Vector3.Zero; > updateargs.CameraUpAxis = Vector3.Zero; > updateargs.ControlFlags = uint.MinValue;// > +(uint)OpenMetaverse.AgentManager.ControlFlags.AGENT_CONTROL_FLY; > updateargs.Far = 128f; > updateargs.Flags = byte.MinValue; > updateargs.HeadRotation = Quaternion.Identity; > updateargs.SessionID = pC.SessionId; > updateargs.State = byte.MinValue; > > pSP.HandleAgentUpdate(pC,updateargs); > } > > > Note that the Character class had NPC related stuff in it like 'last > target'. We need that information to send a proper BodyRotation in the > AgentUpdateArgs > updateargs.BodyRotation = Vector3.RotationBetween(Vector3.UnitX, > Vector3.Normalize(Character.m_lastTarget - ScenePresence.AbsolutePosition)); > > Hopefully, I've given you enough code to get started. > > > Teravus > > On Wed, Oct 27, 2010 at 4:47 PM, bodzette Coignet < > [email protected]> wrote: > >> After some hair pulling and running into someone with complementary skills >> I've made some progress: >> I've managed to get a server side NPC to do the following: >> Rezz, Say something, Play an Animation and Delete itself. >> >> Unfortunately at the moment I can't get it to move and am currently >> investigating why not. Right now my understanding of things is somewhat >> limited so forgive me if my questions sound stupid to those in the know: >> >> A couple questions: >> >> Given that the NPC code appears to use a bunch of different autopilot >> code, I'm guessing that this is specific to NPCs and is not the way regular >> avatars move. It appears to be broken somehow, because the code is called >> but the NPC doesn't move. What is the difference between movement for a >> regular avatar and an NPC? It's my position that there really shouldn't be >> one, but could someone fill me in? >> >> What is the code that moves a standard (i.e. non-NPC avatar) is it >> Region.Framework.Scenes.ScenePresence.DoMoveToPosition or is it somewhere >> else? >> >> What is a ScenePresence? Is it that portion of a scene corresponding to a >> single avatar? If so is there any reason why an NPC avatar should exhibit >> different behavior here than a regular avatar? >> >> Can anyone give a program flow of how a regular avatar moves? >> My guess is it's something like this: >> Intecerpt Arrow Key or Movement Control Arrow -> >> Pass avatar UUID and force and vector to server -> >> server finds avatar in scene (looping through scene dictionary of avatars >> till it identifies the right one?) -> >> server applies force and vector to appropriate avatar in dictionary -> >> avatar enters, does and completes movement -> >> server updates entire scene x times per second until avatar movement is >> completed >> >> Anyone verify the flow? >> >> Thanks in advance. >> >> _______________________________________________ >> Opensim-users mailing list >> [email protected] >> https://lists.berlios.de/mailman/listinfo/opensim-users >> >> > > _______________________________________________ > Opensim-users mailing list > [email protected] > https://lists.berlios.de/mailman/listinfo/opensim-users > >
_______________________________________________ Opensim-users mailing list [email protected] https://lists.berlios.de/mailman/listinfo/opensim-users
