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