diff --git a/Programs/Simian/Agent.cs b/Programs/Simian/Agent.cs index 2330ada7..ee4af900 100644 --- a/Programs/Simian/Agent.cs +++ b/Programs/Simian/Agent.cs @@ -20,6 +20,7 @@ namespace Simian public bool Running; public int TickFall; public int TickJump; + public int TickLastPacketReceived; public AgentManager.ControlFlags ControlFlags = AgentManager.ControlFlags.NONE; public AnimationSet Animations = new AnimationSet(); public Dictionary Inventory = new Dictionary(); diff --git a/Programs/Simian/Extensions/UDPServer.cs b/Programs/Simian/Extensions/UDPServer.cs index ccc90dd1..0795432a 100644 --- a/Programs/Simian/Extensions/UDPServer.cs +++ b/Programs/Simian/Extensions/UDPServer.cs @@ -35,7 +35,7 @@ namespace Simian Settings.NETWORK_TICK_INTERVAL); } - public void Dispose() + public void Shutdown() { ackTimer.Dispose(); } @@ -288,7 +288,7 @@ namespace Simian lock (client.NeedAcks) { foreach (uint ack in acks) - client.NeedAcks.Remove(ack); + client.NeedAcks.Remove(ack); } } @@ -366,6 +366,17 @@ namespace Simian packet.Header.Sequence, packet.GetType(), packet.ResendCount), Helpers.LogLevel.Warning); dropAck.Add(packet.Header.Sequence); + + //Disconnect an agent if no packets are received for some time + //TODO: Send logout packet? Also, 10000 should be a setting somewhere. + if (Environment.TickCount - client.Agent.TickLastPacketReceived > 10000) + { + Logger.Log(String.Format("Ack timeout for {0}, disconnecting", client.Agent.Avatar.Name), Helpers.LogLevel.Warning); + UUID remove = client.Agent.AgentID; + client.Shutdown(); + lock (server.Agents) server.Agents.Remove(remove); + return; + } } } } @@ -442,6 +453,8 @@ namespace Simian } } + client.Agent.TickLastPacketReceived = Environment.TickCount; + // Reliable handling if (packet.Header.Reliable) { diff --git a/Programs/Simian/Simian.cs b/Programs/Simian/Simian.cs index 25f2d6a5..058a8bf6 100644 --- a/Programs/Simian/Simian.cs +++ b/Programs/Simian/Simian.cs @@ -335,6 +335,7 @@ namespace Simian agent.Flags = PrimFlags.Physics | PrimFlags.ObjectModify | PrimFlags.ObjectCopy | PrimFlags.ObjectAnyOwner | PrimFlags.ObjectMove | PrimFlags.InventoryEmpty | PrimFlags.ObjectTransfer | PrimFlags.ObjectOwnerModify | PrimFlags.ObjectYouOwner; + agent.TickLastPacketReceived = Environment.TickCount; // Setup the agent inventory InventoryFolder rootFolder = new InventoryFolder();