using System; using System.Collections.Generic; using System.Drawing; using System.Reflection; using log4net; using Nini.Config; using OpenMetaverse; //using OpenMetaverseTypes; //this is private library of OpenMetaverse using OpenSim.Framework; using OpenSim.Region.Framework.Interfaces; using OpenSim.Region.Framework.Scenes; namespace HelloWorldModule { public class HelloWorld : IRegionModule { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); // A Scene is OpenSim's representation of the contents of a region //List m_scenes = new List(); Scene myScene; Dictionary> scene_prims = new Dictionary>(); int counter = 0; bool positive = true; #region IRegionModule interface public void Initialise(Scene scene, IConfigSource config) {// OpenSim sends us two parameters: a Scene object and a configuration object. // The Scene object is our code's main link to OpenSim, it's how we get // to access and modify things in the world and beyond. m_log.Info("[Hello World Module] Initializing... <-------------------------------------"); m_log.Info(" "); m_log.Info(" "); //m_scenes.Add(scene); myScene = scene; } public void PostInitialise() {// You should look at PostInitialise as the Main method of our region modules. // Subscribe to an OpenSim event called OnFrame. // OnFrame is triggered every time there is a render frame in opensim, // which is about 20 times per second. //m_scenes[0].EventManager.OnFrame += new EventManager.OnFrameDelegate(OnTick); //myScene.EventManager.OnFrame += new EventManager.OnFrameDelegate(OnTick); //foreach (Scene s in m_scenes) //DoHelloWorld() will be run in every region // DoHelloWorld(s); //DoHelloWorld(myScene); //List Avatars = myScene.GetAvatars(); //foreach (ScenePresence sp in Avatars) // //sp.ControllingClient.OnChatFromClient += new ChatMessage(Handler_OnChatFromClient); // sp.ControllingClient.OnChatFromClient += Handler_OnChatFromClient; List entities = myScene.GetEntities(); foreach (EntityBase entity in entities) { if (entity is SceneObjectGroup) { m_log.Info("Color is: " + ((SceneObjectGroup)entity).RootPart.Color); } } myScene.EventManager.OnChatFromClient += Handler_OnChatFromClient; } public void Close() { } public string Name { get { return "Hello World Module"; } } // This is shared module. If you want to use module in only one region use // not shared (singleton) module. //public bool IsSharedModule //{ // get { return true; } //} public bool IsSharedModule { get { return false; } } #endregion void DoHelloWorld(Scene scene) { // We're going to write HELLO with prims List prims1 = new List(); List prims2 = new List(); Color color1 = Color.FromArgb(255, 255, 0, 0); //Color color2 = Color.FromArgb(128, 0, 255, 0); Color color2 = Color.FromName("Black"); Color color3 = Color.FromArgb(0, 0, 0, 255); m_log.Info(" "); m_log.Info("[Hello World Module] I am going to build prims ..."); //m_log.Info("Press enter key"); //Console.ReadLine(); // First prim: | SceneObjectPart sop = new SceneObjectPart(); sop.UUID = new UUID(); sop.CreatorID = UUID.Zero; sop.Shape = PrimitiveBaseShape.CreateBox(); //sop.GroupPosition = pos; sop.Material = (byte)Material.Metal; sop.Color = color1; sop.Scale = new Vector3(0.3f, 0.3f, 2f); //SceneObjectGroup sog = new SceneObjectGroup(UUID.Zero, pos, PrimitiveBaseShape.CreateBox()); //sog.RootPart.Scale = new Vector3(0.3f, 0.3f, 2f); SceneObjectGroup sog = new SceneObjectGroup(); Vector3 pos = new Vector3(120, 128, 30); sog.AbsolutePosition = pos; sog.SetRootPart(sop); prims1.Add(sog); // A scene object group is conceptually an object in the scene. // The object is constituted of SceneObjectParts (child prims), // one of which is considered the root part. // Second prim: - pos = new Vector3(120.5f, 128f, 30f); sog = new SceneObjectGroup(UUID.Zero, pos, PrimitiveBaseShape.CreateBox()); sog.RootPart.Scale = new Vector3(1, 0.3f, 0.3f); sog.RootPart.Material = (byte)Material.Metal; //sog.RootPart.Material = 1; sog.RootPart.Color = color2; m_log.Info("Color2 is: " + sog.RootPart.Color.ToString()); prims1.Add(sog); // Third prim: | pos = new Vector3(121, 128, 30); sog = new SceneObjectGroup(UUID.Zero, pos, PrimitiveBaseShape.CreateBox()); sog.RootPart.Scale = new Vector3(0.3f, 0.3f, 2); sog.RootPart.Material = (byte)Material.Metal; sog.RootPart.Material = 2; sog.RootPart.Color = color3; m_log.Info("Color3 is: " + sog.RootPart.Color.ToString()); prims1.Add(sog); // Fourth prim: | pos = new Vector3(122, 128, 30); sog = new SceneObjectGroup(UUID.Zero, pos, PrimitiveBaseShape.CreateBox()); sog.RootPart.Scale = new Vector3(0.3f, 0.3f, 2); prims2.Add(sog); // Fifth prim: - (up) pos = new Vector3(122.5f, 128, 31); sog = new SceneObjectGroup(UUID.Zero, pos, PrimitiveBaseShape.CreateBox()); sog.RootPart.Scale = new Vector3(1, 0.3f, 0.3f); prims2.Add(sog); // Sixth prim: - (middle) pos = new Vector3(122.5f, 128, 30); sog = new SceneObjectGroup(UUID.Zero, pos, PrimitiveBaseShape.CreateBox()); sog.RootPart.Scale = new Vector3(1, 0.3f, 0.3f); prims2.Add(sog); // Seventh prim: - (low) pos = new Vector3(122.5f, 128, 29); sog = new SceneObjectGroup(UUID.Zero, pos, PrimitiveBaseShape.CreateBox()); sog.RootPart.Scale = new Vector3(1, 0.3f, 0.3f); prims2.Add(sog); // Eighth prim: | pos = new Vector3(124, 128, 30); sog = new SceneObjectGroup(UUID.Zero, pos, PrimitiveBaseShape.CreateBox()); sog.RootPart.Scale = new Vector3(0.3f, 0.3f, 2); prims1.Add(sog); // Ninth prim: _ pos = new Vector3(124.5f, 128, 29); sog = new SceneObjectGroup(UUID.Zero, pos, PrimitiveBaseShape.CreateBox()); sog.RootPart.Scale = new Vector3(1, 0.3f, 0.3f); prims1.Add(sog); // Tenth prim: | pos = new Vector3(126, 128, 30); sog = new SceneObjectGroup(UUID.Zero, pos, PrimitiveBaseShape.CreateBox()); sog.RootPart.Scale = new Vector3(0.3f, 0.3f, 2); prims2.Add(sog); // Eleventh prim: _ pos = new Vector3(126.5f, 128, 29); sog = new SceneObjectGroup(UUID.Zero, pos, PrimitiveBaseShape.CreateBox()); sog.RootPart.Scale = new Vector3(1, 0.3f, 0.3f); prims2.Add(sog); // Twelveth prim: O pos = new Vector3(129, 128, 30); sog = new SceneObjectGroup(UUID.Zero, pos, PrimitiveBaseShape.CreateBox()); sog.RootPart.Scale = new Vector3(2, 0.3f, 2); prims1.Add(sog); // Add prim1 to the managed objects. Only prims from prims1 list will be moved // in OnTick event handler scene_prims.Add(scene, prims1); // Now place all prims visibly on the scene foreach (SceneObjectGroup sogr in prims1) { scene.AddNewSceneObject(sogr, false); } foreach (SceneObjectGroup sogr in prims2) { scene.AddNewSceneObject(sogr, false); } }//DoHelloWorld() ////////////////////////////// Event Handlers //////////////////////////////////// void Handler_OnChatFromClient(object sender, OSChatMessage e) { //m_log.Info("Inside Handler_OnChatFromClient()"); switch (e.Message.ToLower()) { case "build": //DoHelloWorld(myScene); break; case "start": //myScene.EventManager.OnFrame += new EventManager.OnFrameDelegate(OnTick); myScene.EventManager.OnFrame += OnTick; break; case "stop": myScene.EventManager.OnFrame -= OnTick; break; } } void OnTick() { if (counter++ % 25 != 0) return; // Uncomment if you want to see this on your console //m_log.Debug("[HELLOWORLD] Tick!"); foreach (KeyValuePair> kvp in scene_prims) { foreach (SceneObjectGroup sog in kvp.Value) { if (positive) sog.AbsolutePosition += new Vector3(5, 5, 0); else sog.AbsolutePosition += new Vector3(-5, -5, 0); // Tell OpenSim to schedule the prims for an update, // so that we can see them move. sog.ScheduleGroupForTerseUpdate(); } } positive = !positive; }//OnTick() }//class HelloWorld }