diff --git a/OpenSim/Framework/IClientAPI.cs b/OpenSim/Framework/IClientAPI.cs
index 5909ce1af9..e31c7f6d23 100644
--- a/OpenSim/Framework/IClientAPI.cs
+++ b/OpenSim/Framework/IClientAPI.cs
@@ -1038,7 +1038,7 @@ namespace OpenSim.Framework
event MuteListEntryRemove OnRemoveMuteListEntry;
event GodlikeMessage onGodlikeMessage;
event GodUpdateRegionInfoUpdate OnGodUpdateRegionInfoUpdate;
-
+ event GenericCall2 OnUpdateThrottles;
///
/// Set the debug level at which packet output should be printed to console.
///
diff --git a/OpenSim/Region/ClientStack/Linden/Caps/GetTextureModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/GetTextureModule.cs
index d1a158379e..19d4b91bdd 100644
--- a/OpenSim/Region/ClientStack/Linden/Caps/GetTextureModule.cs
+++ b/OpenSim/Region/ClientStack/Linden/Caps/GetTextureModule.cs
@@ -91,6 +91,7 @@ namespace OpenSim.Region.ClientStack.Linden
{
m_scene.EventManager.OnRegisterCaps -= RegisterCaps;
m_scene.EventManager.OnDeregisterCaps -= DeregisterCaps;
+ m_scene.EventManager.OnThrottleUpdate -= ThrottleUpdate;
m_scene = null;
}
@@ -101,6 +102,7 @@ namespace OpenSim.Region.ClientStack.Linden
m_scene.EventManager.OnRegisterCaps += RegisterCaps;
m_scene.EventManager.OnDeregisterCaps += DeregisterCaps;
+ m_scene.EventManager.OnThrottleUpdate += ThrottleUpdate;
if (m_workerThreads == null)
{
@@ -118,6 +120,46 @@ namespace OpenSim.Region.ClientStack.Linden
}
}
}
+ private int ExtractImageThrottle(byte[] pthrottles)
+ {
+
+ byte[] adjData;
+ int pos = 0;
+
+ if (!BitConverter.IsLittleEndian)
+ {
+ byte[] newData = new byte[7 * 4];
+ Buffer.BlockCopy(pthrottles, 0, newData, 0, 7 * 4);
+
+ for (int i = 0; i < 7; i++)
+ Array.Reverse(newData, i * 4, 4);
+
+ adjData = newData;
+ }
+ else
+ {
+ adjData = pthrottles;
+ }
+
+ // 0.125f converts from bits to bytes
+ //int resend = (int)(BitConverter.ToSingle(adjData, pos) * 0.125f); pos += 4;
+ // int land = (int)(BitConverter.ToSingle(adjData, pos) * 0.125f); pos += 4;
+ // int wind = (int)(BitConverter.ToSingle(adjData, pos) * 0.125f); pos += 4;
+ // int cloud = (int)(BitConverter.ToSingle(adjData, pos) * 0.125f); pos += 4;
+ // int task = (int)(BitConverter.ToSingle(adjData, pos) * 0.125f); pos += 4;
+ pos = pos + 16;
+ int texture = (int)(BitConverter.ToSingle(adjData, pos) * 0.125f); pos += 4;
+ //int asset = (int)(BitConverter.ToSingle(adjData, pos) * 0.125f);
+ return texture;
+ }
+
+ // Now we know when the throttle is changed by the client in the case of a root agent or by a neighbor region in the case of a child agent.
+ public void ThrottleUpdate(ScenePresence p)
+ {
+ byte[] throttles = p.ControllingClient.GetThrottlesPacked(1);
+ UUID user = p.UUID;
+ int imagethrottle = ExtractImageThrottle(throttles);
+ }
public void PostInitialise()
{
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
index ee2891451b..ae9ed7f422 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
@@ -295,6 +295,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
public event MuteListEntryRemove OnRemoveMuteListEntry;
public event GodlikeMessage onGodlikeMessage;
public event GodUpdateRegionInfoUpdate OnGodUpdateRegionInfoUpdate;
+ public event GenericCall2 OnUpdateThrottles;
#endregion Events
@@ -6729,6 +6730,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP
#endregion
m_udpClient.SetThrottles(atpack.Throttle.Throttles);
+ GenericCall2 handler = OnUpdateThrottles;
+ if (handler != null)
+ {
+ handler();
+ }
return true;
}
@@ -11870,6 +11876,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP
public void SetChildAgentThrottle(byte[] throttles)
{
m_udpClient.SetThrottles(throttles);
+ GenericCall2 handler = OnUpdateThrottles;
+ if (handler != null)
+ {
+ handler();
+ }
}
///
diff --git a/OpenSim/Region/Framework/Scenes/EventManager.cs b/OpenSim/Region/Framework/Scenes/EventManager.cs
index 7916c42174..4a19c3bfdf 100644
--- a/OpenSim/Region/Framework/Scenes/EventManager.cs
+++ b/OpenSim/Region/Framework/Scenes/EventManager.cs
@@ -376,6 +376,10 @@ namespace OpenSim.Region.Framework.Scenes
public event ParcelPrimCountTainted OnParcelPrimCountTainted;
public event GetScriptRunning OnGetScriptRunning;
+ public delegate void ThrottleUpdate(ScenePresence scenePresence);
+
+ public event ThrottleUpdate OnThrottleUpdate;
+
///
/// RegisterCapsEvent is called by Scene after the Caps object
/// has been instantiated and before it is return to the
@@ -2641,5 +2645,14 @@ namespace OpenSim.Region.Framework.Scenes
}
}
}
+
+ public void TriggerThrottleUpdate(ScenePresence scenePresence)
+ {
+ ThrottleUpdate handler = OnThrottleUpdate;
+ if (handler != null)
+ {
+ handler(scenePresence);
+ }
+ }
}
}
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index a8aa551012..2b9665cc38 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -793,6 +793,7 @@ namespace OpenSim.Region.Framework.Scenes
ControllingClient.OnChangeAnim += avnHandleChangeAnim;
ControllingClient.OnForceReleaseControls += HandleForceReleaseControls;
ControllingClient.OnAutoPilotGo += MoveToTarget;
+ ControllingClient.OnUpdateThrottles += RaiseUpdateThrottles;
// ControllingClient.OnChildAgentStatus += new StatusChange(this.ChildStatusChange);
// ControllingClient.OnStopMovement += new GenericCall2(this.StopMovement);
@@ -3166,6 +3167,10 @@ namespace OpenSim.Region.Framework.Scenes
}
private static Vector3 marker = new Vector3(-1f, -1f, -1f);
+ private void RaiseUpdateThrottles()
+ {
+ m_scene.EventManager.TriggerThrottleUpdate(this);
+ }
///
/// This updates important decision making data about a child agent
/// The main purpose is to figure out what objects to send to a child agent that's in a neighboring region
diff --git a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs
index a484300fd2..28b8293ece 100644
--- a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs
+++ b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs
@@ -873,6 +873,7 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server
public event MuteListEntryRemove OnRemoveMuteListEntry;
public event GodlikeMessage onGodlikeMessage;
public event GodUpdateRegionInfoUpdate OnGodUpdateRegionInfoUpdate;
+ public event GenericCall2 OnUpdateThrottles;
#pragma warning restore 67
diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs
index 7c693b6fc8..6c8e2fc9dc 100644
--- a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs
+++ b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs
@@ -473,7 +473,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC
public event MuteListEntryRemove OnRemoveMuteListEntry;
public event GodlikeMessage onGodlikeMessage;
public event GodUpdateRegionInfoUpdate OnGodUpdateRegionInfoUpdate;
-
+ public event GenericCall2 OnUpdateThrottles;
#pragma warning restore 67
#endregion
diff --git a/OpenSim/Tests/Common/Mock/TestClient.cs b/OpenSim/Tests/Common/Mock/TestClient.cs
index 49a8d26f01..78bb18e365 100644
--- a/OpenSim/Tests/Common/Mock/TestClient.cs
+++ b/OpenSim/Tests/Common/Mock/TestClient.cs
@@ -320,7 +320,7 @@ namespace OpenSim.Tests.Common.Mock
public event MuteListEntryRemove OnRemoveMuteListEntry;
public event GodlikeMessage onGodlikeMessage;
public event GodUpdateRegionInfoUpdate OnGodUpdateRegionInfoUpdate;
-
+ public event GenericCall2 OnUpdateThrottles;
#pragma warning restore 67
///