diff --git a/OpenMetaverse/Types/Utils.cs b/OpenMetaverse/Types/Utils.cs index bb66b2e2..37d77a83 100644 --- a/OpenMetaverse/Types/Utils.cs +++ b/OpenMetaverse/Types/Utils.cs @@ -297,14 +297,12 @@ namespace OpenMetaverse /// An MD5 hash in string format, with $1$ prepended public static string MD5(string password) { - StringBuilder digest = new StringBuilder(); + StringBuilder digest = new StringBuilder(32); byte[] hash = MD5(ASCIIEncoding.Default.GetBytes(password)); // Convert the hash to a hex string foreach (byte b in hash) - { digest.AppendFormat(Utils.EnUsCulture, "{0:x2}", b); - } return "$1$" + digest.ToString(); } diff --git a/Programs/Simian/Extensions/ObjectManager.cs b/Programs/Simian/Extensions/ObjectManager.cs index ae969041..a60ff072 100644 --- a/Programs/Simian/Extensions/ObjectManager.cs +++ b/Programs/Simian/Extensions/ObjectManager.cs @@ -168,7 +168,7 @@ namespace Simian.Extensions // Add this prim to the object database SimulationObject simObj = new SimulationObject(prim, server); - server.Scene.ObjectAdd(this, agent, simObj, flags); + server.Scene.ObjectAdd(this, simObj, flags); } void ObjectDuplicateHandler(Packet packet, Agent agent) @@ -189,7 +189,7 @@ namespace Simian.Extensions newObj.Prim.Position += offset; newObj.Prim.ID = UUID.Random(); - server.Scene.ObjectAdd(this, agent, newObj, flags); + server.Scene.ObjectAdd(this, newObj, flags); } else { diff --git a/Programs/Simian/Extensions/Periscope.cs b/Programs/Simian/Extensions/Periscope.cs new file mode 100644 index 00000000..e680f06a --- /dev/null +++ b/Programs/Simian/Extensions/Periscope.cs @@ -0,0 +1,79 @@ +using System; +using System.Collections.Generic; +using System.Threading; +using ExtensionLoader; +using OpenMetaverse; +using OpenMetaverse.Packets; + +namespace Simian.Extensions +{ + public class Periscope : IExtension + { + const string FIRST_NAME = "Testing"; + const string LAST_NAME = "Anvil"; + const string PASSWORD = "testinganvil"; + + Simian server; + GridClient client; + + public Periscope() + { + client = new GridClient(); + client.Settings.SEND_AGENT_UPDATES = false; + + client.Objects.OnNewPrim += new OpenMetaverse.ObjectManager.NewPrimCallback(Objects_OnNewPrim); + client.Terrain.OnLandPatch += new TerrainManager.LandPatchCallback(Terrain_OnLandPatch); + } + + public void Start(Simian server) + { + this.server = server; + server.UDP.RegisterPacketCallback(PacketType.AgentUpdate, AgentUpdateHandler); + + // Start the login process + Thread loginThread = new Thread(new ThreadStart( + delegate() + { + client.Network.Login(FIRST_NAME, LAST_NAME, PASSWORD, "Simian Periscope", "1.0.0"); + + if (client.Network.Connected) + { + Logger.Log("Periscope is connected: " + client.Network.LoginMessage, Helpers.LogLevel.Info); + } + else + { + Logger.Log("Periscope failed to connect to the foreign grid: " + client.Network.LoginErrorKey, Helpers.LogLevel.Error); + } + } + )); + loginThread.Start(); + } + + public void Stop() + { + if (client.Network.Connected) + client.Network.Logout(); + } + + void Objects_OnNewPrim(Simulator simulator, Primitive prim, ulong regionHandle, ushort timeDilation) + { + SimulationObject simObj = new SimulationObject(prim, server); + server.Scene.ObjectAdd(this, simObj, prim.Flags); + } + + void Terrain_OnLandPatch(Simulator simulator, int x, int y, int width, float[] data) + { + //throw new NotImplementedException(); + } + + void AgentUpdateHandler(Packet packet, Agent agent) + { + AgentUpdatePacket update = (AgentUpdatePacket)packet; + + // Forward AgentUpdate packets with the AgentID/SessionID set to the bots ID + update.AgentData.AgentID = client.Self.AgentID; + update.AgentData.SessionID = client.Self.SessionID; + client.Network.SendPacket(update); + } + } +} diff --git a/Programs/Simian/Extensions/SceneManager.cs b/Programs/Simian/Extensions/SceneManager.cs index 45f457da..916c414e 100644 --- a/Programs/Simian/Extensions/SceneManager.cs +++ b/Programs/Simian/Extensions/SceneManager.cs @@ -57,13 +57,12 @@ namespace Simian.Extensions { } - public bool ObjectAdd(object sender, Agent creator, SimulationObject obj, PrimFlags creatorFlags) + public bool ObjectAdd(object sender, SimulationObject obj, PrimFlags creatorFlags) { // Check if the object already exists in the scene if (sceneObjects.ContainsKey(obj.Prim.ID)) { - Logger.Log(String.Format("Attempting to add duplicate object {0} to the scene", - obj.Prim.ID), Helpers.LogLevel.Warning); + ObjectModify(sender, obj, obj.Prim.PrimData); return false; } @@ -72,16 +71,19 @@ namespace Simian.Extensions if (OnObjectAdd != null) { - OnObjectAdd(sender, creator, obj, creatorFlags); + OnObjectAdd(sender, obj, creatorFlags); } // Add the object to the scene dictionary sceneObjects.Add(obj.Prim.LocalID, obj.Prim.ID, obj); // Send an update out to the creator - ObjectUpdatePacket updateToOwner = SimulationObject.BuildFullUpdate(obj.Prim, server.RegionHandle, 0, - obj.Prim.Flags | creatorFlags); - server.UDP.SendPacket(creator.AgentID, updateToOwner, PacketCategory.State); + if (server.Agents.ContainsKey(obj.Prim.OwnerID)) + { + ObjectUpdatePacket updateToOwner = SimulationObject.BuildFullUpdate(obj.Prim, server.RegionHandle, 0, + obj.Prim.Flags | creatorFlags); + server.UDP.SendPacket(obj.Prim.OwnerID, updateToOwner, PacketCategory.State); + } // Send an update out to everyone else ObjectUpdatePacket updateToOthers = SimulationObject.BuildFullUpdate(obj.Prim, server.RegionHandle, 0, @@ -90,7 +92,7 @@ namespace Simian.Extensions { foreach (Agent recipient in server.Agents.Values) { - if (recipient != creator) + if (recipient.AgentID != obj.Prim.OwnerID) server.UDP.SendPacket(recipient.AgentID, updateToOthers, PacketCategory.State); } } @@ -262,7 +264,7 @@ namespace Simian.Extensions agent.Balance = 1000; // Add this avatar as an object in the scene - if (ObjectAdd(this, agent, new SimulationObject(agent.Avatar, server), PrimFlags.None)) + if (ObjectAdd(this, new SimulationObject(agent.Avatar, server), PrimFlags.None)) { // Send a response back to the client AgentMovementCompletePacket complete = new AgentMovementCompletePacket(); diff --git a/Programs/Simian/Extensions/XMLPersistence.cs b/Programs/Simian/Extensions/XMLPersistence.cs index 092415d7..f3b60f65 100644 --- a/Programs/Simian/Extensions/XMLPersistence.cs +++ b/Programs/Simian/Extensions/XMLPersistence.cs @@ -62,28 +62,31 @@ namespace Simian.Extensions public void Stop() { - OSDMap dictionary = new OSDMap(server.PersistentExtensions.Count); - - for (int i = 0; i < server.PersistentExtensions.Count; i++) + if (server != null) { - IPersistable persistable = server.PersistentExtensions[i]; + OSDMap dictionary = new OSDMap(server.PersistentExtensions.Count); - Logger.DebugLog("Storing persistant data for " + persistable.ToString()); - dictionary.Add(persistable.ToString(), persistable.Serialize()); - } + for (int i = 0; i < server.PersistentExtensions.Count; i++) + { + IPersistable persistable = server.PersistentExtensions[i]; - try - { - XmlTextWriter writer = new XmlTextWriter(server.DataDir + "simiandata.xml", System.Text.Encoding.UTF8); - writer.Formatting = Formatting.Indented; - writer.WriteStartElement("llsd"); - OSDParser.SerializeLLSDXmlElement(writer, dictionary); - writer.WriteEndElement(); - writer.Close(); - } - catch (Exception ex) - { - Logger.Log("Failed to save persistance data: " + ex.Message, Helpers.LogLevel.Error); + Logger.DebugLog("Storing persistant data for " + persistable.ToString()); + dictionary.Add(persistable.ToString(), persistable.Serialize()); + } + + try + { + XmlTextWriter writer = new XmlTextWriter(server.DataDir + "simiandata.xml", System.Text.Encoding.UTF8); + writer.Formatting = Formatting.Indented; + writer.WriteStartElement("llsd"); + OSDParser.SerializeLLSDXmlElement(writer, dictionary); + writer.WriteEndElement(); + writer.Close(); + } + catch (Exception ex) + { + Logger.Log("Failed to save persistance data: " + ex.Message, Helpers.LogLevel.Error); + } } } } diff --git a/Programs/Simian/Interfaces/ISceneProvider.cs b/Programs/Simian/Interfaces/ISceneProvider.cs index ecd94f6a..f06ecda8 100644 --- a/Programs/Simian/Interfaces/ISceneProvider.cs +++ b/Programs/Simian/Interfaces/ISceneProvider.cs @@ -3,7 +3,7 @@ using OpenMetaverse; namespace Simian { - public delegate void ObjectAddCallback(object sender, Agent creator, SimulationObject obj, PrimFlags creatorFlags); + public delegate void ObjectAddCallback(object sender, SimulationObject obj, PrimFlags creatorFlags); public delegate void ObjectRemoveCallback(object sender, SimulationObject obj); public delegate void ObjectTransformCallback(object sender, SimulationObject obj, Vector3 position, Quaternion rotation, Vector3 velocity, Vector3 acceleration, @@ -33,7 +33,7 @@ namespace Simian float[] Heightmap { get; set; } float WaterHeight { get; } - bool ObjectAdd(object sender, Agent creator, SimulationObject obj, PrimFlags creatorFlags); + bool ObjectAdd(object sender, SimulationObject obj, PrimFlags creatorFlags); bool ObjectRemove(object sender, SimulationObject obj); void ObjectTransform(object sender, SimulationObject obj, Vector3 position, Quaternion rotation, Vector3 velocity, Vector3 acceleration, diff --git a/Programs/Simian/Main.cs b/Programs/Simian/Main.cs index 8898a6b5..35bbc612 100644 --- a/Programs/Simian/Main.cs +++ b/Programs/Simian/Main.cs @@ -9,7 +9,7 @@ namespace Simian static void Main(string[] args) { Simian simulator = new Simian(); - if (simulator.Start(9000, false)) + if (simulator.Start()) { Console.WriteLine("Simulator is running. Press ENTER to quit"); Console.ReadLine(); diff --git a/Programs/Simian/Simian.cs b/Programs/Simian/Simian.cs index f9ec17f6..79920051 100644 --- a/Programs/Simian/Simian.cs +++ b/Programs/Simian/Simian.cs @@ -22,7 +22,7 @@ namespace Simian public const uint REGION_Y = 256000; public int UDPPort = 9000; - public int HttpPort = 9000; + public int HttpPort = 8002; public string DataDir = "SimianData/"; public HttpServer HttpServer; @@ -50,10 +50,8 @@ namespace Simian { } - public bool Start(int port, bool ssl) + public bool Start() { - HttpPort = port; - UDPPort = port; List extensionList = null; try @@ -69,7 +67,7 @@ namespace Simian return false; } - InitHttpServer(HttpPort, ssl); + InitHttpServer(HttpPort, false); RegionHandle = Utils.UIntsToLong(REGION_X, REGION_Y);