diff --git a/OpenSim/Region/CoreModules/Framework/UserManagement/UserManagementModule.cs b/OpenSim/Region/CoreModules/Framework/UserManagement/UserManagementModule.cs index cfaa1f6dde..f61bb12145 100755 --- a/OpenSim/Region/CoreModules/Framework/UserManagement/UserManagementModule.cs +++ b/OpenSim/Region/CoreModules/Framework/UserManagement/UserManagementModule.cs @@ -996,13 +996,15 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement } else { - userdata = new UserData(); - userdata.Id = uuid; - userdata.FirstName = "Unknown"; - userdata.LastName = uuid.ToString(); - userdata.HomeURL = string.Empty; - userdata.IsUnknownUser = true; - userdata.HasGridUserTried = false; + userdata = new UserData + { + Id = uuid, + FirstName = "Unknown", + LastName = uuid.ToString(), + HomeURL = string.Empty, + IsUnknownUser = true, + HasGridUserTried = false + }; } if (!userdata.HasGridUserTried) diff --git a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs index 7267ccfb2d..92d1a71770 100644 --- a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs +++ b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs @@ -228,7 +228,104 @@ namespace OpenSim.Region.CoreModules.World.Estate public void setEstateTerrainBaseTexture(int level, UUID texture) { - SetEstateTerrainBaseTexture(null, level, texture); + if (texture.IsZero()) + return; + + switch (level) + { + case 0: + Scene.RegionInfo.RegionSettings.TerrainTexture1 = texture; + break; + case 1: + Scene.RegionInfo.RegionSettings.TerrainTexture2 = texture; + break; + case 2: + Scene.RegionInfo.RegionSettings.TerrainTexture3 = texture; + break; + case 3: + Scene.RegionInfo.RegionSettings.TerrainTexture4 = texture; + break; + default: + return; + } + + Scene.RegionInfo.RegionSettings.Save(); + TriggerRegionInfoChange(); + sendRegionHandshakeToAll(); + } + + public void SetEstateTerrainTextures(List ids, int types) + { + switch(types) + { + case 2: + if (ids[0].IsNotZero()) + { + Scene.RegionInfo.RegionSettings.TerrainTexture1 = ids[0]; + Scene.RegionInfo.RegionSettings.TerrainPBR1 = ids[0]; + } + if (ids[1].IsNotZero()) + { + Scene.RegionInfo.RegionSettings.TerrainTexture2 = ids[1]; + Scene.RegionInfo.RegionSettings.TerrainPBR2 = ids[1]; + } + if (ids[2].IsNotZero()) + { + Scene.RegionInfo.RegionSettings.TerrainTexture3 = ids[2]; + Scene.RegionInfo.RegionSettings.TerrainPBR3 = ids[2]; + } + if (ids[3].IsNotZero()) + { + Scene.RegionInfo.RegionSettings.TerrainTexture4 = ids[3]; + Scene.RegionInfo.RegionSettings.TerrainPBR4 = ids[3]; + } + break; + + case 1: + if (ids[0].IsNotZero()) + { + Scene.RegionInfo.RegionSettings.TerrainPBR1 = ids[0]; + } + if (ids[1].IsNotZero()) + { + Scene.RegionInfo.RegionSettings.TerrainPBR2 = ids[1]; + } + if (ids[2].IsNotZero()) + { + Scene.RegionInfo.RegionSettings.TerrainPBR3 = ids[2]; + } + if (ids[3].IsNotZero()) + { + Scene.RegionInfo.RegionSettings.TerrainPBR4 = ids[3]; + } + break; + + case 0: + if (ids[0].IsNotZero()) + { + Scene.RegionInfo.RegionSettings.TerrainTexture1 = ids[0]; + } + if (ids[1].IsNotZero()) + { + Scene.RegionInfo.RegionSettings.TerrainTexture2 = ids[1]; + } + if (ids[2].IsNotZero()) + { + Scene.RegionInfo.RegionSettings.TerrainTexture3 = ids[2]; + } + if (ids[3].IsNotZero()) + { + Scene.RegionInfo.RegionSettings.TerrainTexture4 = ids[3]; + } + break; + + default: + return; + } + + Scene.RegionInfo.RegionSettings.Save(); + TriggerRegionInfoChange(); + sendRegionHandshakeToAll(); } public void setEstateTerrainTextureHeights(int corner, float lowValue, float highValue) diff --git a/OpenSim/Region/Framework/Interfaces/IEstateModule.cs b/OpenSim/Region/Framework/Interfaces/IEstateModule.cs index f4a314bd6f..ca81c53908 100644 --- a/OpenSim/Region/Framework/Interfaces/IEstateModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IEstateModule.cs @@ -29,6 +29,7 @@ using OpenMetaverse; using OpenMetaverse.StructuredData; using OpenSim.Framework; using OpenSim.Services.Interfaces; +using System.Collections.Generic; namespace OpenSim.Region.Framework.Interfaces { @@ -63,6 +64,7 @@ namespace OpenSim.Region.Framework.Interfaces void TriggerRegionInfoChange(); void setEstateTerrainBaseTexture(int level, UUID texture); + void SetEstateTerrainTextures(List textureIDs, int types); void setEstateTerrainTextureHeights(int corner, float lowValue, float highValue); /// diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index 6c3237f225..51bc75fd6c 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs @@ -4106,7 +4106,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api } /// - /// Sets terrain texture + /// Sets terrain texture for legacy viewers and map /// /// /// @@ -4115,16 +4115,68 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { if (level < 0 || level > 3) return; + IEstateModule estate = World.RequestModuleInterface(); + if(estate == null) + return; if (!UUID.TryParse(texture, out UUID textureID)) return; - CheckThreatLevel(ThreatLevel.High, "osSetTerrainTexture"); + if (!World.Permissions.IsGod(m_host.OwnerID)) + CheckThreatLevel(ThreatLevel.High, "osSetTerrainTexture"); - if (World.Permissions.IsGod(m_host.OwnerID)) + estate.setEstateTerrainBaseTexture(level, textureID); + } + + /// Sets terrain texture for legacy viewers and map + /// if types is 0, sets textures for older viewers and map + /// if types is 1 sets materials or textures for new viewers + /// if types is 2 sets textures for both kinds + /// + /// + /// + /// + + public void osSetTerrainTextures(LSL_List textures, LSL_Integer types) + { + if(textures.Length != 4) + return; + + IEstateModule estate = World.RequestModuleInterface(); + if(estate == null) + return; + + if (!World.Permissions.IsGod(m_host.OwnerID)) + CheckThreatLevel(ThreatLevel.High, "osSetTerrainTexture"); + + List ids = new(4); + int changes = 0; + for(int i = 0; i < textures.Length; i++) { - IEstateModule estate = World.RequestModuleInterface(); - estate?.setEstateTerrainBaseTexture(level, textureID); + string u = textures.GetStrictLSLStringItem(i); + if(string.IsNullOrEmpty(u)) + ids.Add(UUID.Zero); + else + { + if (!UUID.TryParse(u, out UUID id)) + { + TaskInventoryItem item = m_host.Inventory.GetInventoryItem(u); + if (item != null && (item.Type == (int)AssetType.Texture || item.Type == (int)AssetType.Material)) + id = item.AssetID; + else + { + OSSLShoutError($"Invalid key in osSetTerrainTextures texture {i}"); + return; + } + } + ids.Add(id); + if(changes == 0 && id.IsNotZero()) + changes++; + } } + if(changes == 0) + return; + + estate.SetEstateTerrainTextures(ids, types.value); } /// diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs index 8cb646a6a3..e6c2456e7c 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs @@ -581,6 +581,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces //ApiDesc Sets the terrain texture for a given level. void osSetTerrainTexture(int level, LSL_Key texture); + //ApiDesc Sets terrain textures for legacy viewers it types == 0 or 2, textures for new viewers it types == 1 or 2 or PBR materials if types == 1 + void osSetTerrainTextures(LSL_List textures, LSL_Integer types); //ApiDesc Sets the texture low and high values for a given region corner. void osSetTerrainTextureHeight(int corner, double low, double high); diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs index 5a502493b1..c5703efc88 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs @@ -1104,6 +1104,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase m_OSSL_Functions.osSetTerrainTexture(level, texture); } + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void osSetTerrainTextures(LSL_List textures, LSL_Integer types) + { + m_OSSL_Functions.osSetTerrainTextures(textures, types); + } + [MethodImpl(MethodImplOptions.AggressiveInlining)] public void osSetTerrainTextureHeight(int corner, double low, double high) {