public bool Run()
        {
            var pInfo = new NpcPresenceInfo
            {
                Npc               = new UGUIWithName(UUID.Random, "Npc", "Test"),
                Owner             = new UGUIWithName(UUID.Random, "Test", "User", new Uri("http://example.com/")),
                Group             = new UGI(UUID.Random, "NpcGroup", new Uri("http://example.com/")),
                RegionID          = UUID.Random,
                Position          = new Vector3(128, 128, 23),
                LookAt            = new Vector3(1, -1, 0.5),
                SittingOnObjectID = UUID.Random
            };

            m_Log.Info("---- Check precondition ----");
            if (!CheckNonExistence(pInfo))
            {
                return(false);
            }

            m_Log.Info("---- Presence Login ----");
            m_PresenceService.Store(pInfo);

            m_Log.Info("---- Verify existence ----");
            if (!CheckExistence(pInfo))
            {
                return(false);
            }

            UUID newRegionID = UUID.Random;

            /* ensure that we get a different id */
            while (newRegionID == pInfo.RegionID)
            {
                newRegionID = UUID.Random;
            }

            m_Log.Info("---- Verify entry to be removed ----");
            m_PresenceService.Remove(pInfo.Npc.ID);
            if (!CheckNonExistence(pInfo))
            {
                return(false);
            }

            return(true);
        }
Exemple #2
0
        public NpcAgent CreateNpc(UUID sceneid, UGUI owner, UGI group, string firstName, string lastName, Vector3 position, Notecard nc, NpcOptions options = NpcOptions.None)
        {
            SceneInterface   scene;
            AgentServiceList agentServiceList = m_NonpersistentAgentServices;

            if ((options & NpcOptions.Persistent) != NpcOptions.None)
            {
                if (m_NpcPresenceService == null)
                {
                    throw new InvalidOperationException("Persistence of NPCs not configured");
                }
                agentServiceList = m_PersistentAgentServices;
            }

            NpcPresenceServiceInterface presenceService  = agentServiceList.Get <NpcPresenceServiceInterface>();
            InventoryServiceInterface   inventoryService = agentServiceList.Get <InventoryServiceInterface>();

            var npcId = new UGUIWithName
            {
                ID        = UUID.Random,
                FirstName = firstName,
                LastName  = lastName
            };

            if (m_KnownScenes.TryGetValue(sceneid, out scene))
            {
                var agent = new NpcAgent(npcId, agentServiceList, sceneid)
                {
                    NpcOwner = owner,
                    Group    = group
                };
                try
                {
                    m_NpcAgents.Add(agent.ID, agent);
                    var npcInfo = new NpcPresenceInfo
                    {
                        RegionID = sceneid,
                        Npc      = agent.NamedOwner,
                        Owner    = agent.NpcOwner,
                        Group    = agent.Group,
                    };
                    inventoryService.CheckInventory(npcInfo.Npc.ID);
                    presenceService.Store(npcInfo);
                    agent.CurrentScene = scene;
                    agent.Position     = position;
                    scene.Add(agent);
                }
                catch
                {
                    if (m_NpcPresenceService != null)
                    {
                        presenceService.Remove(agent.ID);
                    }
                    inventoryService.Remove(agent.ID);
                    m_NpcAgents.Remove(agent.ID);
                    throw;
                }
                agent.EnableListen();

                scene.SendAgentObjectToAllAgents(agent);
                agent.SendAnimations();

                ThreadPool.QueueUserWorkItem(LoadAppearanceFromNotecardJob, new RebakeJob {
                    Notecard = nc, Agent = agent
                });
                return(agent);
            }

            throw new KeyNotFoundException("Scene not found");
        }