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);