diff --git a/Programs/PrimWorkshop/frmBrowser.cs b/Programs/PrimWorkshop/frmBrowser.cs
index 9e8190be..ac3c6dba 100644
--- a/Programs/PrimWorkshop/frmBrowser.cs
+++ b/Programs/PrimWorkshop/frmBrowser.cs
@@ -40,7 +40,7 @@ namespace PrimWorkshop
// Terrain
float MaxHeight = 0.1f;
- TerrainManager.Patch[,] Heightmap;
+ TerrainPatch[,] Heightmap;
HeightmapLookupValue[] LookupHeightTable;
// Picking globals
@@ -214,12 +214,12 @@ namespace PrimWorkshop
private void InitHeightmap()
{
// Initialize the heightmap
- Heightmap = new TerrainManager.Patch[16, 16];
+ Heightmap = new TerrainPatch[16, 16];
for (int y = 0; y < 16; y++)
{
for (int x = 0; x < 16; x++)
{
- Heightmap[y, x] = new TerrainManager.Patch();
+ Heightmap[y, x] = new TerrainPatch();
Heightmap[y, x].Heightmap = new float[16 * 16];
}
}
diff --git a/Programs/Simian/Agent.cs b/Programs/Simian/Agent.cs
index 9ad06067..1bae2909 100644
--- a/Programs/Simian/Agent.cs
+++ b/Programs/Simian/Agent.cs
@@ -13,6 +13,8 @@ namespace Simian
public UUID SessionID;
public UUID SecureSessionID;
public uint CircuitCode;
+ public string FirstName;
+ public string LastName;
/// Sequence numbers of packets we've received (for duplicate checking)
internal Queue packetArchive = new Queue();
@@ -32,13 +34,8 @@ namespace Simian
set { address = value; }
}
- public Agent(UDPServer udpServer, UUID agentID, UUID sessionID, UUID secureSessionID, uint circuitCode)
+ public Agent(UDPServer udpServer)
{
- AgentID = agentID;
- SessionID = sessionID;
- SecureSessionID = secureSessionID;
- CircuitCode = circuitCode;
-
this.udpServer = udpServer;
}
diff --git a/Programs/Simian/Extensions/ConnectionManagement.cs b/Programs/Simian/Extensions/ConnectionManagement.cs
index b420fad4..b3c0a31c 100644
--- a/Programs/Simian/Extensions/ConnectionManagement.cs
+++ b/Programs/Simian/Extensions/ConnectionManagement.cs
@@ -6,19 +6,18 @@ namespace Simian
{
public class ConnectionManagement : ISimianExtension
{
- Simian Server;
+ Simian server;
public ConnectionManagement(Simian server)
{
- Server = server;
+ this.server = server;
}
public void Start()
{
- Server.UDPServer.RegisterPacketCallback(PacketType.UseCircuitCode, new UDPServer.PacketCallback(UseCircuitCodeHandler));
- Server.UDPServer.RegisterPacketCallback(PacketType.StartPingCheck, new UDPServer.PacketCallback(StartPingCheckHandler));
- Server.UDPServer.RegisterPacketCallback(PacketType.CompleteAgentMovement, new UDPServer.PacketCallback(CompleteAgentMovementHandler));
- Server.UDPServer.RegisterPacketCallback(PacketType.AgentUpdate, new UDPServer.PacketCallback(AgentUpdateHandler));
+ server.UDPServer.RegisterPacketCallback(PacketType.UseCircuitCode, new UDPServer.PacketCallback(UseCircuitCodeHandler));
+ server.UDPServer.RegisterPacketCallback(PacketType.StartPingCheck, new UDPServer.PacketCallback(StartPingCheckHandler));
+
}
public void Stop()
@@ -67,28 +66,5 @@ namespace Simian
agent.SendPacket(complete);
}
-
- void CompleteAgentMovementHandler(Packet packet, Agent agent)
- {
- uint regionX = 256000;
- uint regionY = 256000;
-
- CompleteAgentMovementPacket request = (CompleteAgentMovementPacket)packet;
-
- AgentMovementCompletePacket complete = new AgentMovementCompletePacket();
- complete.AgentData.AgentID = agent.AgentID;
- complete.AgentData.SessionID = agent.SessionID;
- complete.Data.LookAt = Vector3.UnitX;
- complete.Data.Position = new Vector3(128f, 128f, 25f);
- complete.Data.RegionHandle = Helpers.UIntsToLong(regionX, regionY);
- complete.Data.Timestamp = Utils.DateTimeToUnixTime(DateTime.Now);
- complete.SimData.ChannelVersion = Utils.StringToBytes("Simian");
-
- agent.SendPacket(complete);
- }
-
- void AgentUpdateHandler(Packet packet, Agent agent)
- {
- }
}
}
diff --git a/Programs/Simian/Extensions/SceneManager.cs b/Programs/Simian/Extensions/SceneManager.cs
new file mode 100644
index 00000000..05277d08
--- /dev/null
+++ b/Programs/Simian/Extensions/SceneManager.cs
@@ -0,0 +1,147 @@
+using System;
+using System.Collections.Generic;
+using System.Threading;
+using OpenMetaverse;
+using OpenMetaverse.Packets;
+
+namespace Simian
+{
+ public class SceneManager : ISimianExtension
+ {
+ Simian server;
+ Dictionary sceneObjects = new Dictionary();
+ Dictionary sceneAvatars = new Dictionary();
+ int currentLocalID = 0;
+ int currentWearablesSerialNum = 0;
+ ulong regionHandle;
+
+ public SceneManager(Simian server)
+ {
+ this.server = server;
+ }
+
+ public void Start()
+ {
+ uint regionX = 256000;
+ uint regionY = 256000;
+ regionHandle = Helpers.UIntsToLong(regionX, regionY);
+
+ server.UDPServer.RegisterPacketCallback(PacketType.CompleteAgentMovement, new UDPServer.PacketCallback(CompleteAgentMovementHandler));
+ server.UDPServer.RegisterPacketCallback(PacketType.AgentUpdate, new UDPServer.PacketCallback(AgentUpdateHandler));
+ server.UDPServer.RegisterPacketCallback(PacketType.AgentWearablesRequest, new UDPServer.PacketCallback(AgentWearablesRequestHandler));
+ }
+
+ public void Stop()
+ {
+ }
+
+ void CompleteAgentMovementHandler(Packet packet, Agent agent)
+ {
+ CompleteAgentMovementPacket request = (CompleteAgentMovementPacket)packet;
+
+ // Create a representation for this agent
+ Avatar avatar = new Avatar();
+ avatar.ID = agent.AgentID;
+ avatar.LocalID = (uint)Interlocked.Increment(ref currentLocalID);
+ avatar.Position = new Vector3(128f, 128f, 25f);
+ avatar.Rotation = Quaternion.Identity;
+ avatar.Scale = new Vector3(1f, 1f, 3f);
+
+ // Add this agent to the scene graph
+ lock (sceneAvatars)
+ sceneAvatars[avatar.ID] = avatar;
+
+ AgentMovementCompletePacket complete = new AgentMovementCompletePacket();
+ complete.AgentData.AgentID = agent.AgentID;
+ complete.AgentData.SessionID = agent.SessionID;
+ complete.Data.LookAt = Vector3.UnitX;
+ complete.Data.Position = avatar.Position;
+ complete.Data.RegionHandle = regionHandle;
+ complete.Data.Timestamp = Utils.DateTimeToUnixTime(DateTime.Now);
+ complete.SimData.ChannelVersion = Utils.StringToBytes("Simian");
+
+ agent.SendPacket(complete);
+ }
+
+ void AgentUpdateHandler(Packet packet, Agent agent)
+ {
+ AgentUpdatePacket update = (AgentUpdatePacket)packet;
+
+ Avatar avatar;
+ if (sceneAvatars.TryGetValue(agent.AgentID, out avatar))
+ {
+ SendFullUpdate(agent, avatar, update.AgentData.State, update.AgentData.Flags);
+ }
+ }
+
+ void AgentWearablesRequestHandler(Packet packet, Agent agent)
+ {
+ /*AgentWearablesUpdatePacket update = new AgentWearablesUpdatePacket();
+ update.AgentData.AgentID = agent.AgentID;
+ update.AgentData.SessionID = agent.SessionID;
+ // Technically this should be per-agent, but if the only requirement is that it
+ // increments this is easier
+ update.AgentData.SerialNum = (uint)Interlocked.Increment(ref currentWearablesSerialNum);
+ update.WearableData = new AgentWearablesUpdatePacket.WearableDataBlock[0];
+
+ agent.SendPacket(update);*/
+ }
+
+ void SendFullUpdate(Agent agent, LLObject obj, byte state, uint flags)
+ {
+ ObjectUpdatePacket update = new ObjectUpdatePacket();
+ update.RegionData.RegionHandle = regionHandle;
+ update.RegionData.TimeDilation = Helpers.FloatToByte(1f, 0f, 1f);
+ update.ObjectData = new ObjectUpdatePacket.ObjectDataBlock[1];
+ update.ObjectData[0] = new ObjectUpdatePacket.ObjectDataBlock();
+ update.ObjectData[0].ClickAction = (byte)0;
+ update.ObjectData[0].CRC = 0;
+ update.ObjectData[0].ExtraParams = new byte[0];
+ update.ObjectData[0].Flags = 0;
+ update.ObjectData[0].FullID = obj.ID;
+ update.ObjectData[0].Gain = 0;
+ update.ObjectData[0].ID = obj.LocalID;
+ update.ObjectData[0].JointAxisOrAnchor = Vector3.Zero;
+ update.ObjectData[0].JointPivot = Vector3.Zero;
+ update.ObjectData[0].JointType = (byte)0;
+ update.ObjectData[0].Material = (byte)3;
+ update.ObjectData[0].MediaURL = new byte[0];
+ update.ObjectData[0].NameValue = new byte[0];
+ update.ObjectData[0].ObjectData = new byte[60];
+ update.ObjectData[0].OwnerID = UUID.Zero;
+ update.ObjectData[0].ParentID = 0;
+ update.ObjectData[0].PathBegin = 0;
+ update.ObjectData[0].PathCurve = (byte)32;
+ update.ObjectData[0].PathEnd = 0;
+ update.ObjectData[0].PathRadiusOffset = (sbyte)0;
+ update.ObjectData[0].PathRevolutions = (byte)0;
+ update.ObjectData[0].PathScaleX = (byte)100;
+ update.ObjectData[0].PathScaleY = (byte)150;
+ update.ObjectData[0].PathShearX = (byte)0;
+ update.ObjectData[0].PathShearY = (byte)0;
+ update.ObjectData[0].PathSkew = (sbyte)0;
+ update.ObjectData[0].PathTaperX = (sbyte)0;
+ update.ObjectData[0].PathTaperY = (sbyte)0;
+ update.ObjectData[0].PathTwist = (sbyte)0;
+ update.ObjectData[0].PathTwistBegin = (sbyte)0;
+ update.ObjectData[0].PCode = (byte)PCode.Avatar;
+ update.ObjectData[0].ProfileBegin = 0;
+ update.ObjectData[0].ProfileCurve = (byte)0;
+ update.ObjectData[0].ProfileEnd = 0;
+ update.ObjectData[0].ProfileHollow = 0;
+ update.ObjectData[0].PSBlock = new byte[0];
+ update.ObjectData[0].TextColor = Vector3.Zero.GetBytes();
+ update.ObjectData[0].TextureAnim = new byte[0];
+ update.ObjectData[0].TextureEntry = new byte[63];
+ update.ObjectData[0].Radius = 0f;
+ update.ObjectData[0].Scale = obj.Scale;
+ update.ObjectData[0].Sound = UUID.Zero;
+ update.ObjectData[0].State = state;
+ update.ObjectData[0].Text = new byte[0];
+ update.ObjectData[0].UpdateFlags = flags;
+ update.ObjectData[0].Data = new byte[0];
+
+ agent.SendPacket(update);
+ }
+ }
+}
diff --git a/Programs/Simian/Simian.ViewerEffectPrinter.cs.example b/Programs/Simian/Simian.ViewerEffectPrinter.cs.example
index 5ec8acc9..25c4f52f 100644
--- a/Programs/Simian/Simian.ViewerEffectPrinter.cs.example
+++ b/Programs/Simian/Simian.ViewerEffectPrinter.cs.example
@@ -6,16 +6,16 @@ namespace Simian
{
public class ViewerEffectPrinter : ISimianExtension
{
- Simian Server;
+ Simian server;
public ViewerEffectPrinter(Simian server)
{
- Server = server;
+ this.server = server;
}
public void Start()
{
- Server.UDPServer.RegisterPacketCallback(PacketType.ViewerEffect, new UDPServer.PacketCallback(ViewerEffectHandler));
+ server.UDPServer.RegisterPacketCallback(PacketType.ViewerEffect, new UDPServer.PacketCallback(ViewerEffectHandler));
}
public void Stop()
diff --git a/Programs/Simian/Simian.cs b/Programs/Simian/Simian.cs
index 4ce96b3d..467d9b30 100644
--- a/Programs/Simian/Simian.cs
+++ b/Programs/Simian/Simian.cs
@@ -236,22 +236,30 @@ namespace Simian
uint regionX = 256000;
uint regionY = 256000;
+ Agent agent = new Agent(UDPServer);
+ agent.AgentID = UUID.Random();
+ agent.FirstName = firstName;
+ agent.LastName = lastName;
+ agent.SessionID = UUID.Random();
+ agent.SecureSessionID = UUID.Random();
+ agent.CircuitCode = CreateAgentCircuit(agent);
+
// Setup default login response values
LoginResponseData response;
- response.AgentID = UUID.Random();
- response.SecureSessionID = UUID.Random();
- response.SessionID = UUID.Random();
- response.CircuitCode = CreateAgentCircuit(response.AgentID, response.SessionID, response.SecureSessionID);
+ response.AgentID = agent.AgentID;
+ response.SecureSessionID = agent.SecureSessionID;
+ response.SessionID = agent.SessionID;
+ response.CircuitCode = agent.CircuitCode;
response.AgentAccess = "M";
response.BuddyList = null;
- response.FirstName = firstName;
+ response.FirstName = agent.FirstName;
response.HomeLookAt = Vector3.UnitX;
response.HomePosition = new Vector3(128f, 128f, 25f);
response.HomeRegion = Helpers.UIntsToLong(regionX, regionY);
response.InventoryFolders = null;
response.InventoryRoot = UUID.Random();
- response.LastName = lastName;
+ response.LastName = agent.LastName;
response.LibraryFolders = null;
response.LibraryOwner = response.AgentID;
response.LibraryRoot = UUID.Random();
@@ -271,17 +279,15 @@ namespace Simian
return response;
}
- uint CreateAgentCircuit(UUID agentID, UUID sessionID, UUID secureSessionID)
+ uint CreateAgentCircuit(Agent agent)
{
uint circuitCode = (uint)Interlocked.Increment(ref currentCircuitCode);
- Agent agent = new Agent(UDPServer, agentID, sessionID, secureSessionID, circuitCode);
-
// Put this client in the list of clients that have not been associated with an IPEndPoint yet
lock (unassociatedAgents)
unassociatedAgents[circuitCode] = agent;
- Logger.Log("Created a circuit for agent " + agentID.ToString(), Helpers.LogLevel.Info);
+ Logger.Log("Created a circuit for " + agent.FirstName, Helpers.LogLevel.Info);
return circuitCode;
}
diff --git a/Programs/Simian/UDPServer.cs b/Programs/Simian/UDPServer.cs
index ec3527ab..73b55b08 100644
--- a/Programs/Simian/UDPServer.cs
+++ b/Programs/Simian/UDPServer.cs
@@ -129,7 +129,6 @@ namespace Simian
protected override void PacketSent(UDPPacketBuffer buffer, int bytesSent)
{
- Logger.DebugLog("Sent " + buffer.DataLength + " byte packet");
}
private void IncomingPacketHandler()