diff --git a/libsecondlife/EstateTools.cs b/libsecondlife/EstateTools.cs index f0d3207f..a563fb1d 100644 --- a/libsecondlife/EstateTools.cs +++ b/libsecondlife/EstateTools.cs @@ -44,9 +44,25 @@ namespace libsecondlife /// /// public delegate void LandStatReply(uint reportType, uint requestFlags, uint objectCount, List Tasks); + /// + /// Triggered on incoming LandStatReply when the report type is for "top colliders" + /// + /// + /// + public delegate void GetTopCollidersReply(uint objectCount, List Tasks); + /// + /// Triggered on incoming LandStatReply when the report type is for "top scripts" + /// + /// + /// + public delegate void GetTopScriptsReply(uint objectCount, List Tasks); /// Callback for incoming LandStatReply packets public event LandStatReply OnLandStatReply; + /// Triggered upon a successful .GetTopColliders() + public event GetTopCollidersReply OnGetTopColliders; + /// Triggered upon a successful .GetTopScripts() + public event GetTopScriptsReply OnGetTopScripts; /// /// Constructor for EstateTools class @@ -69,6 +85,13 @@ namespace libsecondlife public string OwnerName; } + /// Used in the ReportType field of a LandStatRequest + public enum LandStatReportType + { + TopScripts = 0, + TopColliders = 1 + } + /// /// Requests estate information such as top scripts and colliders /// @@ -76,42 +99,72 @@ namespace libsecondlife /// /// /// - public void LandStatRequest(int parcelLocalID, uint ReportType, uint RequestFlags, string Filter) + public void LandStatRequest(int parcelLocalID, LandStatReportType reportType, uint requestFlags, string filter) { LandStatRequestPacket p = new LandStatRequestPacket(); p.AgentData.AgentID = Client.Network.AgentID; p.AgentData.SessionID = Client.Network.SessionID; - p.RequestData.Filter = Helpers.StringToField(Filter); + p.RequestData.Filter = Helpers.StringToField(filter); p.RequestData.ParcelLocalID = parcelLocalID; - p.RequestData.ReportType = ReportType; - p.RequestData.RequestFlags = RequestFlags; + p.RequestData.ReportType = (uint)reportType; + p.RequestData.RequestFlags = requestFlags; Client.Network.SendPacket(p); } - /// + /// Requests the "Top Scripts" list for the current region + public void GetTopScripts() + { + LandStatRequest(0, LandStatReportType.TopScripts, 0, ""); + } + + /// Requests the "Top Colliders" list for the current region + public void GetTopColliders() + { + LandStatRequest(0, LandStatReportType.TopColliders, 0, ""); + } + + /// + /// + /// + /// private void LandStatReplyHandler(Packet packet, Simulator simulator) { - LandStatReplyPacket p = (LandStatReplyPacket)packet; - List Tasks = new List(); - - foreach (LandStatReplyPacket.ReportDataBlock rep in p.ReportData) + if (OnLandStatReply != null) { - EstateTask task = new EstateTask(); - task.Position = new LLVector3(rep.LocationX, rep.LocationY, rep.LocationZ); - task.Score = rep.Score; - task.TaskID = rep.TaskID; - task.TaskLocalID = rep.TaskLocalID; - task.TaskName = Helpers.FieldToUTF8String(rep.TaskName); - task.OwnerName = Helpers.FieldToUTF8String(rep.OwnerName); - Tasks.Add(task); - } - OnLandStatReply( - p.RequestData.ReportType, - p.RequestData.RequestFlags, - p.RequestData.TotalObjectCount, - Tasks - ); + LandStatReplyPacket p = (LandStatReplyPacket)packet; + List Tasks = new List(); + + foreach (LandStatReplyPacket.ReportDataBlock rep in p.ReportData) + { + EstateTask task = new EstateTask(); + task.Position = new LLVector3(rep.LocationX, rep.LocationY, rep.LocationZ); + task.Score = rep.Score; + task.TaskID = rep.TaskID; + task.TaskLocalID = rep.TaskLocalID; + task.TaskName = Helpers.FieldToUTF8String(rep.TaskName); + task.OwnerName = Helpers.FieldToUTF8String(rep.OwnerName); + Tasks.Add(task); + } + + OnLandStatReply( + p.RequestData.ReportType, + p.RequestData.RequestFlags, + p.RequestData.TotalObjectCount, + Tasks + ); + + switch ((LandStatReportType)p.RequestData.ReportType) + { + case LandStatReportType.TopColliders: + OnGetTopColliders(p.RequestData.TotalObjectCount, Tasks); + break; + case LandStatReportType.TopScripts: + OnGetTopScripts(p.RequestData.TotalObjectCount, Tasks); + break; + } + + } }