mirror of
https://github.com/opensim/opensim.git
synced 2026-08-05 17:05:55 +08:00
add osSetTerrainTextures(LSL_List textures, LSL_Integer types) to set terrain textures for legacy viewers it types == 0 or 2; textures for new viewers if types == 1 or 2 or PBR materials if types == 1 (untested :( )
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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<UUID> 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)
|
||||
|
||||
@@ -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<UUID> textureIDs, int types);
|
||||
void setEstateTerrainTextureHeights(int corner, float lowValue, float highValue);
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -4106,7 +4106,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets terrain texture
|
||||
/// Sets terrain texture for legacy viewers and map
|
||||
/// </summary>
|
||||
/// <param name="level"></param>
|
||||
/// <param name="texture"></param>
|
||||
@@ -4115,16 +4115,68 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||
{
|
||||
if (level < 0 || level > 3)
|
||||
return;
|
||||
IEstateModule estate = World.RequestModuleInterface<IEstateModule>();
|
||||
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
|
||||
/// </summary>
|
||||
/// <param name="textures"></param>
|
||||
/// <param name="legacy"></param>
|
||||
/// <returns></returns>
|
||||
|
||||
public void osSetTerrainTextures(LSL_List textures, LSL_Integer types)
|
||||
{
|
||||
if(textures.Length != 4)
|
||||
return;
|
||||
|
||||
IEstateModule estate = World.RequestModuleInterface<IEstateModule>();
|
||||
if(estate == null)
|
||||
return;
|
||||
|
||||
if (!World.Permissions.IsGod(m_host.OwnerID))
|
||||
CheckThreatLevel(ThreatLevel.High, "osSetTerrainTexture");
|
||||
|
||||
List<UUID> ids = new(4);
|
||||
int changes = 0;
|
||||
for(int i = 0; i < textures.Length; i++)
|
||||
{
|
||||
IEstateModule estate = World.RequestModuleInterface<IEstateModule>();
|
||||
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);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user