private Hashtable DispatchWindLightSettings(Hashtable m_dhttpMethod, UUID agentID) { Hashtable responsedata = new Hashtable(); responsedata["int_response_code"] = 200; //501; //410; //404; responsedata["content_type"] = "text/plain"; responsedata["keepalive"] = false; responsedata["str_response_string"] = ""; IScenePresence SP = m_scene.GetScenePresence(agentID); if(SP == null) return responsedata; //They don't exist m_log.Info("[WindLightSettings]: Got a request to update WindLight from " + SP.Name); OSDMap rm = (OSDMap)OSDParser.DeserializeLLSDXml((string)m_dhttpMethod["requestbody"]); RegionLightShareData lsd = new RegionLightShareData(); lsd.FromOSD(rm); lsd.regionID = SP.Scene.RegionInfo.RegionID; bool remove = false; if (rm.ContainsKey("remove")) remove = rm["remove"].AsBoolean(); if (remove) { if (lsd.type == 0) //Region { if (!SP.Scene.Permissions.CanIssueEstateCommand(SP.UUID, false)) return responsedata; // No permissions bool found = false; foreach (RegionLightShareData regionLSD in m_WindlightSettings.Values) { if (lsd.minEffectiveAltitude == regionLSD.minEffectiveAltitude && lsd.maxEffectiveAltitude == regionLSD.maxEffectiveAltitude) { //it exists found = true; break; } } //Set to default if(found) SaveWindLightSettings(lsd.minEffectiveAltitude, new RegionLightShareData()); } else if (lsd.type == 1) //Parcel { IParcelManagementModule parcelManagement = SP.Scene.RequestModuleInterface<IParcelManagementModule>(); if (parcelManagement != null) { ILandObject land = parcelManagement.GetLandObject((int)SP.AbsolutePosition.X, (int)SP.AbsolutePosition.Y); if (!SP.Scene.Permissions.GenericParcelPermission(SP.UUID, land, (ulong)GroupPowers.LandOptions)) return responsedata; // No permissions IOpenRegionSettingsModule ORSM = SP.Scene.RequestModuleInterface<IOpenRegionSettingsModule>(); if (ORSM == null || !ORSM.AllowParcelWindLight) { SP.ControllingClient.SendAlertMessage("Parcel WindLight is disabled in this region."); return responsedata; } OSDMap map = land.LandData.GenericDataMap; OSDMap innerMap = new OSDMap(); if (land.LandData.GenericDataMap.ContainsKey("WindLight")) innerMap = (OSDMap)map["WindLight"]; if (innerMap.ContainsKey(lsd.minEffectiveAltitude.ToString())) { innerMap.Remove(lsd.minEffectiveAltitude.ToString()); } land.LandData.AddGenericData("WindLight", innerMap); //Update the client SendProfileToClient(SP, false); } } } else { if (lsd.type == 0) //Region { if (!SP.Scene.Permissions.CanIssueEstateCommand(SP.UUID, false)) return responsedata; // No permissions foreach (RegionLightShareData regionLSD in m_WindlightSettings.Values) { string message = ""; if (checkAltitude(lsd, regionLSD, out message)) { SP.ControllingClient.SendAlertMessage(message); return responsedata; } } SaveWindLightSettings(lsd.minEffectiveAltitude, lsd); } else if (lsd.type == 1) //Parcel { IParcelManagementModule parcelManagement = SP.Scene.RequestModuleInterface<IParcelManagementModule>(); if (parcelManagement != null) { ILandObject land = parcelManagement.GetLandObject((int)SP.AbsolutePosition.X, (int)SP.AbsolutePosition.Y); if (!SP.Scene.Permissions.GenericParcelPermission(SP.UUID, land, (ulong)GroupPowers.LandOptions)) return responsedata; // No permissions IOpenRegionSettingsModule ORSM = SP.Scene.RequestModuleInterface<IOpenRegionSettingsModule>(); if (ORSM == null || !ORSM.AllowParcelWindLight) { SP.ControllingClient.SendAlertMessage("Parcel WindLight is disabled in this region."); return responsedata; } OSDMap map = land.LandData.GenericDataMap; OSDMap innerMap = new OSDMap(); if (land.LandData.GenericDataMap.ContainsKey("WindLight")) innerMap = (OSDMap)map["WindLight"]; string removeThisMap = ""; foreach (KeyValuePair<string, OSD> kvp in innerMap) { OSDMap lsdMap = (OSDMap)kvp.Value; RegionLightShareData parcelLSD = new RegionLightShareData(); parcelLSD.FromOSD(lsdMap); string message = ""; if (checkAltitude(lsd, parcelLSD, out message)) { SP.ControllingClient.SendAlertMessage(message); return responsedata; } } if (removeThisMap != "") innerMap.Remove(removeThisMap); innerMap[lsd.minEffectiveAltitude.ToString()] = lsd.ToOSD(); land.LandData.AddGenericData("WindLight", innerMap); //Update the client SendProfileToClient(SP, lsd); } } } SP.ControllingClient.SendAlertMessage("WindLight Settings updated."); return responsedata; }