diff --git a/OpenMetaverse/EstateTools.cs b/OpenMetaverse/EstateTools.cs index 9ee2faac..ff23c7ea 100644 --- a/OpenMetaverse/EstateTools.cs +++ b/OpenMetaverse/EstateTools.cs @@ -53,6 +53,8 @@ namespace OpenMetaverse /// Upper/lower texture boundaries for each corner of the sim public GroundTextureHeightSettings GroundTextureLimits; + #region Delegates + /// /// Triggered on LandStatReply when the report type is for "top colliders" /// @@ -93,8 +95,9 @@ namespace OpenMetaverse public delegate void EstateGroupsReply(uint estateID, int count, List allowedGroups); public delegate void EstateCovenantReply(UUID covenantID, long timestamp, string estateName, UUID estateOwnerID); +#endregion - + #region Events // Callback for LandStatReply packets //public event LandStatReply OnLandStatReply; /// Triggered upon a successful .GetTopColliders() @@ -113,6 +116,7 @@ namespace OpenMetaverse public event EstateUsersReply OnGetAllowedUsers; /// Triggered upon a successful .RequestCovenant() public event EstateCovenantReply OnGetCovenant; + #endregion /// /// Constructor for EstateTools class @@ -127,8 +131,9 @@ namespace OpenMetaverse Client.Network.RegisterCallback(PacketType.LandStatReply, new NetworkManager.PacketCallback(LandStatReplyHandler)); Client.Network.RegisterCallback(PacketType.EstateOwnerMessage, new NetworkManager.PacketCallback(EstateOwnerMessageHandler)); Client.Network.RegisterCallback(PacketType.EstateCovenantReply, new NetworkManager.PacketCallback(EstateCovenantReplyHandler)); - } + } + #region Enums /// Used in the ReportType field of a LandStatRequest public enum LandStatReportType { @@ -154,6 +159,23 @@ namespace OpenMetaverse EstateManagers = 24 } + /// + /// + /// + [Flags] + public enum EstateReturnFlags : uint + { + /// No flags set + None = 2, + /// Only return targets scripted objects + ReturnScripted = 6, + /// Only return targets objects if on others land + ReturnOnOthersLand = 3, + /// Returns target's scripted objects and objects on other parcels + ReturnScriptedAndOnOthers = 7 + } +#endregion + #region Structs /// Ground texture settings for each corner of the region // TODO: maybe move this class to the Simulator object and implement it there too public struct GroundTextureSettings @@ -179,7 +201,8 @@ namespace OpenMetaverse public GroundTextureHeight SE; public GroundTextureHeight NE; } - +#endregion + #region Public Methods /// /// Requests estate information such as top scripts and colliders /// @@ -219,225 +242,55 @@ namespace OpenMetaverse LandStatRequest(0, LandStatReportType.TopColliders, 0, ""); } - /// - /// - /// - private void EstateCovenantReplyHandler(Packet packet, Simulator simulator) + /// + /// Set several estate specific configuration variables + /// + /// The Height of the waterlevel over the entire estate. Defaults to 20 + /// The maximum height change allowed above the baked terrain. Defaults to 4 + /// The minimum height change allowed below the baked terrain. Defaults to -4 + /// true to use + /// if True forces the sun position to the position in SunPosition + /// The current position of the sun on the estate, or when FixedSun is true the static position + /// the sun will remain. 6.0 = Sunrise, 30.0 = Sunset + public void SetTerrainVariables(float WaterHeight, float TerrainRaiseLimit, + float TerrainLowerLimit, bool UseEstateSun, bool FixedSun, float SunPosition) { - EstateCovenantReplyPacket reply = (EstateCovenantReplyPacket)packet; - if (OnGetCovenant != null) - { - try - { - OnGetCovenant( - reply.Data.CovenantID, - reply.Data.CovenantTimestamp, - Utils.BytesToString(reply.Data.EstateName), - reply.Data.EstateOwnerID); - } - catch (Exception e) { Logger.Log(e.Message, Helpers.LogLevel.Error, Client, e); } - } + List simVariables = new List(); + simVariables.Add(WaterHeight.ToString(Utils.EnUsCulture)); + simVariables.Add(TerrainRaiseLimit.ToString(Utils.EnUsCulture)); + simVariables.Add(TerrainLowerLimit.ToString(Utils.EnUsCulture)); + simVariables.Add(UseEstateSun ? "Y" : "N"); + simVariables.Add(FixedSun ? "Y" : "N"); + simVariables.Add(SunPosition.ToString(Utils.EnUsCulture)); + simVariables.Add("Y"); //Not used? + simVariables.Add("N"); //Not used? + simVariables.Add("0.00"); //Also not used? + EstateOwnerMessage("setregionterrain", simVariables); } - /// - /// - /// - private void EstateOwnerMessageHandler(Packet packet, Simulator simulator) + /// + /// Request return of objects owned by specified avatar + /// + /// The Agents owning the primitives to return + /// specify the coverage and type of objects to be included in the return + /// true to perform return on entire estate + public void SimWideReturn(UUID Target, EstateReturnFlags flag, bool EstateWide) { - EstateOwnerMessagePacket message = (EstateOwnerMessagePacket)packet; - uint estateID; - string method = Utils.BytesToString(message.MethodData.Method); - //List parameters = new List(); - - if (method == "estateupdateinfo") + if (EstateWide) { - string estateName = Utils.BytesToString(message.ParamList[0].Parameter); - UUID estateOwner = new UUID(Utils.BytesToString(message.ParamList[1].Parameter)); - estateID = Utils.BytesToUInt(message.ParamList[2].Parameter); - /* - foreach (EstateOwnerMessagePacket.ParamListBlock param in message.ParamList) - { - parameters.Add(Utils.BytesToString(param.Parameter)); - } - */ - bool denyNoPaymentInfo; - if (Utils.BytesToUInt(message.ParamList[8].Parameter) == 0) denyNoPaymentInfo = true; - else denyNoPaymentInfo = false; - - if (OnGetEstateUpdateInfo != null) - { - try - { - OnGetEstateUpdateInfo(estateName, estateOwner, estateID, denyNoPaymentInfo); - } - catch (Exception e) { Logger.Log(e.Message, Helpers.LogLevel.Error, Client, e); } - } + List param = new List(); + param.Add(flag.ToString()); + param.Add(Target.ToString()); + EstateOwnerMessage("estateobjectreturn", param); } - - else if (method == "setaccess") + else { - int count; - estateID = Utils.BytesToUInt(message.ParamList[0].Parameter); - if (message.ParamList.Length > 1) - { - //param comes in as a string for some reason - uint param; - if (!uint.TryParse(Utils.BytesToString(message.ParamList[1].Parameter), out param)) return; - - EstateAccessReplyDelta accessType = (EstateAccessReplyDelta)param; - - switch (accessType) - { - case EstateAccessReplyDelta.EstateManagers: - if (OnGetEstateManagers != null) - { - if (message.ParamList.Length > 5) - { - if (!int.TryParse(Utils.BytesToString(message.ParamList[5].Parameter), out count)) return; - List managers = new List(); - for (int i = 6; i < message.ParamList.Length; i++) - { - try - { - UUID managerID = new UUID(message.ParamList[i].Parameter, 0); - managers.Add(managerID); - } - catch (Exception e) { Logger.Log(e.Message, Helpers.LogLevel.Error, Client, e); } - } - try { OnGetEstateManagers(estateID, count, managers); } - catch (Exception e) { Logger.Log(e.Message, Helpers.LogLevel.Error, Client, e); } - } - } - break; - - case EstateAccessReplyDelta.EstateBans: - if (OnGetEstateBans != null) - { - if (message.ParamList.Length > 6) - { - if (!int.TryParse(Utils.BytesToString(message.ParamList[4].Parameter), out count)) return; - List bannedUsers = new List(); - for (int i = 7; i < message.ParamList.Length; i++) - { - try - { - UUID bannedID = new UUID(message.ParamList[i].Parameter, 0); - bannedUsers.Add(bannedID); - } - catch (Exception e) { Logger.Log(e.Message, Helpers.LogLevel.Error, Client, e); } - } - try { OnGetEstateBans(estateID, count, bannedUsers); } - catch (Exception e) { Logger.Log(e.Message, Helpers.LogLevel.Error, Client, e); } - } - } - break; - - case EstateAccessReplyDelta.AllowedUsers: - if (OnGetAllowedUsers != null) - { - if (message.ParamList.Length > 5) - { - if (!int.TryParse(Utils.BytesToString(message.ParamList[2].Parameter), out count)) return; - List allowedUsers = new List(); - for (int i = 6; i < message.ParamList.Length; i++) - { - try - { - UUID allowedID = new UUID(message.ParamList[i].Parameter, 0); - allowedUsers.Add(allowedID); - } - catch (Exception e) { Logger.Log(e.Message, Helpers.LogLevel.Error, Client, e); } - } - try { OnGetAllowedUsers(estateID, count, allowedUsers); } - catch (Exception e) { Logger.Log(e.Message, Helpers.LogLevel.Error, Client, e); } - } - } - break; - - case EstateAccessReplyDelta.AllowedGroups: - if (OnGetAllowedGroups != null) - { - if (message.ParamList.Length > 5) - { - if (!int.TryParse(Utils.BytesToString(message.ParamList[3].Parameter), out count)) return; - List allowedGroups = new List(); - for (int i = 5; i < message.ParamList.Length; i++) - { - try - { - UUID groupID = new UUID(message.ParamList[i].Parameter, 0); - allowedGroups.Add(groupID); - } - catch (Exception e) { Logger.Log(e.Message, Helpers.LogLevel.Error, Client, e); } - } - try { OnGetAllowedGroups(estateID, count, allowedGroups); } - catch (Exception e) { Logger.Log(e.Message, Helpers.LogLevel.Error, Client, e); } - } - } - break; - } - } - } - - /* - Console.WriteLine("--- " + method + " ---"); - foreach (EstateOwnerMessagePacket.ParamListBlock block in message.ParamList) - { - Console.WriteLine(Utils.BytesToString(block.Parameter)); - } - Console.WriteLine("------"); - */ - } - - /// - /// - /// - private void LandStatReplyHandler(Packet packet, Simulator simulator) - { - //if (OnLandStatReply != null || OnGetTopScripts != null || OnGetTopColliders != null) - if (OnGetTopScripts != null || OnGetTopColliders != null) - { - LandStatReplyPacket p = (LandStatReplyPacket)packet; - Dictionary Tasks = new Dictionary(); - - foreach (LandStatReplyPacket.ReportDataBlock rep in p.ReportData) - { - EstateTask task = new EstateTask(); - task.Position = new Vector3(rep.LocationX, rep.LocationY, rep.LocationZ); - task.Score = rep.Score; - task.TaskID = rep.TaskID; - task.TaskLocalID = rep.TaskLocalID; - task.TaskName = Utils.BytesToString(rep.TaskName); - task.OwnerName = Utils.BytesToString(rep.OwnerName); - Tasks.Add(task.TaskID, task); - } - - LandStatReportType type = (LandStatReportType)p.RequestData.ReportType; - - if (OnGetTopScripts != null && type == LandStatReportType.TopScripts) - { - try { OnGetTopScripts((int)p.RequestData.TotalObjectCount, Tasks); } - catch (Exception e) { Logger.Log(e.Message, Helpers.LogLevel.Error, Client, e); } - } - else if (OnGetTopColliders != null && type == LandStatReportType.TopColliders) - { - try { OnGetTopColliders((int)p.RequestData.TotalObjectCount, Tasks); } - catch (Exception e) { Logger.Log(e.Message, Helpers.LogLevel.Error, Client, e); } - } - - /* - if (OnGetTopColliders != null) - { - //FIXME - System.UnhandledExceptionEventArgs - OnLandStatReply( - type, - p.RequestData.RequestFlags, - (int)p.RequestData.TotalObjectCount, - Tasks - ); - } - */ - + SimWideDeletesPacket simDelete = new SimWideDeletesPacket(); + simDelete.AgentData.AgentID = Client.Self.AgentID; + simDelete.AgentData.SessionID = Client.Self.SessionID; + simDelete.DataBlock.TargetID = Target; + simDelete.DataBlock.Flags = (uint)flag; + Client.Network.SendPacket(simDelete); } } @@ -654,6 +507,224 @@ namespace OpenMetaverse return upload.ID; } + +#endregion +#region Packet Handlers + + /// + /// + /// + private void EstateCovenantReplyHandler(Packet packet, Simulator simulator) + { + EstateCovenantReplyPacket reply = (EstateCovenantReplyPacket)packet; + if (OnGetCovenant != null) + { + try + { + OnGetCovenant( + reply.Data.CovenantID, + reply.Data.CovenantTimestamp, + Utils.BytesToString(reply.Data.EstateName), + reply.Data.EstateOwnerID); + } + catch (Exception e) { Logger.Log(e.Message, Helpers.LogLevel.Error, Client, e); } + } + } + + /// + /// + /// + private void EstateOwnerMessageHandler(Packet packet, Simulator simulator) + { + EstateOwnerMessagePacket message = (EstateOwnerMessagePacket)packet; + uint estateID; + string method = Utils.BytesToString(message.MethodData.Method); + //List parameters = new List(); + + if (method == "estateupdateinfo") + { + string estateName = Utils.BytesToString(message.ParamList[0].Parameter); + UUID estateOwner = new UUID(Utils.BytesToString(message.ParamList[1].Parameter)); + estateID = Utils.BytesToUInt(message.ParamList[2].Parameter); + /* + foreach (EstateOwnerMessagePacket.ParamListBlock param in message.ParamList) + { + parameters.Add(Utils.BytesToString(param.Parameter)); + } + */ + bool denyNoPaymentInfo; + if (Utils.BytesToUInt(message.ParamList[8].Parameter) == 0) denyNoPaymentInfo = true; + else denyNoPaymentInfo = false; + + if (OnGetEstateUpdateInfo != null) + { + try + { + OnGetEstateUpdateInfo(estateName, estateOwner, estateID, denyNoPaymentInfo); + } + catch (Exception e) { Logger.Log(e.Message, Helpers.LogLevel.Error, Client, e); } + } + } + + else if (method == "setaccess") + { + int count; + estateID = Utils.BytesToUInt(message.ParamList[0].Parameter); + if (message.ParamList.Length > 1) + { + //param comes in as a string for some reason + uint param; + if (!uint.TryParse(Utils.BytesToString(message.ParamList[1].Parameter), out param)) return; + + EstateAccessReplyDelta accessType = (EstateAccessReplyDelta)param; + + switch (accessType) + { + case EstateAccessReplyDelta.EstateManagers: + if (OnGetEstateManagers != null) + { + if (message.ParamList.Length > 5) + { + if (!int.TryParse(Utils.BytesToString(message.ParamList[5].Parameter), out count)) return; + List managers = new List(); + for (int i = 6; i < message.ParamList.Length; i++) + { + try + { + UUID managerID = new UUID(message.ParamList[i].Parameter, 0); + managers.Add(managerID); + } + catch (Exception e) { Logger.Log(e.Message, Helpers.LogLevel.Error, Client, e); } + } + try { OnGetEstateManagers(estateID, count, managers); } + catch (Exception e) { Logger.Log(e.Message, Helpers.LogLevel.Error, Client, e); } + } + } + break; + + case EstateAccessReplyDelta.EstateBans: + if (OnGetEstateBans != null) + { + if (message.ParamList.Length > 6) + { + if (!int.TryParse(Utils.BytesToString(message.ParamList[4].Parameter), out count)) return; + List bannedUsers = new List(); + for (int i = 7; i < message.ParamList.Length; i++) + { + try + { + UUID bannedID = new UUID(message.ParamList[i].Parameter, 0); + bannedUsers.Add(bannedID); + } + catch (Exception e) { Logger.Log(e.Message, Helpers.LogLevel.Error, Client, e); } + } + try { OnGetEstateBans(estateID, count, bannedUsers); } + catch (Exception e) { Logger.Log(e.Message, Helpers.LogLevel.Error, Client, e); } + } + } + break; + + case EstateAccessReplyDelta.AllowedUsers: + if (OnGetAllowedUsers != null) + { + if (message.ParamList.Length > 5) + { + if (!int.TryParse(Utils.BytesToString(message.ParamList[2].Parameter), out count)) return; + List allowedUsers = new List(); + for (int i = 6; i < message.ParamList.Length; i++) + { + try + { + UUID allowedID = new UUID(message.ParamList[i].Parameter, 0); + allowedUsers.Add(allowedID); + } + catch (Exception e) { Logger.Log(e.Message, Helpers.LogLevel.Error, Client, e); } + } + try { OnGetAllowedUsers(estateID, count, allowedUsers); } + catch (Exception e) { Logger.Log(e.Message, Helpers.LogLevel.Error, Client, e); } + } + } + break; + + case EstateAccessReplyDelta.AllowedGroups: + if (OnGetAllowedGroups != null) + { + if (message.ParamList.Length > 5) + { + if (!int.TryParse(Utils.BytesToString(message.ParamList[3].Parameter), out count)) return; + List allowedGroups = new List(); + for (int i = 5; i < message.ParamList.Length; i++) + { + try + { + UUID groupID = new UUID(message.ParamList[i].Parameter, 0); + allowedGroups.Add(groupID); + } + catch (Exception e) { Logger.Log(e.Message, Helpers.LogLevel.Error, Client, e); } + } + try { OnGetAllowedGroups(estateID, count, allowedGroups); } + catch (Exception e) { Logger.Log(e.Message, Helpers.LogLevel.Error, Client, e); } + } + } + break; + } + } + } + } + + /// + /// + /// + private void LandStatReplyHandler(Packet packet, Simulator simulator) + { + //if (OnLandStatReply != null || OnGetTopScripts != null || OnGetTopColliders != null) + if (OnGetTopScripts != null || OnGetTopColliders != null) + { + LandStatReplyPacket p = (LandStatReplyPacket)packet; + Dictionary Tasks = new Dictionary(); + + foreach (LandStatReplyPacket.ReportDataBlock rep in p.ReportData) + { + EstateTask task = new EstateTask(); + task.Position = new Vector3(rep.LocationX, rep.LocationY, rep.LocationZ); + task.Score = rep.Score; + task.TaskID = rep.TaskID; + task.TaskLocalID = rep.TaskLocalID; + task.TaskName = Utils.BytesToString(rep.TaskName); + task.OwnerName = Utils.BytesToString(rep.OwnerName); + Tasks.Add(task.TaskID, task); + } + + LandStatReportType type = (LandStatReportType)p.RequestData.ReportType; + + if (OnGetTopScripts != null && type == LandStatReportType.TopScripts) + { + try { OnGetTopScripts((int)p.RequestData.TotalObjectCount, Tasks); } + catch (Exception e) { Logger.Log(e.Message, Helpers.LogLevel.Error, Client, e); } + } + else if (OnGetTopColliders != null && type == LandStatReportType.TopColliders) + { + try { OnGetTopColliders((int)p.RequestData.TotalObjectCount, Tasks); } + catch (Exception e) { Logger.Log(e.Message, Helpers.LogLevel.Error, Client, e); } + } + + /* + if (OnGetTopColliders != null) + { + //FIXME - System.UnhandledExceptionEventArgs + OnLandStatReply( + type, + p.RequestData.RequestFlags, + (int)p.RequestData.TotalObjectCount, + Tasks + ); + } + */ + + } + } +#endregion + } }