From 0197ffc3ee6d56b1c5ca4d4b9a11efc55342518c Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Sat, 16 Aug 2025 01:42:39 +0100 Subject: [PATCH] add llGetRenderMaterial --- .../Shared/Api/Implementation/LSL_Api.cs | 55 ++++++++++++++++++- .../Shared/Api/Interface/ILSL_Api.cs | 1 + .../Shared/Api/Runtime/LSL_Stub.cs | 5 ++ 3 files changed, 60 insertions(+), 1 deletion(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 5cfb70d379..c048b7f6ef 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -2350,7 +2350,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { if (face == ScriptBaseClass.ALL_SIDES) face = 0; - if (face < 0) + else if (face < 0) return ScriptBaseClass.NULL_KEY; Primitive.TextureEntry tex = part.Shape.Textures; @@ -19508,6 +19508,59 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return new LSL_String(); } + public LSL_String llGetRenderMaterial(LSL_Integer lface ) + { + return GetMaterial(m_host, lface.value); + } + + protected static LSL_String GetMaterial(SceneObjectPart part, int face) + { + if (part.Shape.RenderMaterials is null || + part.Shape.RenderMaterials.entries is null || + part.Shape.RenderMaterials.entries.Length == 0) + return ScriptBaseClass.NULL_KEY; + + if (face == ScriptBaseClass.ALL_SIDES) + face = 0; + else if (face < 0) + return ScriptBaseClass.NULL_KEY; + else if (face >= GetNumberOfSides(part)) + return ScriptBaseClass.NULL_KEY; + + UUID asset = UUID.Zero; + bool found = false; + foreach(Primitive.RenderMaterials.RenderMaterialEntry re in part.Shape.RenderMaterials.entries) + { + if(re.te_index == face) + { + asset = re.id; + found = true; + break; + } + } + + if(!found) + return ScriptBaseClass.NULL_KEY; + + lock (part.TaskInventory) + { + part.TaskInventory.LockItemsForRead(true); + try + { + foreach (KeyValuePair inv in part.TaskInventory) + { + if (inv.Value.Type == (int)AssetType.Material && inv.Value.AssetID.Equals(asset)) + return inv.Value.Name.ToString(); + } + } + finally { part.TaskInventory.LockItemsForRead(false); } + } + + if((part.ParentGroup.EffectiveOwnerPerms & (uint)PermissionMask.All) != (uint)PermissionMask.All) + return ScriptBaseClass.NULL_KEY; + + return asset.ToString(); + } static string HMAC_SHA224(string key, string message) { const int blockSize = 64; diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs index 291ef69c10..54195ca971 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs @@ -534,5 +534,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces void llSetLinkSitFlags(LSL_Integer linknum, LSL_Integer flags); LSL_String llHMAC(LSL_String private_key, LSL_String message, LSL_String algo); LSL_String llComputeHash(LSL_String message, LSL_String algo); + LSL_String llGetRenderMaterial(LSL_Integer face); } } diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs index cb3ca6ebd6..2d7fc63060 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs @@ -2882,5 +2882,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase return m_LSL_Functions.llComputeHash(message, algo); } + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public LSL_String llGetRenderMaterial(LSL_Integer face) + { + return m_LSL_Functions.llGetRenderMaterial(face); + } } }