* Applying dalien's patches from bug#177 and #179
parent
f0ecc1de4c
commit
561b87b303
|
@ -23,6 +23,11 @@ namespace OpenSim.Framework
|
||||||
m_clients = new Dictionary<uint, IClientAPI>();
|
m_clients = new Dictionary<uint, IClientAPI>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void Remove(uint id)
|
||||||
|
{
|
||||||
|
m_clients.Remove(id);
|
||||||
|
}
|
||||||
|
|
||||||
public void Add(uint id, IClientAPI client )
|
public void Add(uint id, IClientAPI client )
|
||||||
{
|
{
|
||||||
m_clients.Add( id, client );
|
m_clients.Add( id, client );
|
||||||
|
|
|
@ -147,6 +147,8 @@ namespace OpenSim.Framework.Interfaces
|
||||||
|
|
||||||
void OutPacket(Packet newPack);
|
void OutPacket(Packet newPack);
|
||||||
void SendWearables(AvatarWearable[] wearables);
|
void SendWearables(AvatarWearable[] wearables);
|
||||||
|
void SendStartPingCheck(byte seq);
|
||||||
|
void SendKillObject(ulong regionHandle, uint avatarLocalID);
|
||||||
void SendAnimation(LLUUID animID, int seq, LLUUID sourceAgentId);
|
void SendAnimation(LLUUID animID, int seq, LLUUID sourceAgentId);
|
||||||
void SendRegionHandshake(RegionInfo regionInfo);
|
void SendRegionHandshake(RegionInfo regionInfo);
|
||||||
void SendChatMessage(string message, byte type, LLVector3 fromPos, string fromName, LLUUID fromAgentID);
|
void SendChatMessage(string message, byte type, LLVector3 fromPos, string fromName, LLUUID fromAgentID);
|
||||||
|
|
|
@ -476,6 +476,23 @@ namespace OpenSim.Region.ClientStack
|
||||||
OutPacket(money);
|
OutPacket(money);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void SendStartPingCheck(byte seq)
|
||||||
|
{
|
||||||
|
StartPingCheckPacket pc = new StartPingCheckPacket();
|
||||||
|
pc.PingID.PingID = seq;
|
||||||
|
OutPacket(pc);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SendKillObject(ulong regionHandle, uint avatarLocalID)
|
||||||
|
{
|
||||||
|
KillObjectPacket kill = new KillObjectPacket();
|
||||||
|
kill.ObjectData = new KillObjectPacket.ObjectDataBlock[1];
|
||||||
|
kill.ObjectData[0] = new KillObjectPacket.ObjectDataBlock();
|
||||||
|
kill.ObjectData[0].ID = avatarLocalID;
|
||||||
|
OutPacket(kill);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#region Appearance/ Wearables Methods
|
#region Appearance/ Wearables Methods
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
|
@ -51,29 +51,8 @@ namespace OpenSim.Region.ClientStack
|
||||||
logReply.InventoryData[0] = new LogoutReplyPacket.InventoryDataBlock();
|
logReply.InventoryData[0] = new LogoutReplyPacket.InventoryDataBlock();
|
||||||
logReply.InventoryData[0].ItemID = LLUUID.Zero;
|
logReply.InventoryData[0].ItemID = LLUUID.Zero;
|
||||||
OutPacket(logReply);
|
OutPacket(logReply);
|
||||||
//tell all clients to kill our object
|
//
|
||||||
KillObjectPacket kill = new KillObjectPacket();
|
this.KillClient();
|
||||||
kill.ObjectData = new KillObjectPacket.ObjectDataBlock[1];
|
|
||||||
kill.ObjectData[0] = new KillObjectPacket.ObjectDataBlock();
|
|
||||||
// kill.ObjectData[0].ID = this.ClientAvatar.localid;
|
|
||||||
foreach (ClientView client in m_clientThreads.Values)
|
|
||||||
{
|
|
||||||
client.OutPacket(kill);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.m_inventoryCache.ClientLeaving(this.AgentID, null);
|
|
||||||
|
|
||||||
|
|
||||||
// m_gridServer.LogoutSession(this.SessionID, this.AgentID, this.CircuitCode);
|
|
||||||
/*lock (m_world.Entities)
|
|
||||||
{
|
|
||||||
m_world.Entities.Remove(this.AgentID);
|
|
||||||
}*/
|
|
||||||
// m_world.RemoveViewerAgent(this);
|
|
||||||
//need to do other cleaning up here too
|
|
||||||
m_clientThreads.Remove(this.CircuitCode);
|
|
||||||
m_networkServer.RemoveClientCircuit(this.CircuitCode);
|
|
||||||
this.ClientThread.Abort();
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -45,7 +45,7 @@ namespace OpenSim.Region.ClientStack
|
||||||
{
|
{
|
||||||
if (Pack.Type != PacketType.AgentUpdate)
|
if (Pack.Type != PacketType.AgentUpdate)
|
||||||
{
|
{
|
||||||
Console.WriteLine("IN: " + Pack.Type.ToString());
|
Console.WriteLine(CircuitCode + ":IN: " + Pack.Type.ToString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Net;
|
using System.Net;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
@ -77,6 +78,11 @@ namespace OpenSim.Region.ClientStack
|
||||||
private int cachedtextureserial = 0;
|
private int cachedtextureserial = 0;
|
||||||
protected AuthenticateSessionsBase m_authenticateSessionsHandler;
|
protected AuthenticateSessionsBase m_authenticateSessionsHandler;
|
||||||
private Encoding enc = Encoding.ASCII;
|
private Encoding enc = Encoding.ASCII;
|
||||||
|
// Dead client detection vars
|
||||||
|
private Timer clientPingTimer;
|
||||||
|
private int packetsReceived = 0;
|
||||||
|
private int probesWithNoIngressPackets = 0;
|
||||||
|
private int lastPacketsReceived = 0;
|
||||||
|
|
||||||
public ClientView(EndPoint remoteEP, UseCircuitCodePacket initialcirpack, Dictionary<uint, ClientView> clientThreads, IWorld world, AssetCache assetCache, PacketServer packServer, InventoryCache inventoryCache, AuthenticateSessionsBase authenSessions )
|
public ClientView(EndPoint remoteEP, UseCircuitCodePacket initialcirpack, Dictionary<uint, ClientView> clientThreads, IWorld world, AssetCache assetCache, PacketServer packServer, InventoryCache inventoryCache, AuthenticateSessionsBase authenSessions )
|
||||||
{
|
{
|
||||||
|
@ -112,15 +118,7 @@ namespace OpenSim.Region.ClientStack
|
||||||
|
|
||||||
public void KillClient()
|
public void KillClient()
|
||||||
{
|
{
|
||||||
KillObjectPacket kill = new KillObjectPacket();
|
clientPingTimer.Stop();
|
||||||
kill.ObjectData = new KillObjectPacket.ObjectDataBlock[1];
|
|
||||||
kill.ObjectData[0] = new KillObjectPacket.ObjectDataBlock();
|
|
||||||
//kill.ObjectData[0].ID = this.ClientAvatar.localid;
|
|
||||||
foreach (ClientView client in m_clientThreads.Values)
|
|
||||||
{
|
|
||||||
client.OutPacket(kill);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.m_inventoryCache.ClientLeaving(this.AgentID, null);
|
this.m_inventoryCache.ClientLeaving(this.AgentID, null);
|
||||||
m_world.RemoveClient(this.AgentId);
|
m_world.RemoveClient(this.AgentId);
|
||||||
|
|
||||||
|
@ -193,6 +191,9 @@ namespace OpenSim.Region.ClientStack
|
||||||
if (nextPacket.Incoming)
|
if (nextPacket.Incoming)
|
||||||
{
|
{
|
||||||
//is a incoming packet
|
//is a incoming packet
|
||||||
|
if (nextPacket.Packet.Type != PacketType.AgentUpdate) {
|
||||||
|
packetsReceived++;
|
||||||
|
}
|
||||||
ProcessInPacket(nextPacket.Packet);
|
ProcessInPacket(nextPacket.Packet);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -204,10 +205,31 @@ namespace OpenSim.Region.ClientStack
|
||||||
}
|
}
|
||||||
# endregion
|
# endregion
|
||||||
|
|
||||||
|
protected void CheckClientConnectivity(object sender, ElapsedEventArgs e)
|
||||||
|
{
|
||||||
|
if (packetsReceived == lastPacketsReceived) {
|
||||||
|
probesWithNoIngressPackets++;
|
||||||
|
if (probesWithNoIngressPackets > 30) {
|
||||||
|
this.KillClient();
|
||||||
|
} else {
|
||||||
|
// this will normally trigger at least one packet (ping response)
|
||||||
|
SendStartPingCheck(0);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Something received in the meantime - we can reset the counters
|
||||||
|
probesWithNoIngressPackets = 0;
|
||||||
|
lastPacketsReceived = packetsReceived;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
# region Setup
|
# region Setup
|
||||||
|
|
||||||
protected virtual void InitNewClient()
|
protected virtual void InitNewClient()
|
||||||
{
|
{
|
||||||
|
clientPingTimer = new Timer(1000);
|
||||||
|
clientPingTimer.Elapsed += new ElapsedEventHandler(CheckClientConnectivity);
|
||||||
|
clientPingTimer.Enabled = true;
|
||||||
|
|
||||||
MainLog.Instance.Verbose( "OpenSimClient.cs:InitNewClient() - Adding viewer agent to world");
|
MainLog.Instance.Verbose( "OpenSimClient.cs:InitNewClient() - Adding viewer agent to world");
|
||||||
this.m_world.AddNewClient(this, false);
|
this.m_world.AddNewClient(this, false);
|
||||||
}
|
}
|
||||||
|
|
|
@ -71,8 +71,7 @@ namespace OpenSim.Region.ClientStack
|
||||||
// Keep track of when this packet was sent out
|
// Keep track of when this packet was sent out
|
||||||
Pack.TickCount = Environment.TickCount;
|
Pack.TickCount = Environment.TickCount;
|
||||||
|
|
||||||
|
Console.WriteLine(CircuitCode + ":OUT: " + Pack.Type.ToString());
|
||||||
// Console.WriteLine("OUT: " + Pack.Type.ToString());
|
|
||||||
|
|
||||||
if (!Pack.Header.Resent)
|
if (!Pack.Header.Resent)
|
||||||
{
|
{
|
||||||
|
|
|
@ -178,6 +178,7 @@ namespace OpenSim.Region.ClientStack
|
||||||
public virtual void RemoveClientCircuit(uint circuitcode)
|
public virtual void RemoveClientCircuit(uint circuitcode)
|
||||||
{
|
{
|
||||||
this._networkHandler.RemoveClientCircuit(circuitcode);
|
this._networkHandler.RemoveClientCircuit(circuitcode);
|
||||||
|
this.m_clientManager.Remove(circuitcode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -546,6 +546,28 @@ namespace OpenSim.Region.Environment.Scenes
|
||||||
{
|
{
|
||||||
eventManager.TriggerOnRemovePresence(agentID);
|
eventManager.TriggerOnRemovePresence(agentID);
|
||||||
|
|
||||||
|
ScenePresence avatar = this.RequestAvatar(agentID);
|
||||||
|
|
||||||
|
m_clientManager.ForEachClient(
|
||||||
|
delegate(IClientAPI client)
|
||||||
|
{
|
||||||
|
client.SendKillObject(avatar.RegionHandle, avatar.LocalId);
|
||||||
|
});
|
||||||
|
|
||||||
|
lock (Avatars) {
|
||||||
|
if (Avatars.ContainsKey(agentID)) {
|
||||||
|
Avatars.Remove(agentID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
lock (Entities) {
|
||||||
|
if (Entities.ContainsKey(agentID)) {
|
||||||
|
Entities.Remove(agentID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// TODO: Add the removal from physics ?
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
|
@ -91,6 +91,12 @@ namespace OpenSim.Region.Environment.Scenes
|
||||||
return _physActor;
|
return _physActor;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ulong RegionHandle
|
||||||
|
{
|
||||||
|
get { return m_regionHandle; }
|
||||||
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Constructor(s)
|
#region Constructor(s)
|
||||||
|
@ -390,6 +396,16 @@ namespace OpenSim.Region.Environment.Scenes
|
||||||
remoteAvatar.ControllingClient.SendAvatarData(m_regionInfo.RegionHandle, this.firstname, this.lastname, this.uuid, this.LocalId, this.Pos, DefaultTexture);
|
remoteAvatar.ControllingClient.SendAvatarData(m_regionInfo.RegionHandle, this.firstname, this.lastname, this.uuid, this.LocalId, this.Pos, DefaultTexture);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void SendFullUpdateToALLClients()
|
||||||
|
{
|
||||||
|
List<ScenePresence> avatars = this.m_world.RequestAvatarList();
|
||||||
|
foreach (ScenePresence avatar in this.m_world.RequestAvatarList())
|
||||||
|
{
|
||||||
|
this.SendFullUpdateToOtherClient(avatar);
|
||||||
|
avatar.SendFullUpdateToOtherClient(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -410,6 +426,7 @@ namespace OpenSim.Region.Environment.Scenes
|
||||||
public void SendOurAppearance(IClientAPI OurClient)
|
public void SendOurAppearance(IClientAPI OurClient)
|
||||||
{
|
{
|
||||||
this.ControllingClient.SendWearables(this.Wearables);
|
this.ControllingClient.SendWearables(this.Wearables);
|
||||||
|
this.SendFullUpdateToALLClients();
|
||||||
this.m_world.SendAllSceneObjectsToClient(this.ControllingClient);
|
this.m_world.SendAllSceneObjectsToClient(this.ControllingClient);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -429,13 +446,13 @@ namespace OpenSim.Region.Environment.Scenes
|
||||||
/// <param name="seq"></param>
|
/// <param name="seq"></param>
|
||||||
public void SendAnimPack(LLUUID animID, int seq)
|
public void SendAnimPack(LLUUID animID, int seq)
|
||||||
{
|
{
|
||||||
this.current_anim = animID;
|
this.current_anim = animID;
|
||||||
this.anim_seq = anim_seq;
|
this.anim_seq = seq;
|
||||||
List<ScenePresence> avatars = this.m_world.RequestAvatarList();
|
List<ScenePresence> avatars = this.m_world.RequestAvatarList();
|
||||||
for (int i = 0; i < avatars.Count; i++)
|
for (int i = 0; i < avatars.Count; i++)
|
||||||
{
|
{
|
||||||
avatars[i].ControllingClient.SendAnimation(animID, seq, this.ControllingClient.AgentId);
|
avatars[i].ControllingClient.SendAnimation(animID, seq, this.ControllingClient.AgentId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
Binary file not shown.
Loading…
Reference in New Issue