From e538628decc3488b51ca5f49f66c9d58e58da175 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Wed, 17 Jun 2020 15:49:13 +0100 Subject: [PATCH] 2first dirty version and non persistent parcel uglysky --- OpenSim/Framework/ILandObject.cs | 2 + OpenSim/Framework/LandData.cs | 18 + .../ClientStack/Linden/UDP/LLClientView.cs | 2 +- .../World/Estate/EstateManagementModule.cs | 115 +++--- .../CoreModules/World/Land/LandObject.cs | 14 + .../World/LightShare/EnvironmentModule.cs | 334 +++++++++++------- .../World/Region/RegionCommandsModule.cs | 1 - 7 files changed, 291 insertions(+), 195 deletions(-) diff --git a/OpenSim/Framework/ILandObject.cs b/OpenSim/Framework/ILandObject.cs index 7365147e4a..34320193c9 100644 --- a/OpenSim/Framework/ILandObject.cs +++ b/OpenSim/Framework/ILandObject.cs @@ -172,6 +172,8 @@ namespace OpenSim.Framework void SetParcelObjectMaxOverride(overrideParcelMaxPrimCountDelegate overrideDel); void SetSimulatorObjectMaxOverride(overrideSimulatorMaxPrimCountDelegate overrideDel); + + void StoreEnviroment(ViewerEnviroment VEnv); /// /// Set the media url for this land parcel diff --git a/OpenSim/Framework/LandData.cs b/OpenSim/Framework/LandData.cs index 13b58be3dd..925e20a789 100644 --- a/OpenSim/Framework/LandData.cs +++ b/OpenSim/Framework/LandData.cs @@ -732,6 +732,11 @@ namespace OpenSim.Framework } } + public int EnviromentVersion = -1; + + [XmlIgnore] //this needs to be added by hand + public ViewerEnviroment Enviroment { get; set;} + public LandData() { _globalID = UUID.Random(); @@ -739,6 +744,8 @@ namespace OpenSim.Framework AnyAVSounds = true; GroupAVSounds = true; LastDwellTimeMS = Util.GetTimeStampMS(); + EnviromentVersion = -1; + Enviroment = null; } /// @@ -804,6 +811,17 @@ namespace OpenSim.Framework landData._parcelAccessList.Add(newEntry); } + if (Enviroment == null) + { + landData.Enviroment = null; + landData.EnviromentVersion = -1; + } + else + { + landData.Enviroment = Enviroment.Clone(); + landData.EnviromentVersion = EnviromentVersion; + } + return landData; } diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs index ac6387c500..00f8b05440 100755 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs @@ -6566,7 +6566,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP bool allowenvovr = (regionFlags & (uint)RegionFlags.AllowEnviromentOverride) != 0; LLSDxmlEncode.AddArrayAndMap("ParcelEnvironmentBlock", sb); - LLSDxmlEncode.AddElem("ParcelEnvironmentVersion", allowenvovr ? -1: -1, sb); + LLSDxmlEncode.AddElem("ParcelEnvironmentVersion", allowenvovr ? -1: landData.EnviromentVersion, sb); LLSDxmlEncode.AddElem("RegionAllowEnvironmentOverride", allowenvovr, sb); LLSDxmlEncode.AddEndMapAndArray(sb); diff --git a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs index 9f9bce0835..002f18ceb7 100644 --- a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs +++ b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs @@ -168,8 +168,9 @@ namespace OpenSim.Region.CoreModules.World.Estate if (Scene.RegionInfo.RegionSettings.Casino) flags |= (RegionFlags)(1 << 10); - if (Scene.RegionInfo.RegionSettings.FixedSun) - flags |= RegionFlags.SunFixed; +// if (Scene.RegionInfo.RegionSettings.FixedSun) +// flags |= RegionFlags.SunFixed; + if (Scene.RegionInfo.RegionSettings.Sandbox) flags |= RegionFlags.Sandbox; if (Scene.RegionInfo.EstateSettings.AllowVoice) @@ -190,7 +191,6 @@ namespace OpenSim.Region.CoreModules.World.Estate // Omitted // - // Omitted: NullLayer (what is that?) // Omitted: SkipAgentAction (what does it do?) return (uint)flags; @@ -428,10 +428,10 @@ namespace OpenSim.Region.CoreModules.World.Estate private void sendDetailedEstateData(IClientAPI remote_client, UUID invoice) { - uint sun = 0; + //uint sun = 0; - if (Scene.RegionInfo.EstateSettings.FixedSun) - sun = (uint)(Scene.RegionInfo.EstateSettings.SunPosition * 1024.0) + 0x1800; + //if (Scene.RegionInfo.EstateSettings.FixedSun) + // sun = (uint)(Scene.RegionInfo.EstateSettings.SunPosition * 1024.0) + 0x1800; UUID estateOwner; estateOwner = Scene.RegionInfo.EstateSettings.EstateOwner; @@ -443,7 +443,7 @@ namespace OpenSim.Region.CoreModules.World.Estate Scene.RegionInfo.EstateSettings.EstateID, Scene.RegionInfo.EstateSettings.ParentEstateID, GetEstateFlags(), - sun, + 0, Scene.RegionInfo.RegionSettings.Covenant, (uint) Scene.RegionInfo.RegionSettings.CovenantChangedDateTime, Scene.RegionInfo.EstateSettings.AbuseEmail, @@ -598,11 +598,11 @@ namespace OpenSim.Region.CoreModules.World.Estate Scene.RegionInfo.RegionSettings.TerrainLowerLimit = TerrainLowerLimit; // Time of day / fixed sun - Scene.RegionInfo.RegionSettings.UseEstateSun = UseEstateSun; - Scene.RegionInfo.RegionSettings.FixedSun = UseFixedSun; - Scene.RegionInfo.RegionSettings.SunPosition = SunHour; + //Scene.RegionInfo.RegionSettings.UseEstateSun = UseEstateSun; + //Scene.RegionInfo.RegionSettings.FixedSun = UseFixedSun; + //Scene.RegionInfo.RegionSettings.SunPosition = SunHour; - if(Scene.PhysicsEnabled && Scene.PhysicsScene != null && lastwaterlevel != WaterHeight) + if (Scene.PhysicsEnabled && Scene.PhysicsScene != null && lastwaterlevel != WaterHeight) Scene.PhysicsScene.SetWaterLevel(WaterHeight); Scene.TriggerEstateSunUpdate(); @@ -1405,28 +1405,28 @@ namespace OpenSim.Region.CoreModules.World.Estate public void HandleRegionInfoRequest(IClientAPI remote_client) { - RegionInfoForEstateMenuArgs args = new RegionInfoForEstateMenuArgs(); - args.billableFactor = Scene.RegionInfo.EstateSettings.BillableFactor; - args.estateID = Scene.RegionInfo.EstateSettings.EstateID; - args.maxAgents = Scene.RegionInfo.RegionSettings.AgentLimit; - args.objectBonusFactor = (float)Scene.RegionInfo.RegionSettings.ObjectBonus; - args.parentEstateID = Scene.RegionInfo.EstateSettings.ParentEstateID; - args.pricePerMeter = Scene.RegionInfo.EstateSettings.PricePerMeter; - args.redirectGridX = Scene.RegionInfo.EstateSettings.RedirectGridX; - args.redirectGridY = Scene.RegionInfo.EstateSettings.RedirectGridY; - args.regionFlags = GetRegionFlags(); - args.simAccess = Scene.RegionInfo.AccessLevel; - args.sunHour = (float)Scene.RegionInfo.RegionSettings.SunPosition; - args.terrainLowerLimit = (float)Scene.RegionInfo.RegionSettings.TerrainLowerLimit; - args.terrainRaiseLimit = (float)Scene.RegionInfo.RegionSettings.TerrainRaiseLimit; - args.useEstateSun = Scene.RegionInfo.RegionSettings.UseEstateSun; - args.waterHeight = (float)Scene.RegionInfo.RegionSettings.WaterHeight; - args.simName = Scene.RegionInfo.RegionName; - args.regionType = Scene.RegionInfo.RegionType; - args.AgentCapacity = Scene.RegionInfo.AgentCapacity; - args.ObjectsCapacity = Scene.RegionInfo.ObjectCapacity; + RegionInfoForEstateMenuArgs args = new RegionInfoForEstateMenuArgs(); + args.billableFactor = Scene.RegionInfo.EstateSettings.BillableFactor; + args.estateID = Scene.RegionInfo.EstateSettings.EstateID; + args.maxAgents = Scene.RegionInfo.RegionSettings.AgentLimit; + args.objectBonusFactor = (float)Scene.RegionInfo.RegionSettings.ObjectBonus; + args.parentEstateID = Scene.RegionInfo.EstateSettings.ParentEstateID; + args.pricePerMeter = Scene.RegionInfo.EstateSettings.PricePerMeter; + args.redirectGridX = Scene.RegionInfo.EstateSettings.RedirectGridX; + args.redirectGridY = Scene.RegionInfo.EstateSettings.RedirectGridY; + args.regionFlags = GetRegionFlags(); + args.simAccess = Scene.RegionInfo.AccessLevel; + args.sunHour = 0; + args.terrainLowerLimit = (float)Scene.RegionInfo.RegionSettings.TerrainLowerLimit; + args.terrainRaiseLimit = (float)Scene.RegionInfo.RegionSettings.TerrainRaiseLimit; + args.useEstateSun = false; + args.waterHeight = (float)Scene.RegionInfo.RegionSettings.WaterHeight; + args.simName = Scene.RegionInfo.RegionName; + args.regionType = Scene.RegionInfo.RegionType; + args.AgentCapacity = Scene.RegionInfo.AgentCapacity; + args.ObjectsCapacity = Scene.RegionInfo.ObjectCapacity; - remote_client.SendRegionInfoToEstateMenu(args); + remote_client.SendRegionInfoToEstateMenu(args); } private void HandleEstateCovenantRequest(IClientAPI remote_client) @@ -1529,28 +1529,11 @@ namespace OpenSim.Region.CoreModules.World.Estate public void handleEstateChangeInfo(IClientAPI remoteClient, UUID invoice, UUID senderID, UInt32 parms1, UInt32 parms2) { - if (parms2 == 0) - { - Scene.RegionInfo.EstateSettings.UseGlobalTime = true; - Scene.RegionInfo.EstateSettings.SunPosition = 0.0; - } - else - { - Scene.RegionInfo.EstateSettings.UseGlobalTime = false; - Scene.RegionInfo.EstateSettings.SunPosition = (parms2 - 0x1800)/1024.0; - // Warning: FixedSun should be set to True, otherwise this sun position won't be used. - } - if ((parms1 & 0x00008000) != 0) Scene.RegionInfo.EstateSettings.PublicAccess = true; else Scene.RegionInfo.EstateSettings.PublicAccess = false; - if ((parms1 & 0x00000010) != 0) - Scene.RegionInfo.EstateSettings.FixedSun = true; - else - Scene.RegionInfo.EstateSettings.FixedSun = false; - // taxfree is now !AllowAccessOverride (note the negate) if ((parms1 & 0x00000020) != 0) Scene.RegionInfo.EstateSettings.TaxFree = false; @@ -1597,33 +1580,18 @@ namespace OpenSim.Region.CoreModules.World.Estate Scene.EstateDataService.StoreEstateSettings(Scene.RegionInfo.EstateSettings); TriggerEstateInfoChange(); - Scene.TriggerEstateSunUpdate(); - sendDetailedEstateData(remoteClient, invoice); } public bool handleEstateChangeInfoCap(string estateName, UUID invoice, - int sunHour, bool sunFixed, bool externallyVisible, bool allowDirectTeleport, bool denyAnonymous, bool denyAgeUnverified, bool alloVoiceChat, bool overridePublicAccess, bool allowEnviromentOverride) { - if (sunHour == 0) - { - Scene.RegionInfo.EstateSettings.UseGlobalTime = true; - Scene.RegionInfo.EstateSettings.SunPosition = 0.0; - } - else - { - Scene.RegionInfo.EstateSettings.UseGlobalTime = false; - Scene.RegionInfo.EstateSettings.SunPosition = (sunHour - 0x1800) / 1024.0; - // Warning: FixedSun should be set to True, otherwise this sun position won't be used. - } Scene.RegionInfo.EstateSettings.PublicAccess = externallyVisible; - Scene.RegionInfo.EstateSettings.FixedSun = sunFixed; Scene.RegionInfo.EstateSettings.AllowDirectTeleport = allowDirectTeleport; Scene.RegionInfo.EstateSettings.DenyAnonymous = denyAnonymous; @@ -1637,8 +1605,6 @@ namespace OpenSim.Region.CoreModules.World.Estate Scene.EstateDataService.StoreEstateSettings(Scene.RegionInfo.EstateSettings); TriggerEstateInfoChange(); - Scene.TriggerEstateSunUpdate(); - return true; } @@ -1654,8 +1620,10 @@ namespace OpenSim.Region.CoreModules.World.Estate Scene.RegionInfo.RegionSettings.UseEstateSun, Scene.RegionInfo.RegionSettings.FixedSun, (float)Scene.RegionInfo.RegionSettings.SunPosition, - Scene.RegionInfo.EstateSettings.UseGlobalTime, - Scene.RegionInfo.EstateSettings.FixedSun, + //Scene.RegionInfo.EstateSettings.UseGlobalTime, + false, + //Scene.RegionInfo.EstateSettings.FixedSun, + false, (float)Scene.RegionInfo.EstateSettings.SunPosition); // sendRegionInfoPacketToAll(); already done by setRegionTerrainSettings @@ -1691,7 +1659,6 @@ namespace OpenSim.Region.CoreModules.World.Estate client.OnLandStatRequest += HandleLandStatRequest; } - public uint GetEstateFlags() { RegionFlags flags = RegionFlags.None; @@ -1702,13 +1669,11 @@ namespace OpenSim.Region.CoreModules.World.Estate flags |= RegionFlags.AllowSetHome; if (Scene.RegionInfo.EstateSettings.ResetHomeOnTeleport) flags |= RegionFlags.ResetHomeOnTeleport; - if (Scene.RegionInfo.EstateSettings.FixedSun) - flags |= RegionFlags.SunFixed; + //if (Scene.RegionInfo.EstateSettings.FixedSun) + // flags |= RegionFlags.SunFixed; if (!Scene.RegionInfo.EstateSettings.TaxFree) // this is now wrong means !ALLOW_ACCESS_OVERRIDE flags |= RegionFlags.AllowParcelAccessOverride; - if(Scene.RegionInfo.EstateSettings.AllowEnviromentOverride) - flags |= RegionFlags.AllowEnviromentOverride; if (Scene.RegionInfo.EstateSettings.PublicAccess) //?? flags |= (RegionFlags.PublicAllowed | RegionFlags.ExternallyVisible); @@ -1732,10 +1697,12 @@ namespace OpenSim.Region.CoreModules.World.Estate if (Scene.RegionInfo.EstateSettings.AllowVoice) flags |= RegionFlags.AllowVoice; - if (Scene.RegionInfo.EstateSettings.DenyMinors) flags |= RegionFlags.DenyAgeUnverified; + if (Scene.RegionInfo.EstateSettings.AllowEnviromentOverride) + flags |= RegionFlags.AllowEnviromentOverride; + return (uint)flags; } diff --git a/OpenSim/Region/CoreModules/World/Land/LandObject.cs b/OpenSim/Region/CoreModules/World/Land/LandObject.cs index fa9c971f38..b0076f6745 100644 --- a/OpenSim/Region/CoreModules/World/Land/LandObject.cs +++ b/OpenSim/Region/CoreModules/World/Land/LandObject.cs @@ -1981,5 +1981,19 @@ namespace OpenSim.Region.CoreModules.World.Land if (delete.Count > 0) m_scene.EventManager.TriggerLandObjectUpdated((uint)LandData.LocalID, this); } + + public void StoreEnviroment(ViewerEnviroment VEnv) + { + LandData.Enviroment = VEnv; + if (VEnv == null) + LandData.EnviromentVersion = -1; + else + { + ++LandData.EnviromentVersion; + VEnv.version = LandData.EnviromentVersion; + } + m_scene.LandChannel.UpdateLandObject(LandData.LocalID, LandData); + SendLandUpdateToAvatarsOverMe(); + } } } diff --git a/OpenSim/Region/CoreModules/World/LightShare/EnvironmentModule.cs b/OpenSim/Region/CoreModules/World/LightShare/EnvironmentModule.cs index 99da3a7606..60262b70ea 100644 --- a/OpenSim/Region/CoreModules/World/LightShare/EnvironmentModule.cs +++ b/OpenSim/Region/CoreModules/World/LightShare/EnvironmentModule.cs @@ -62,6 +62,7 @@ namespace OpenSim.Region.CoreModules.World.LightShare private IEstateModule m_estateModule; private IEventQueue m_eventQueue; private IAssetService m_assetService; + private ILandChannel m_landChannel; private static ViewerEnviroment m_DefaultEnv = null; private static readonly string m_defaultDayAssetID = "5646d39e-d3d7-6aff-ed71-30fc87d64a91"; @@ -140,6 +141,13 @@ namespace OpenSim.Region.CoreModules.World.LightShare return; } + m_landChannel = m_scene.LandChannel; + if (m_landChannel == null) + { + Enabled = false; + return; + } + if (m_DefaultEnv == null) { AssetBase defEnv = m_assetService.Get(m_defaultDayAssetID); @@ -193,6 +201,7 @@ namespace OpenSim.Region.CoreModules.World.LightShare UpdateEnvTime(); scene.EventManager.OnRegisterCaps += OnRegisterCaps; scene.EventManager.OnFrame += UpdateEnvTime; + scene.EventManager.OnAvatarEnteringNewParcel += OnAvatarEnteringNewParcel; } public void RemoveRegion(Scene scene) @@ -243,7 +252,7 @@ namespace OpenSim.Region.CoreModules.World.LightShare WindlightRefresh(0); } - public void WindlightRefresh(int interpolate) + public void WindlightRefresh(int interpolate, bool notforparcel = true) { List ls = null; m_scene.ForEachClient(delegate (IClientAPI client) @@ -253,7 +262,7 @@ namespace OpenSim.Region.CoreModules.World.LightShare uint vflags = client.GetViewerCaps(); - if ((vflags & 0x8000) != 0) + if (notforparcel && (vflags & 0x8000) != 0 ) m_estateModule.HandleRegionInfoRequest(client); else if ((vflags & 0x4000) != 0) @@ -343,7 +352,6 @@ namespace OpenSim.Region.CoreModules.World.LightShare } } - private void processExtEnv(IOSHttpRequest request, IOSHttpResponse response, UUID agentID, Caps caps) { switch(request.HttpMethod) @@ -379,9 +387,19 @@ namespace OpenSim.Region.CoreModules.World.LightShare } if(parcel == -1) + { StoreOnRegion(null); - - WindlightRefresh(0); + WindlightRefresh(0); + } + else + { + ILandObject land = m_scene.LandChannel.GetLandObject(parcel); + if (land != null && land.LandData != null) + { + land.StoreEnviroment(null); + WindlightRefresh(0, false); + } + } StringBuilder sb = LLSDxmlEncode.Start(); LLSDxmlEncode.AddMap(sb); @@ -395,19 +413,26 @@ namespace OpenSim.Region.CoreModules.World.LightShare private void GetExtEnvironmentSettings(IOSHttpRequest httpRequest, IOSHttpResponse httpResponse, UUID agentID) { + int parcel = -1; if (httpRequest.Query.Count > 0) { - int parcel = -1; if (httpRequest.Query.ContainsKey("parcelid")) { Int32.TryParse((string)httpRequest.Query["parcelid"], out parcel); } - OSD oenv = ViewerEnviroment.DefaultToOSD(regionID, parcel); - httpResponse.RawBuffer = Util.UTF8NBGetbytes(OSDParser.SerializeLLSDXmlString(oenv)); - httpResponse.StatusCode = (int)HttpStatusCode.OK; } - ViewerEnviroment VEnv = GetRegionEnviroment(); + ViewerEnviroment VEnv; + if (parcel == -1) + VEnv = GetRegionEnviroment(); + else + { + ILandObject land = m_scene.LandChannel.GetLandObject(parcel); + if (land != null && land.LandData != null && land.LandData.Enviroment != null) + VEnv = land.LandData.Enviroment; + else + VEnv = GetRegionEnviroment(); + } OSDMap map = new OSDMap(); map["environment"] = VEnv.ToOSD(); @@ -439,114 +464,150 @@ namespace OpenSim.Region.CoreModules.World.LightShare StringBuilder sb = LLSDxmlEncode.Start(); + ScenePresence sp = m_scene.GetScenePresence(agentID); + if (sp == null || sp.IsChildAgent || sp.IsNPC) + { + message = "Could not locate your avatar"; + goto Error; + } + if (httpRequest.Query.Count > 0) { if (httpRequest.Query.ContainsKey("parcelid")) { - Int32.TryParse((string)httpRequest.Query["parcelid"], out parcel); + if (!Int32.TryParse((string)httpRequest.Query["parcelid"], out parcel)) + { + message = "Failed to decode request"; + goto Error; + } } if (httpRequest.Query.ContainsKey("trackno")) { - Int32.TryParse((string)httpRequest.Query["trackno"], out track); + if (!Int32.TryParse((string)httpRequest.Query["trackno"], out track)) + { + message = "Failed to decode request"; + goto Error; + } + } + if (track != -1) + { + message = "Enviroment Track not suported"; + goto Error; } - - message = "Parcel Enviroment not supported"; - goto skiped; } - if(parcel == -1) + ViewerEnviroment VEnv = m_scene.RegionEnviroment; + ILandObject lchannel; + if (parcel == -1) { if (!m_scene.Permissions.CanIssueEstateCommand(agentID, false)) { message = "Insufficient estate permissions, settings has not been saved."; - goto skiped; + goto Error; } + VEnv = m_scene.RegionEnviroment; + lchannel = null; } - - if(track == -1) + else { - try + lchannel = m_landChannel.GetLandObject(parcel); + if(lchannel == null || lchannel.LandData == null) { - OSD req = OSDParser.Deserialize(httpRequest.InputStream); - if(req is OpenMetaverse.StructuredData.OSDMap) - { - OpenMetaverse.StructuredData.OSDMap map = req as OpenMetaverse.StructuredData.OSDMap; - if(map.TryGetValue("environment", out OSD env)) - { - ViewerEnviroment VEnv = m_scene.RegionEnviroment; - if (VEnv == null) - { - // need a proper clone - VEnv = new ViewerEnviroment(); - OSD otmp = m_DefaultEnv.ToOSD(); - string tmpstr = OSDParser.SerializeLLSDXmlString(otmp); - otmp = OSDParser.DeserializeLLSDXml(tmpstr); - VEnv.FromOSD(otmp); - } - OSDMap evmap = (OSDMap)env; - if(evmap.TryGetValue("day_asset", out OSD tmp) && !evmap.ContainsKey("day_cycle")) - { - string id = tmp.AsString(); - AssetBase asset = m_assetService.Get(id); - if(asset == null || asset.Data == null || asset.Data.Length == 0) - { - httpResponse.StatusCode = (int)HttpStatusCode.NotFound; - return; - } - try - { - OSD oenv = OSDParser.Deserialize(asset.Data); - VEnv.CycleFromOSD(oenv); - } - catch - { - httpResponse.StatusCode = (int)HttpStatusCode.NotFound; - return; - } - } - VEnv.FromOSD(env); - StoreOnRegion(VEnv); - - WindlightRefresh(0); - - success = true; - m_log.InfoFormat("[{0}]: ExtEnviromet settings saved from agentID {1} in region {2}", - Name, agentID, caps.RegionName); - } - } - else if (req is OSDArray) - { - ViewerEnviroment VEnv = new ViewerEnviroment(); - VEnv.FromWLOSD(req); - StoreOnRegion(VEnv); - success = true; - - WindlightRefresh(0); - - m_log.InfoFormat("[{0}]: New Environment settings has been saved from agentID {1} in region {2}", - Name, agentID, caps.RegionName); - - LLSDxmlEncode.AddMap(sb); - LLSDxmlEncode.AddElem("messageID", UUID.Zero, sb); - LLSDxmlEncode.AddElem("regionID", regionID, sb); - LLSDxmlEncode.AddElem("success", success, sb); - LLSDxmlEncode.AddEndMap(sb); - httpResponse.RawBuffer = Util.UTF8NBGetbytes(LLSDxmlEncode.End(sb)); - httpResponse.StatusCode = (int)HttpStatusCode.OK; - return; - } + message = "Could not locate requested parcel"; + goto Error; } - catch (Exception e) + + if (!m_scene.Permissions.CanEditParcelProperties(agentID, lchannel, 0, true)) // wrong { - m_log.ErrorFormat("[{0}]: ExtEnvironment settings not saved for region {1}, Exception: {2} - {3}", - Name, caps.RegionName, e.Message, e.StackTrace); - - success = false; - message = String.Format("ExtEnvironment Set for region {0} has failed, settings not saved.", caps.RegionName); + message = "No permission to change parcel enviroment"; + goto Error; } + VEnv = lchannel.LandData.Enviroment; } - skiped: + try + { + OSD req = OSDParser.Deserialize(httpRequest.InputStream); + if(req is OpenMetaverse.StructuredData.OSDMap) + { + OSDMap map = req as OpenMetaverse.StructuredData.OSDMap; + if(map.TryGetValue("environment", out OSD env)) + { + if (VEnv == null) + // need a proper clone + VEnv = m_DefaultEnv.Clone(); + + OSDMap evmap = (OSDMap)env; + if(evmap.TryGetValue("day_asset", out OSD tmp) && !evmap.ContainsKey("day_cycle")) + { + string id = tmp.AsString(); + AssetBase asset = m_assetService.Get(id); + if(asset == null || asset.Data == null || asset.Data.Length == 0) + { + httpResponse.StatusCode = (int)HttpStatusCode.NotFound; + return; + } + try + { + OSD oenv = OSDParser.Deserialize(asset.Data); + VEnv.CycleFromOSD(oenv); + } + catch + { + httpResponse.StatusCode = (int)HttpStatusCode.NotFound; + return; + } + } + VEnv.FromOSD(env); + if(lchannel == null) + { + StoreOnRegion(VEnv); + m_log.InfoFormat("[{0}]: ExtEnviroment region {1} settings from agentID {2} saved", + Name, caps.RegionName, agentID); + } + else + { + lchannel.StoreEnviroment(VEnv); + m_log.InfoFormat("[{0}]: ExtEnviroment parcel {1} of region {2} settings from agentID {3} saved", + Name, parcel, caps.RegionName, agentID); + } + + WindlightRefresh(0, lchannel == null); + success = true; + } + } + else if (req is OSDArray) + { + VEnv = new ViewerEnviroment(); + VEnv.FromWLOSD(req); + StoreOnRegion(VEnv); + success = true; + + WindlightRefresh(0); + + m_log.InfoFormat("[{0}]: ExtEnviroment region {1} settings from agentID {2} saved", + Name, caps.RegionName, agentID); + + LLSDxmlEncode.AddMap(sb); + LLSDxmlEncode.AddElem("messageID", UUID.Zero, sb); + LLSDxmlEncode.AddElem("regionID", regionID, sb); + LLSDxmlEncode.AddElem("success", success, sb); + LLSDxmlEncode.AddEndMap(sb); + httpResponse.RawBuffer = Util.UTF8NBGetbytes(LLSDxmlEncode.End(sb)); + httpResponse.StatusCode = (int)HttpStatusCode.OK; + return; + } + } + catch (Exception e) + { + m_log.ErrorFormat("[{0}]: ExtEnvironment settings not saved for region {1}, Exception: {2} - {3}", + Name, caps.RegionName, e.Message, e.StackTrace); + + success = false; + message = String.Format("ExtEnvironment Set for region {0} has failed, settings not saved.", caps.RegionName); + } + + Error: string response; LLSDxmlEncode.AddMap(sb); @@ -565,7 +626,19 @@ namespace OpenSim.Region.CoreModules.World.LightShare // m_log.DebugFormat("[{0}]: Environment GET handle for agentID {1} in region {2}", // Name, agentID, caps.RegionName); - ViewerEnviroment VEnv = GetRegionEnviroment(); + ScenePresence sp = m_scene.GetScenePresence(agentID); + if (sp == null || sp.IsChildAgent || sp.IsNPC) + { + response.StatusCode = (int)HttpStatusCode.NotFound; + return; + } + + ViewerEnviroment VEnv; + ILandObject land = m_scene.LandChannel.GetLandObject(sp.AbsolutePosition.X, sp.AbsolutePosition.Y); + if (land != null && land.LandData != null && land.LandData.Enviroment != null) + VEnv = land.LandData.Enviroment; + else + VEnv = GetRegionEnviroment(); OSD d = VEnv.ToWLOSD(UUID.Zero, regionID); string env = OSDParser.SerializeLLSDXmlString(d); @@ -586,7 +659,6 @@ namespace OpenSim.Region.CoreModules.World.LightShare response.StatusCode = (int)HttpStatusCode.OK; } - private void SetEnvironmentSettings(IOSHttpRequest request, IOSHttpResponse response, UUID agentID) { // m_log.DebugFormat("[{0}]: Environment SET handle from agentID {1} in region {2}", @@ -598,32 +670,45 @@ namespace OpenSim.Region.CoreModules.World.LightShare if (!m_scene.Permissions.CanIssueEstateCommand(agentID, false)) { fail_reason = "Insufficient estate permissions, settings has not been saved."; + goto Error; } - else + + ScenePresence sp = m_scene.GetScenePresence(agentID); + if (sp == null || sp.IsChildAgent || sp.IsNPC) { - try - { - ViewerEnviroment VEnv = new ViewerEnviroment(); - OSD env = OSDParser.Deserialize(request.InputStream); - VEnv.FromWLOSD(env); - StoreOnRegion(VEnv); - success = true; - - WindlightRefresh(0); - - m_log.InfoFormat("[{0}]: New Environment settings has been saved from agentID {1} in region {2}", - Name, agentID, m_scene.Name); - } - catch (Exception e) - { - m_log.ErrorFormat("[{0}]: Environment settings has not been saved for region {1}, Exception: {2} - {3}", - Name, m_scene.Name, e.Message, e.StackTrace); - - success = false; - fail_reason = String.Format("Environment Set for region {0} has failed, settings not saved.", m_scene.Name); - } + response.StatusCode = (int)HttpStatusCode.NotFound; + return; } + ILandObject land = m_scene.LandChannel.GetLandObject(sp.AbsolutePosition.X, sp.AbsolutePosition.Y); + if (land != null && land.LandData != null && land.LandData.Enviroment != null) + { + fail_reason = "The parcel where you are has own enviroment set. You need a updated viewer to change enviroment"; + goto Error; + } + try + { + ViewerEnviroment VEnv = new ViewerEnviroment(); + OSD env = OSDParser.Deserialize(request.InputStream); + VEnv.FromWLOSD(env); + StoreOnRegion(VEnv); + success = true; + + WindlightRefresh(0); + + m_log.InfoFormat("[{0}]: New Environment settings has been saved from agentID {1} in region {2}", + Name, agentID, m_scene.Name); + } + catch (Exception e) + { + m_log.ErrorFormat("[{0}]: Environment settings has not been saved for region {1}, Exception: {2} - {3}", + Name, m_scene.Name, e.Message, e.StackTrace); + + success = false; + fail_reason = String.Format("Environment Set for region {0} has failed, settings not saved.", m_scene.Name); + } + + Error: StringBuilder sb = LLSDxmlEncode.Start(); LLSDxmlEncode.AddMap(sb); LLSDxmlEncode.AddElem("messageID", UUID.Zero, sb); @@ -738,6 +823,16 @@ namespace OpenSim.Region.CoreModules.World.LightShare client.SendGenericMessage("Windlight", UUID.Random(), param); } + private void OnAvatarEnteringNewParcel(ScenePresence sp, int localLandID, UUID regionID) + { + IClientAPI client = sp.ControllingClient; + uint vflags = client.GetViewerCaps(); + if((vflags & 0x8000) != 0) + return; + if(m_scene.RegionInfo.EstateSettings.AllowEnviromentOverride) + m_eventQueue.WindlightRefreshEvent(1, client.AgentId); + } + private void UpdateEnvTime() { double now = Util.GetTimeStamp(); @@ -770,6 +865,7 @@ namespace OpenSim.Region.CoreModules.World.LightShare wldayFrac = Utils.Clamp(wldayFrac, 0, 2f); wldayFrac *= Utils.PI; + float eepDayFrac = dayFrac * Utils.TWO_PI; m_scene.ForEachRootScenePresence(delegate (ScenePresence sp) diff --git a/OpenSim/Region/CoreModules/World/Region/RegionCommandsModule.cs b/OpenSim/Region/CoreModules/World/Region/RegionCommandsModule.cs index 8d92cc85e4..c78db552d9 100755 --- a/OpenSim/Region/CoreModules/World/Region/RegionCommandsModule.cs +++ b/OpenSim/Region/CoreModules/World/Region/RegionCommandsModule.cs @@ -178,7 +178,6 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands dispList.AddRow("Restrict pushing", rs.RestrictPushing); dispList.AddRow("Fixed sun", rs.FixedSun); dispList.AddRow("Sun position", rs.SunPosition); - dispList.AddRow("Sun vector", rs.SunVector); dispList.AddRow("Use estate sun", rs.UseEstateSun); dispList.AddRow("Telehub UUID", rs.TelehubObject); dispList.AddRow("Terrain lower limit", string.Format("{0} m", rs.TerrainLowerLimit));