a few , mostly cosmetic, changes to osSetTerrainTextures and add prim inventory osSetTerrainTextures with a list of possible asset types to match

This commit is contained in:
UbitUmarov
2025-05-06 23:40:40 +01:00
parent 23ad195e7a
commit ef2fce034f
3 changed files with 67 additions and 27 deletions

View File

@@ -25,6 +25,7 @@
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
using System;
using System.Collections.Generic;
using System.Collections;
using OpenMetaverse;
@@ -216,8 +217,10 @@ namespace OpenSim.Region.Framework.Interfaces
/// <returns>
/// The inventory item. Null if no such item was found.
/// </returns>
TaskInventoryItem GetInventoryItem(string name);
TaskInventoryItem GetInventoryItem(string name, int assetType);
TaskInventoryItem GetInventoryItem(ReadOnlySpan<char> name);
TaskInventoryItem GetInventoryItem(ReadOnlySpan<char> name, int assetType);
TaskInventoryItem GetInventoryItem(ReadOnlySpan<char> name, ReadOnlySpan<int> assetTypes);
/// <summary>
/// Get inventory items by name.
@@ -227,7 +230,7 @@ namespace OpenSim.Region.Framework.Interfaces
/// A list of inventory items with that name.
/// If no inventory item has that name then an empty list is returned.
/// </returns>
List<TaskInventoryItem> GetInventoryItems(string name);
List<TaskInventoryItem> GetInventoryItems(ReadOnlySpan<char> name);
/// <summary>
/// Get inventory items by type.

View File

@@ -1075,12 +1075,12 @@ namespace OpenSim.Region.Framework.Scenes
return item;
}
public TaskInventoryItem GetInventoryItem(string name)
public TaskInventoryItem GetInventoryItem(ReadOnlySpan<char> name)
{
m_items.LockItemsForRead(true);
foreach (TaskInventoryItem item in m_items.Values)
{
if (item.Name == name)
if (name.Equals(item.Name, StringComparison.Ordinal))
{
m_items.LockItemsForRead(false);
return item;
@@ -1091,12 +1091,12 @@ namespace OpenSim.Region.Framework.Scenes
return null;
}
public TaskInventoryItem GetInventoryItem(string name, int type)
public TaskInventoryItem GetInventoryItem(ReadOnlySpan<char> name, int type)
{
m_items.LockItemsForRead(true);
foreach (TaskInventoryItem item in m_items.Values)
{
if (item.Type == type && item.Name == name)
if (item.Type == type && name.Equals(item.Name, StringComparison.Ordinal))
{
m_items.LockItemsForRead(false);
return item;
@@ -1107,15 +1107,41 @@ namespace OpenSim.Region.Framework.Scenes
return null;
}
public List<TaskInventoryItem> GetInventoryItems(string name)
public TaskInventoryItem GetInventoryItem(ReadOnlySpan<char> name, ReadOnlySpan<int> types)
{
List<TaskInventoryItem> items = new List<TaskInventoryItem>();
if(types.Length == 0)
return null;
m_items.LockItemsForRead(true);
foreach (TaskInventoryItem item in m_items.Values)
{
if (name.Equals(item.Name, StringComparison.Ordinal))
{
int type = item.Type;
int i = 0;
do
{
if(type == types[i])
{
m_items.LockItemsForRead(false);
return item;
}
i++;
}while(i < types.Length);
}
}
m_items.LockItemsForRead(false);
return null;
}
public List<TaskInventoryItem> GetInventoryItems(ReadOnlySpan<char> name)
{
List<TaskInventoryItem> items = [];
m_items.LockItemsForRead(true);
foreach (TaskInventoryItem item in m_items.Values)
{
if (item.Name == name)
if (name.Equals(item.Name, StringComparison.Ordinal))
items.Add(item);
}

View File

@@ -4136,20 +4136,31 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
/// <param name="legacy"></param>
/// <returns></returns>
public void osSetTerrainTextures(LSL_List textures, LSL_Integer types)
private static readonly int[] PBRAndTextureTypes = [(int)AssetType.Texture, (int)AssetType.Material];
public void osSetTerrainTextures(LSL_List textures, LSL_Integer ltypes)
{
if(textures.Length != 4)
return;
IEstateModule estate = World.RequestModuleInterface<IEstateModule>();
if(estate == null)
IEstateModule estateModule = World.RequestModuleInterface<IEstateModule>();
if (estateModule == null)
return;
if (!World.Permissions.IsGod(m_host.OwnerID))
CheckThreatLevel(ThreatLevel.High, "osSetTerrainTexture");
if(textures.Length != 4)
{
OSSLShoutError($"osSetTerrainTextures first argument is a list of keys or names that must have 4 elements");
return;
}
int types = ltypes.value;
if( types < 0 || types > 2)
{
OSSLShoutError($"osSetTerrainTextures second argument must be >=0 and <= 2");
return;
}
List<UUID> ids = new(4);
int changes = 0;
bool hasChanges = false;
for(int i = 0; i < textures.Length; i++)
{
string u = textures.GetStrictLSLStringItem(i);
@@ -4159,24 +4170,24 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
{
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
TaskInventoryItem item = types == 1 ?
m_host.Inventory.GetInventoryItem(u, PBRAndTextureTypes) :
m_host.Inventory.GetInventoryItem(u,(int)AssetType.Texture);
if (item == null)
{
OSSLShoutError($"Invalid key in osSetTerrainTextures texture {i}");
OSSLShoutError($"Invalid key or asset type in osSetTerrainTextures texture {i}");
return;
}
id = item.AssetID;
}
ids.Add(id);
if(changes == 0 && id.IsNotZero())
changes++;
if(!hasChanges && id.IsNotZero())
hasChanges = true;
}
}
if(changes == 0)
return;
estate.SetEstateTerrainTextures(ids, types.value);
if(hasChanges)
estateModule.SetEstateTerrainTextures(ids, types);
}
/// <summary>