Features/upstream-08062024 (#84)
Some checks failed
CodeQL / Analyze (csharp) (push) Has been cancelled
dotnet package / build (8.0.x) (push) Has been cancelled
dotnet package / build (9.0.x) (push) Has been cancelled

* also add default uuid zero string to mysql and pgsql pbr entries

* add llDerezObject(..)

* update ScriptSyntax

* Postgresql Fixes: region store, mutelist and generic table handler.

Signed-off-by: UbitUmarov <ajlduarte@sapo.pt>

* Fix wrong primary key on telehub spawn points. With the RegionUUID being created as a unique primary key only one spawn point could be created. Replaced the primary key with one using multiple columns to guarantee that each spawn point occupies a unique space in the region.

Signed-off-by: UbitUmarov <ajlduarte@sapo.pt>

* Fix region data loading to prevent deletion of telehub spawnpoints

Signed-off-by: UbitUmarov <ajlduarte@sapo.pt>

* Adding missing 'regionextra' table and associated handlers to the PgSQL adapter.

Signed-off-by: UbitUmarov <ajlduarte@sapo.pt>

* viewers now are sending a useless flood of agent updates. Ignore some

* fix shared group object item modify permission check

* Add llGetNotecardLineSync

* a few changes to llGetNotecardLineSync

* minor cleanup

* fix typo

* improve script cpu time resolution specially on windows

* catch some possible null refs

* mantis 9135: avoid null ref

* Get Npgsql from NuGet and remove the hard coded version. Upgrade to 8.0.3 so its compatible with dotnet 8.    Remove the copy from bin.

---------

Signed-off-by: UbitUmarov <ajlduarte@sapo.pt>
Co-authored-by: UbitUmarov <ajlduarte@sapo.pt>
Co-authored-by: BlueWall <jamesh@bluewallvirtual.com>
Co-authored-by: Sue Cripter <Sue.Cripter@gmail.com>
This commit is contained in:
Mike Dickson 2024-08-08 11:00:49 -04:00 committed by GitHub
parent d64ff145cd
commit 9bd83b5593
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
21 changed files with 586 additions and 286 deletions

View file

@ -81,6 +81,7 @@
<Compile Remove="PGSQL\PGSQLInventoryData.cs" />
<Compile Remove="PGSQL\PGSQLManager.cs" />
<Compile Remove="PGSQL\PGSQLMigration.cs" />
<Compile Remove="PGSQL\PGSQLMutelistData.cs" />
<Compile Remove="PGSQL\PGSQLOfflineIMData.cs" />
<Compile Remove="PGSQL\PGSQLPresenceData.cs" />
<Compile Remove="PGSQL\PGSQLRegionData.cs" />

View file

@ -7,10 +7,6 @@
<Copyright>Copyright (c) OpenSimulator.org Developers 2007-2009</Copyright>
</PropertyGroup>
<ItemGroup>
<Reference Include="Npgsql">
<HintPath>..\..\..\bin\Npgsql.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="OpenMetaverse">
<HintPath>..\..\..\bin\OpenMetaverse.dll</HintPath>
<Private>False</Private>
@ -56,6 +52,7 @@
<PackageReference Include="log4net" Version="2.0.15" />
<PackageReference Include="Mono.Addins" Version="1.4.1" />
<PackageReference Include="Mono.Addins.CecilReflector" Version="1.4.1" />
<PackageReference Include="Npgsql" Version="8.0.3" />
</ItemGroup>
<ItemGroup>
<Folder Include="Properties\" />

View file

@ -35,6 +35,7 @@ using OpenSim.Framework;
using OpenSim.Region.Framework.Interfaces;
using System.Text;
using Npgsql;
using NpgsqlTypes;
namespace OpenSim.Data.PGSQL
{
@ -59,8 +60,8 @@ namespace OpenSim.Data.PGSQL
get { return GetType().Assembly; }
}
public PGSQLGenericTableHandler(string connectionString,
string realm, string storeName)
public PGSQLGenericTableHandler(
string connectionString, string realm, string storeName)
: base(connectionString)
{
m_Realm = realm;
@ -534,7 +535,7 @@ namespace OpenSim.Data.PGSQL
{
for (int i = 0; i < fields.Length; i++)
{
cmd.Parameters.AddWithValue(fields[i], keys[i]);
cmd.Parameters.AddWithValue(fields[i], new Guid(keys[i]));
terms.Add("\"" + fields[i] + "\" = :" + fields[i]);
}

View file

@ -0,0 +1,72 @@
/*
* Copyright (c) Contributors, http://opensimulator.org/
* See CONTRIBUTORS.TXT for a full list of copyright holders.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the OpenSimulator Project nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
using System;
using System.Collections;
using System.Collections.Generic;
using System.Reflection;
using OpenSim.Framework;
using OpenMetaverse;
using Npgsql;
namespace OpenSim.Data.PGSQL
{
public class PGSQLMuteListData: PGSQLGenericTableHandler<MuteData>, IMuteListData
{
public PGSQLMuteListData(string connectionString)
: base(connectionString, "MuteList", "MuteListStore")
{
}
public MuteData[] Get(UUID agentID)
{
var data = base.Get("AgentID", agentID.ToString());
return data;
}
public bool Delete(UUID agentID, UUID muteID, string muteName)
{
var query = $"DELETE FROM MuteList WHERE \"AgentID\" = :AgentID and " +
$"\"MuteID\" = :MuteID and " +
$"\"MuteName\" = :MuteName";
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
using (NpgsqlCommand cmd = new NpgsqlCommand())
{
cmd.CommandText = query;
cmd.Parameters.AddWithValue(":AgentID", agentID.ToString());
cmd.Parameters.AddWithValue(":MuteID", muteID.ToString());
cmd.Parameters.AddWithValue("MuteName", muteName);
cmd.Connection = conn;
conn.Open();
cmd.ExecuteNonQuery();
return true;
}
}
}
}

View file

@ -39,6 +39,7 @@ using OpenSim.Region.Framework.Interfaces;
using OpenSim.Region.Framework.Scenes;
using OpenSim.Data;
using Npgsql;
using NpgsqlTypes;
namespace OpenSim.Data.PGSQL
{
@ -778,7 +779,7 @@ namespace OpenSim.Data.PGSQL
cmd.ExecuteNonQuery();
}
sql = @"INSERT INTO landaccesslist (""LandUUID"",""AccessUUID"",""LandFlags"",""Expires"") VALUES (:LandUUID,:AccessUUID,:Flags,:Expires)";
sql = @"INSERT INTO landaccesslist (""LandUUID"",""AccessUUID"",""Flags"",""Expires"") VALUES (:LandUUID,:AccessUUID,:Flags,:Expires)";
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
@ -890,7 +891,7 @@ namespace OpenSim.Data.PGSQL
public RegionSettings LoadRegionSettings(UUID regionUUID)
{
string sql = @"select * from regionsettings where ""regionUUID"" = :regionUUID";
RegionSettings regionSettings;
RegionSettings regionSettings = null;
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
{
@ -902,10 +903,13 @@ namespace OpenSim.Data.PGSQL
{
regionSettings = BuildRegionSettings(reader);
regionSettings.OnSave += StoreRegionSettings;
return regionSettings;
}
}
if (regionSettings != null)
{
LoadSpawnPoints(regionSettings);
return regionSettings;
}
}
//If we reach this point then there are new region settings for that region
@ -914,7 +918,8 @@ namespace OpenSim.Data.PGSQL
regionSettings.OnSave += StoreRegionSettings;
//Store new values
StoreNewRegionSettings(regionSettings);
// StoreNewRegionSettings(regionSettings);
StoreRegionSettings(regionSettings);
LoadSpawnPoints(regionSettings);
@ -922,51 +927,69 @@ namespace OpenSim.Data.PGSQL
}
/// <summary>
/// Store region settings, need to check if the check is really necesary. If we can make something for creating new region.
/// Store region settings
/// </summary>
/// <param name="regionSettings">region settings.</param>
public void StoreRegionSettings(RegionSettings regionSettings)
{
//Little check if regionUUID already exist in DB
string regionUUID;
string sql = @"SELECT ""regionUUID"" FROM regionsettings WHERE ""regionUUID"" = :regionUUID";
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
{
cmd.Parameters.Add(_Database.CreateParameter("regionUUID", regionSettings.RegionUUID));
conn.Open();
regionUUID = cmd.ExecuteScalar().ToString();
}
const string queryString = """
INSERT INTO regionsettings ( "regionUUID", block_terraform, block_fly, allow_damage, restrict_pushing,
allow_land_resell, allow_land_join_divide, block_show_in_search, agent_limit, object_bonus,
maturity, disable_scripts, disable_collisions, disable_physics, terrain_texture_1, terrain_texture_2,
terrain_texture_3, terrain_texture_4, elevation_1_nw, elevation_2_nw, elevation_1_ne, elevation_2_ne,
elevation_1_se, elevation_2_se, elevation_1_sw, elevation_2_sw, water_height, terrain_raise_limit,
terrain_lower_limit, use_estate_sun, fixed_sun, sun_position, covenant, covenant_datetime, "Sandbox",
sunvectorx, sunvectory, sunvectorz, loaded_creation_datetime, loaded_creation_id, "map_tile_ID",
block_search, casino, "TelehubObject", "parcel_tile_ID", "cacheID", "TerrainPBR1", "TerrainPBR2",
"TerrainPBR3", "TerrainPBR4")
VALUES
(:RegionUUID, :block_terraform, :block_fly, :allow_damage, :restrict_pushing, :allow_land_resell,
:allow_land_join_divide, :block_show_in_search, :agent_limit, :object_bonus, :maturity, :disable_scripts,
:disable_collisions, :disable_physics, :terrain_texture_1, :terrain_texture_2, :terrain_texture_3,
:terrain_texture_4, :elevation_1_nw, :elevation_2_nw, :elevation_1_ne, :elevation_2_ne, :elevation_1_se,
:elevation_2_se, :elevation_1_sw, :elevation_2_sw, :water_height, :terrain_raise_limit, :terrain_lower_limit,
:use_estate_sun, :fixed_sun, :sun_position, :covenant, :covenant_datetime, :Sandbox, :sunvectorx,
:sunvectory, :sunvectorz, :Loaded_Creation_DateTime, :Loaded_Creation_ID, :map_tile_ID,
:block_search, :casino, :TelehubObject, :ParcelImageID, :cacheID, :TerrainPBR1, :TerrainPBR2,
:TerrainPBR3, :TerrainPBR4)
ON CONFLICT ("regionUUID")
DO UPDATE SET "regionUUID" = :RegionUUID, block_terraform = :block_terraform, block_fly = :block_fly,
allow_damage = :allow_damage, restrict_pushing = :restrict_pushing, allow_land_resell = :allow_land_resell,
allow_land_join_divide = :allow_land_join_divide, block_show_in_search = :block_show_in_search,
agent_limit = :agent_limit, object_bonus = :object_bonus, maturity = :maturity, disable_scripts = :disable_scripts,
disable_collisions = :disable_collisions, disable_physics = :disable_physics, terrain_texture_1 = :terrain_texture_1,
terrain_texture_2 = :terrain_texture_2, terrain_texture_3 = :terrain_texture_3, terrain_texture_4 = :terrain_texture_4,
elevation_1_nw = :elevation_1_nw, elevation_2_nw = :elevation_2_nw, elevation_1_ne = :elevation_1_ne,
elevation_2_ne = :elevation_2_ne, elevation_1_se = :elevation_1_se, elevation_2_se = :elevation_2_se,
elevation_1_sw = :elevation_1_sw, elevation_2_sw = :elevation_2_sw, water_height = :water_height,
terrain_raise_limit = :terrain_raise_limit, terrain_lower_limit = :terrain_lower_limit,
use_estate_sun = :use_estate_sun, fixed_sun = :fixed_sun, sun_position = :sun_position, covenant = :covenant,
covenant_datetime = :covenant_datetime, "Sandbox" = :Sandbox, sunvectorx = :sunvectorx,
sunvectory = :sunvectory, sunvectorz = :sunvectorz, loaded_creation_datetime = :Loaded_Creation_DateTime,
loaded_creation_id = :Loaded_Creation_ID, "map_tile_ID" = :map_tile_ID, block_search = :block_search,
casino = :casino, "TelehubObject" = :TelehubObject, "parcel_tile_ID" = :ParcelImageID, "cacheID" = :cacheID,
"TerrainPBR1" = :TerrainPBR1, "TerrainPBR2" = :TerrainPBR2, "TerrainPBR3" = :TerrainPBR3,
"TerrainPBR4" = :TerrainPBR4
""";
if (string.IsNullOrEmpty(regionUUID))
using (var connection = new NpgsqlConnection(m_connectionString))
{
StoreNewRegionSettings(regionSettings);
connection.Open();
NpgsqlCommand command = new NpgsqlCommand(queryString, connection, connection.BeginTransaction());
using (command)
{
try
{
command.Parameters.AddRange(CreateRegionSettingParameters(regionSettings));
command.ExecuteNonQuery();
command.Transaction.Commit();
}
else
catch (Exception e)
{
//This method only updates region settings!!! First call LoadRegionSettings to create new region settings in DB
sql =
@"UPDATE regionsettings SET block_terraform = :block_terraform ,block_fly = :block_fly ,allow_damage = :allow_damage
,restrict_pushing = :restrict_pushing ,allow_land_resell = :allow_land_resell ,allow_land_join_divide = :allow_land_join_divide
,block_show_in_search = :block_show_in_search ,agent_limit = :agent_limit ,object_bonus = :object_bonus ,maturity = :maturity
,disable_scripts = :disable_scripts ,disable_collisions = :disable_collisions ,disable_physics = :disable_physics
,terrain_texture_1 = :terrain_texture_1 ,terrain_texture_2 = :terrain_texture_2 ,terrain_texture_3 = :terrain_texture_3
,terrain_texture_4 = :terrain_texture_4 , TerrainPBR1 = :TerrainPBR1, TerrainPBR2 = :TerrainPBR2, TerrainPBR3 = :TerrainPBR3
,TerrainPBR4 = :TerrainPBR4, elevation_1_nw = :elevation_1_nw ,elevation_2_nw = :elevation_2_nw
,elevation_1_ne = :elevation_1_ne ,elevation_2_ne = :elevation_2_ne ,elevation_1_se = :elevation_1_se ,elevation_2_se = :elevation_2_se
,elevation_1_sw = :elevation_1_sw ,elevation_2_sw = :elevation_2_sw ,water_height = :water_height ,terrain_raise_limit = :terrain_raise_limit
,terrain_lower_limit = :terrain_lower_limit ,use_estate_sun = :use_estate_sun ,fixed_sun = :fixed_sun ,sun_position = :sun_position
,covenant = :covenant ,covenant_datetime = :covenant_datetime, sunvectorx = :sunvectorx, sunvectory = :sunvectory, sunvectorz = :sunvectorz,
""Sandbox"" = :Sandbox, loaded_creation_datetime = :loaded_creation_datetime, loaded_creation_id = :loaded_creation_id, ""map_tile_ID"" = :TerrainImageID,
""TelehubObject"" = :telehubobject, ""parcel_tile_ID"" = :ParcelImageID, ""cacheID"" = :cacheID
WHERE ""regionUUID"" = :regionUUID";
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
{
cmd.Parameters.AddRange(CreateRegionSettingParameters(regionSettings));
conn.Open();
cmd.ExecuteNonQuery();
Console.WriteLine(e);
command.Transaction.Rollback();
throw;
}
}
}
SaveSpawnPoints(regionSettings);
@ -977,39 +1000,6 @@ namespace OpenSim.Data.PGSQL
//Not used??
}
#region Private Methods
/// <summary>
/// Stores new regionsettings.
/// </summary>
/// <param name="regionSettings">The region settings.</param>
private void StoreNewRegionSettings(RegionSettings regionSettings)
{
string sql = @"INSERT INTO regionsettings
(""regionUUID"",block_terraform,block_fly,allow_damage,restrict_pushing,allow_land_resell,allow_land_join_divide,
block_show_in_search,agent_limit,object_bonus,maturity,disable_scripts,disable_collisions,disable_physics,
terrain_texture_1,terrain_texture_2,terrain_texture_3,terrain_texture_4,elevation_1_nw,elevation_2_nw,elevation_1_ne,
elevation_2_ne,elevation_1_se,elevation_2_se,elevation_1_sw,elevation_2_sw,water_height,terrain_raise_limit,
terrain_lower_limit,use_estate_sun,fixed_sun,sun_position,covenant,covenant_datetime,sunvectorx, sunvectory, sunvectorz,
""Sandbox"", loaded_creation_datetime, loaded_creation_id
)
VALUES
(:regionUUID,:block_terraform,:block_fly,:allow_damage,:restrict_pushing,:allow_land_resell,:allow_land_join_divide,
:block_show_in_search,:agent_limit,:object_bonus,:maturity,:disable_scripts,:disable_collisions,:disable_physics,
:terrain_texture_1,:terrain_texture_2,:terrain_texture_3,:terrain_texture_4,:elevation_1_nw,:elevation_2_nw,:elevation_1_ne,
:elevation_2_ne,:elevation_1_se,:elevation_2_se,:elevation_1_sw,:elevation_2_sw,:water_height,:terrain_raise_limit,
:terrain_lower_limit,:use_estate_sun,:fixed_sun,:sun_position,:covenant, :covenant_datetime, :sunvectorx,:sunvectory,
:sunvectorz, :Sandbox, :loaded_creation_datetime, :loaded_creation_id )";
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
{
cmd.Parameters.AddRange(CreateRegionSettingParameters(regionSettings));
conn.Open();
cmd.ExecuteNonQuery();
}
}
#region Private DataRecord conversion methods
/// <summary>
@ -1604,7 +1594,9 @@ namespace OpenSim.Data.PGSQL
_Database.CreateParameter("covenant_datetime", settings.CovenantChangedDateTime),
_Database.CreateParameter("Loaded_Creation_DateTime", settings.LoadedCreationDateTime),
_Database.CreateParameter("Loaded_Creation_ID", settings.LoadedCreationID),
_Database.CreateParameter("TerrainImageID", settings.TerrainImageID),
_Database.CreateParameter("map_tile_ID", settings.TerrainImageID),
_Database.CreateParameter("block_search", settings.GodBlockSearch),
_Database.CreateParameter("casino", settings.Casino),
_Database.CreateParameter("ParcelImageID", settings.ParcelImageID),
_Database.CreateParameter("TelehubObject", settings.TelehubObject),
_Database.CreateParameter("cacheID", settings.CacheID),
@ -1971,7 +1963,6 @@ namespace OpenSim.Data.PGSQL
#endregion
#endregion
private void LoadSpawnPoints(RegionSettings rs)
{
@ -1986,14 +1977,14 @@ namespace OpenSim.Data.PGSQL
conn.Open();
using (NpgsqlDataReader reader = cmd.ExecuteReader())
{
if (reader.Read())
while (reader.Read())
{
SpawnPoint sp = new SpawnPoint();
sp.Yaw = (float)reader["Yaw"];
sp.Pitch = (float)reader["Pitch"];
sp.Distance = (float)reader["Distance"];
var sp = new SpawnPoint
{
Yaw = Convert.ToSingle(reader["Yaw"]),
Pitch = Convert.ToSingle(reader["Pitch"]),
Distance = Convert.ToSingle(reader["Distance"])
};
rs.AddSpawnPoint(sp);
}
}
@ -2033,15 +2024,62 @@ namespace OpenSim.Data.PGSQL
public void SaveExtra(UUID regionID, string name, string value)
{
const string queryString = """
INSERT INTO regionextra ("RegionID", "Name", "value")
VALUES (:RegionID, :Name, :Value)
""";
using var connection = new NpgsqlConnection(m_connectionString);
connection.Open();
using var command = new NpgsqlCommand(queryString, connection, connection.BeginTransaction());
try
{
command.Parameters.AddWithValue("RegionID", regionID.ToString());
command.Parameters.AddWithValue("Name", name);
command.Parameters.AddWithValue("Value", value);
command.ExecuteNonQuery();
command.Transaction.Commit();
}
catch (Exception e)
{
Console.WriteLine(e);
command.Transaction.Rollback();
}
}
public void RemoveExtra(UUID regionID, string name)
{
const string queryString = """DELETE FROM regionextra WHERE "RegionID"=:RegionID AND "Name"=:Name""";
using var connection = new NpgsqlConnection(m_connectionString);
connection.Open();
using var command = new NpgsqlCommand(queryString, connection, connection.BeginTransaction());
try
{
command.Parameters.AddWithValue("RegionID", regionID.ToString());
command.Parameters.AddWithValue("Name", name);
command.ExecuteNonQuery();
command.Transaction.Commit();
}
catch (Exception e)
{
Console.WriteLine(e);
command.Transaction.Rollback();
}
}
public Dictionary<string, string> GetExtra(UUID regionID)
{
return null;
const string queryString = """SELECT * FROM regionextra WHERE "RegionID" = :RegionID""";
using NpgsqlConnection conn = new NpgsqlConnection(m_connectionString);
using NpgsqlCommand cmd = new NpgsqlCommand(queryString, conn);
cmd.Parameters.Add(_Database.CreateParameter("RegionID", regionID.ToString()));
conn.Open();
using NpgsqlDataReader reader = cmd.ExecuteReader();
Dictionary<string, string> extraSettings = new Dictionary<string, string>();
while (reader.Read())
{
extraSettings.Add(reader["Name"].ToString(), reader["value"].ToString());
}
return extraSettings;
}
}
}

View file

@ -0,0 +1,17 @@
:VERSION 1
BEGIN TRANSACTION;
CREATE TABLE IF NOT EXISTS MuteList (
"AgentID" varchar(36) NOT NULL,
"MuteId" varchar(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000',
"MuteName" varchar(64) NOT NULL DEFAULT '',
"MuteType" int4 NOT NULL DEFAULT 1,
"MuteFlags" int4 NOT NULL DEFAULT 0,
"Stamp" int4 NOT NULL,
CONSTRAINT pk_agent_id PRIMARY KEY ("AgentID"),
CONSTRAINT unique_agent_2 UNIQUE ("AgentID", "MuteId", "MuteName")
);
COMMIT;

View file

@ -1262,8 +1262,45 @@ COMMIT;
:VERSION 54 #----- add pbr terrain storage
BEGIN;
ALTER TABLE regionsettings ADD COLUMN "TerrainPBR1" uuid NOT NULL default '00000000-0000-0000-0000-000000000000';
ALTER TABLE regionsettings ADD COLUMN "TerrainPBR2" uuid NOT NULL default '00000000-0000-0000-0000-000000000000';
ALTER TABLE regionsettings ADD COLUMN "TerrainPBR3" uuid NOT NULL default '00000000-0000-0000-0000-000000000000';
ALTER TABLE regionsettings ADD COLUMN "TerrainPBR4" uuid NOT NULL default '00000000-0000-0000-0000-000000000000';
ALTER TABLE regionsettings ADD COLUMN "TerrainPBR1" uuid NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000';
ALTER TABLE regionsettings ADD COLUMN "TerrainPBR2" uuid NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000';
ALTER TABLE regionsettings ADD COLUMN "TerrainPBR3" uuid NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000';
ALTER TABLE regionsettings ADD COLUMN "TerrainPBR4" uuid NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000';
COMMIT;
:VERSION 55 #----- Fix data type for columns
BEGIN;
ALTER TABLE public.regionsettings ALTER COLUMN "block_search" DROP DEFAULT;
ALTER TABLE public.regionsettings ALTER COLUMN "casino" DROP DEFAULT;
ALTER TABLE public.regionsettings
ALTER COLUMN "block_search" TYPE BOOLEAN
USING CASE WHEN "block_search" = 0 THEN FALSE
WHEN "block_search" = 1 THEN TRUE
ELSE NULL
END;
ALTER TABLE public.regionsettings
ALTER COLUMN "casino" TYPE BOOLEAN
USING CASE WHEN "casino" = 0 THEN FALSE
WHEN "casino" = 1 THEN TRUE
ELSE NULL
END;
COMMIT;
:VERSION 56 #----- Fix the constraints on the spawn points
BEGIN;
ALTER TABLE spawn_points DROP CONSTRAINT spawn_points_pkey;
ALTER TABLE spawn_points ADD CONSTRAINT spawn_points_pkey
PRIMARY KEY ("RegionUUID", "Yaw", "Pitch", "Distance");
COMMIT;
:VERSION 57 #----- Adding a table missing from the PgSQL adapter
BEGIN;
CREATE TABLE "regionextra"
(
"RegionID" char(36),
"Name" varchar(32),
"value" text,
PRIMARY KEY ("RegionID", "Name")
);
COMMIT;

View file

@ -78,6 +78,7 @@ namespace OpenSim.Framework
public bool NeedsCameraCollision;
public uint lastpacketSequence;
public double lastUpdateTS;
public double lastMoveUpdateTS;
public AgentUpdateArgs()
{

View file

@ -150,7 +150,7 @@ namespace OpenSim.Framework.Serialization.External
settings.TerrainPBR3 = UUID.Parse(xtr.ReadElementContentAsString());
break;
case "PBR4":
settings.TerrainPBR3 = UUID.Parse(xtr.ReadElementContentAsString());
settings.TerrainPBR4 = UUID.Parse(xtr.ReadElementContentAsString());
break;
case "ElevationLowSW":
settings.Elevation1SW = double.Parse(xtr.ReadElementContentAsString(), Culture.NumberFormatInfo);

View file

@ -1003,6 +1003,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
// reset agent update args
m_thisAgentUpdateArgs.CameraAtAxis.X = float.MinValue;
m_thisAgentUpdateArgs.lastUpdateTS = 0;
m_thisAgentUpdateArgs.lastMoveUpdateTS = 0;
m_thisAgentUpdateArgs.ControlFlags = 0;
UDPPacketBuffer buf = OpenSimUDPBase.GetNewUDPBuffer(m_udpClient.RemoteEndPoint);
@ -8500,28 +8501,21 @@ namespace OpenSim.Region.ClientStack.LindenUDP
// Threshold for camera rotation to be a significant agent update
private const float VDELTA = 0.01f;
/// <summary>
/// This checks the update significance against the last update made.
/// </summary>
/// <remarks>Can only be called by one thread at a time</remarks>
/// <returns></returns>
/// <param name='x'></param>
public bool CheckAgentUpdateSignificance(AgentUpdatePacket.AgentDataBlock x)
{
return CheckAgentMovementUpdateSignificance(x) || CheckAgentCameraUpdateSignificance(x);
}
/// <summary>
/// This checks the movement/state update significance against the last update made.
/// </summary>
/// <remarks>Can only be called by one thread at a time</remarks>
/// <returns></returns>
/// <param name='x'></param>
private bool CheckAgentMovementUpdateSignificance(AgentUpdatePacket.AgentDataBlock x)
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private bool CheckAgentMovementUpdateSignificance(AgentUpdatePacket.AgentDataBlock x, double now)
{
if(
if((x.ControlFlags & ~(uint)AgentManager.ControlFlags.AGENT_CONTROL_FINISH_ANIM) != (uint)AgentManager.ControlFlags.NONE &&
now > m_thisAgentUpdateArgs.lastMoveUpdateTS + 20)
return true;
if (
(x.ControlFlags != m_thisAgentUpdateArgs.ControlFlags) // significant if control flags changed
|| (x.ControlFlags & ~(uint)AgentManager.ControlFlags.AGENT_CONTROL_FINISH_ANIM) != (uint)AgentManager.ControlFlags.NONE
|| (x.Flags != m_thisAgentUpdateArgs.Flags) // significant if Flags changed
|| (x.State != m_thisAgentUpdateArgs.State) // significant if Stats changed
|| (MathF.Abs(x.Far - m_thisAgentUpdateArgs.Far) >= 32f) // significant if far distance changed
@ -8538,6 +8532,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
/// <remarks>Can only be called by one thread at a time</remarks>
/// <returns></returns>
/// <param name='x'></param>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private bool CheckAgentCameraUpdateSignificance(AgentUpdatePacket.AgentDataBlock x)
{
return (MathF.Abs(x.CameraCenter.X - m_thisAgentUpdateArgs.CameraCenter.X) > VDELTA ||
@ -8575,26 +8570,28 @@ namespace OpenSim.Region.ClientStack.LindenUDP
c.m_thisAgentUpdateArgs.lastpacketSequence = seq;
c.OnPreAgentUpdate?.Invoke(c, c.m_thisAgentUpdateArgs);
bool movement;
bool camera;
double now = Util.GetTimeStampMS();
if(now - c.m_thisAgentUpdateArgs.lastUpdateTS > 500.0) // at least 2 per sec
if (now - c.m_thisAgentUpdateArgs.lastUpdateTS > 500.0) // at least 2 per sec
{
movement = true;
camera = true;
}
else
{
movement = c.CheckAgentMovementUpdateSignificance(x);
movement = c.CheckAgentMovementUpdateSignificance(x, now);
camera = c.CheckAgentCameraUpdateSignificance(x);
}
c.OnPreAgentUpdate?.Invoke(c, c.m_thisAgentUpdateArgs);
// Was there a significant movement/state change?
if (movement)
{
c.m_thisAgentUpdateArgs.lastMoveUpdateTS = now;
c.m_thisAgentUpdateArgs.BodyRotation = x.BodyRotation;
c.m_thisAgentUpdateArgs.ControlFlags = x.ControlFlags;
c.m_thisAgentUpdateArgs.Far = x.Far;

View file

@ -541,7 +541,7 @@ namespace OpenSim.Region.CoreModules.World.Estate
if (texture.IsZero())
return;
if((remoteClient.ViewerFlags & ViewerFlags.TPBR) != 0)
if(remoteClient is not null && (remoteClient.ViewerFlags & ViewerFlags.TPBR) != 0)
{
switch (level)
{

View file

@ -267,7 +267,7 @@ namespace OpenSim.Region.Framework.Scenes
return UUID.Zero;
}
if (item.OwnerID.NotEqual(avatarId))
if (!Permissions.CanEditObjectInventory(objectID, avatarId))
return UUID.Zero;
InventoryType itemType = (InventoryType)item.InvType;

View file

@ -5157,6 +5157,8 @@ namespace OpenSim.Region.Framework.Scenes
if (engines.Length == 0) // No engine at all
return 0.0f;
try
{
float time = 0.0f;
// get all the scripts in all parts
@ -5164,8 +5166,11 @@ namespace OpenSim.Region.Framework.Scenes
List<TaskInventoryItem> scripts = new();
for (int i = 0; i < parts.Length; i++)
{
IEntityInventory inv = parts[i].Inventory;
if (inv is not null)
scripts.AddRange(parts[i].Inventory.GetInventoryItems(InventoryType.LSL));
}
// extract the UUIDs
HashSet<UUID> unique = new();
foreach (TaskInventoryItem script in scripts)
@ -5183,6 +5188,11 @@ namespace OpenSim.Region.Framework.Scenes
}
return time;
}
catch
{
return 0.0f;
}
}
public bool ScriptsMemory(out int memory)
{
@ -5191,12 +5201,16 @@ namespace OpenSim.Region.Framework.Scenes
if (engines.Length == 0) // No engine at all
return false;
try
{
// get all the scripts in all parts
SceneObjectPart[] parts = m_parts.GetArray();
List<TaskInventoryItem> scripts = new();
for (int i = 0; i < parts.Length; i++)
{
scripts.AddRange(parts[i].Inventory.GetInventoryItems(InventoryType.LSL));
IEntityInventory inv = parts[i].Inventory;
if(inv is not null)
scripts.AddRange(inv.GetInventoryItems(InventoryType.LSL));
}
if (scripts.Count == 0)
@ -5217,6 +5231,12 @@ namespace OpenSim.Region.Framework.Scenes
}
}
return true;
}
catch
{
return false;
}
}
/// <summary>

View file

@ -14993,6 +14993,33 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
return tid.ToString();
}
public LSL_String llGetNotecardLineSync(string name, int line)
{
if (line < 0)
return ScriptBaseClass.NAK;
if (!UUID.TryParse(name, out UUID assetID))
{
TaskInventoryItem item = m_host.Inventory.GetInventoryItem(name, 7);
if (item is null)
{
Error("llGetNotecardLineSync", "Can't find notecard '" + name + "'");
return ScriptBaseClass.NAK;
}
assetID = item.AssetID;
}
if (NotecardCache.IsCached(assetID))
{
return NotecardCache.GetllLine(assetID, line, 1024);
}
else
{
return ScriptBaseClass.NAK;
}
}
public LSL_Key llGetNotecardLine(string name, int line)
{
if (!UUID.TryParse(name, out UUID assetID))
@ -18832,6 +18859,37 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
return 0;
}
public LSL_Integer llDerezObject(LSL_Key objectUUID, LSL_Integer flag)
{
if (!UUID.TryParse(objectUUID, out UUID objUUID))
return new LSL_Integer(0);
if (objUUID.IsZero())
return new LSL_Integer(0);
SceneObjectGroup sceneOG = World.GetSceneObjectGroup(objUUID);
if (sceneOG is null || sceneOG.IsDeleted || sceneOG.IsAttachment)
return new LSL_Integer(0);
if (sceneOG.OwnerID.NotEqual(m_host.OwnerID))
return new LSL_Integer(0);
// restrict to objects rezzed by host
if (sceneOG.RezzerID.NotEqual(m_host.ParentGroup.UUID))
return new LSL_Integer(0);
if (sceneOG.UUID.Equals(m_host.ParentGroup.UUID))
return new LSL_Integer(0);
if (flag.value == 0)
World.DeleteSceneObject(sceneOG, false);
else
sceneOG.RootPart.AddFlag(PrimFlags.TemporaryOnRez);
return new LSL_Integer(1);
}
}
public class NotecardCache
@ -18875,6 +18933,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
return "";
}
public static string GetllLine(UUID assetID, int lineNumber, int maxLength)
{
if (m_Notecards.TryGetValue(assetID, 30000, out string[] text))
{
if (lineNumber >= text.Length)
return "\n\n\n";
return text[lineNumber].Length < maxLength ? text[lineNumber] : text[lineNumber][..maxLength];
}
return ScriptBaseClass.NAK;
}
/// <summary>
/// Get a notecard line.
/// </summary>

View file

@ -176,6 +176,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
void llGetNextEmail(string address, string subject);
LSL_Key llGetNotecardLine(string name, int line);
LSL_Key llGetNumberOfNotecardLines(string name);
LSL_String llGetNotecardLineSync(string name, int line);
LSL_Integer llGetNumberOfPrims();
LSL_Integer llGetNumberOfSides();
LSL_String llGetObjectDesc();
@ -522,5 +523,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
LSL_Integer llLinksetDataDeleteProtected(LSL_String name, LSL_String pass);
LSL_Integer llIsFriend(LSL_Key agent_id);
LSL_Integer llDerezObject(LSL_Key objectUUID, LSL_Integer flag);
}
}

View file

@ -609,6 +609,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
public const string NULL_KEY = "00000000-0000-0000-0000-000000000000";
public const string EOF = "\n\n\n";
public const string NAK = "\n\u0015\n";
public const double PI = 3.14159274f;
public const double TWO_PI = 6.28318548f;
public const double PI_BY_TWO = 1.57079637f;

View file

@ -758,6 +758,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
return m_LSL_Functions.llGetNumberOfNotecardLines(name);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public LSL_String llGetNotecardLineSync(string name, int line)
{
return m_LSL_Functions.llGetNotecardLineSync(name, line);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public LSL_Integer llGetNumberOfPrims()
{
@ -2802,5 +2808,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
{
return m_LSL_Functions.llIsFriend(agent_id);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public LSL_Integer llDerezObject(LSL_Key objectUUID, LSL_Integer flag)
{
return m_LSL_Functions.llDerezObject(objectUUID, flag);
}
}
}

View file

@ -396,10 +396,10 @@ namespace OpenSim.Region.ScriptEngine.Yengine
e = StartEventHandler(evc, evt.Params);
}
//m_RunOnePhase = "done running";
m_CPUTime += DateTime.UtcNow.Subtract(now).TotalMilliseconds;
m_CPUTime += Util.GetTimeStampMS() - m_SliceStart;
// Maybe it puqued.
if(e is not null)
if (e is not null)
{
//m_RunOnePhase = "handling exception " + e.Message;
HandleScriptException(e);

View file

@ -10,10 +10,6 @@
<HintPath>..\..\..\bin\Nini.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="Npgsql">
<HintPath>..\..\..\bin\Npgsql.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="OpenMetaverse">
<HintPath>..\..\..\bin\OpenMetaverse.dll</HintPath>
<Private>False</Private>
@ -63,5 +59,6 @@
<PackageReference Include="Mono.Addins" Version="1.4.1" />
<PackageReference Include="Mono.Addins.CecilReflector" Version="1.4.1" />
<PackageReference Include="MySqlConnector" Version="2.2.6" />
<PackageReference Include="Npgsql" Version="8.0.3" />
</ItemGroup>
</Project>

Binary file not shown.

View file

@ -1,4 +1,4 @@
9a2d5a5e-484a-40b0-82bc-092443b08ff7
4782a83e-4ec0-2ed4-2d2a-c59df5a3ccf0
<llsd><map><key>llsd-lsl-syntax-version</key><integer>2</integer>
<key>controls</key>
<map>
@ -1739,7 +1739,7 @@
</map>
<key>OS_APIVERSION</key><map>
<key>type</key><string>integer</string>
<key>value</key><string>22</string>
<key>value</key><string>23</string>
</map>
<key>OS_ATTACH_MSG_ALL</key><map>
<key>type</key><string>integer</string>
@ -3710,6 +3710,7 @@
<key>arguments</key><array>
<map><key>val</key><map><key>type</key><string>integer</string></map></map>
</array>
<key>tooltip</key><string>Returns absolute version as val (ie as postive value)</string>
</map>
<key>llAcos</key>
<map>
@ -3717,6 +3718,7 @@
<key>arguments</key><array>
<map><key>val</key><map><key>type</key><string>float</string></map></map>
</array>
<key>tooltip</key><string>Returns cosine of val (val in radians)</string>
</map>
<key>llAddToLandBanList</key>
<map>
@ -3775,14 +3777,16 @@
<key>arguments</key><array>
<map><key>val</key><map><key>type</key><string>float</string></map></map>
</array>
<key>tooltip</key><string>Returns sine of val (val in radians)</string>
</map>
<key>llAtan2</key>
<map>
<key>return</key><string>float</string>
<key>arguments</key><array>
<map><key>x</key><map><key>type</key><string>float</string></map></map>
<map><key>y</key><map><key>type</key><string>float</string></map></map>
<map><key>x</key><map><key>type</key><string>float</string></map></map>
</array>
<key>tooltip</key><string>Returns the angle whose tangent is the y/x</string>
</map>
<key>llAttachToAvatar</key>
<map>
@ -3968,6 +3972,14 @@
<map><key>end</key><map><key>type</key><string>integer</string></map></map>
</array>
</map>
<key>llDerezObject</key>
<map>
<key>return</key><string>integer</string>
<key>arguments</key><array>
<map><key>objectUUID</key><map><key>type</key><string>key</string></map></map>
<map><key>flag</key><map><key>type</key><string>integer</string></map></map>
</array>
</map>
<key>llDetachFromAvatar</key>
<map>
<key>arguments</key><undef/>
@ -4260,6 +4272,16 @@
<map><key>obj</key><map><key>type</key><string>string</string></map></map>
</array>
</map>
<key>llGetCameraAspect</key>
<map>
<key>return</key><string>float</string>
<key>arguments</key><undef/>
</map>
<key>llGetCameraFOV</key>
<map>
<key>return</key><string>float</string>
<key>arguments</key><undef/>
</map>
<key>llGetCameraPos</key>
<map>
<key>return</key><string>vector</string>
@ -5104,7 +5126,6 @@
<map><key>linknumber</key><map><key>type</key><string>integer</string></map></map>
<map><key>sound</key><map><key>type</key><string>string</string></map></map>
<map><key>volume</key><map><key>type</key><string>float</string></map></map>
<map><key>flags</key><map><key>type</key><string>integer</string></map></map>
</array>
</map>
<key>llLinkPlaySound</key>
@ -5113,6 +5134,7 @@
<map><key>linknumber</key><map><key>type</key><string>integer</string></map></map>
<map><key>sound</key><map><key>type</key><string>string</string></map></map>
<map><key>volume</key><map><key>type</key><string>float</string></map></map>
<map><key>flags</key><map><key>type</key><string>integer</string></map></map>
</array>
</map>
<key>llLinksetDataAvailable</key>
@ -7103,6 +7125,40 @@
<map><key>volume</key><map><key>type</key><string>float</string></map></map>
</array>
</map>
<key>osAESDecrypt</key>
<map>
<key>return</key><string>string</string>
<key>arguments</key><array>
<map><key>secret</key><map><key>type</key><string>string</string></map></map>
<map><key>encryptedText</key><map><key>type</key><string>string</string></map></map>
</array>
</map>
<key>osAESDecryptFrom</key>
<map>
<key>return</key><string>string</string>
<key>arguments</key><array>
<map><key>secret</key><map><key>type</key><string>string</string></map></map>
<map><key>encryptedText</key><map><key>type</key><string>string</string></map></map>
<map><key>ivString</key><map><key>type</key><string>string</string></map></map>
</array>
</map>
<key>osAESEncrypt</key>
<map>
<key>return</key><string>string</string>
<key>arguments</key><array>
<map><key>secret</key><map><key>type</key><string>string</string></map></map>
<map><key>plainText</key><map><key>type</key><string>string</string></map></map>
</array>
</map>
<key>osAESEncryptTo</key>
<map>
<key>return</key><string>string</string>
<key>arguments</key><array>
<map><key>secret</key><map><key>type</key><string>string</string></map></map>
<map><key>plainText</key><map><key>type</key><string>string</string></map></map>
<map><key>ivString</key><map><key>type</key><string>string</string></map></map>
</array>
</map>
<key>osAgentSaveAppearance</key>
<map>
<key>return</key><string>key</string>
@ -7129,15 +7185,6 @@
</array>
</map>
<key>osApproxEquals</key>
<map>
<key>return</key><string>integer</string>
<key>arguments</key><array>
<map><key>ra</key><map><key>type</key><string>rotation</string></map></map>
<map><key>rb</key><map><key>type</key><string>rotation</string></map></map>
<map><key>margin</key><map><key>type</key><string>float</string></map></map>
</array>
</map>
<key>osApproxEquals</key>
<map>
<key>return</key><string>integer</string>
<key>arguments</key><array>
@ -7147,11 +7194,29 @@
</array>
</map>
<key>osApproxEquals</key>
<map>
<key>return</key><string>integer</string>
<key>arguments</key><array>
<map><key>ra</key><map><key>type</key><string>rotation</string></map></map>
<map><key>rb</key><map><key>type</key><string>rotation</string></map></map>
<map><key>margin</key><map><key>type</key><string>float</string></map></map>
</array>
</map>
<key>osApproxEquals</key>
<map>
<key>return</key><string>integer</string>
<key>arguments</key><array>
<map><key>ra</key><map><key>type</key><string>rotation</string></map></map>
<map><key>rb</key><map><key>type</key><string>rotation</string></map></map>
</array>
</map>
<key>osApproxEquals</key>
<map>
<key>return</key><string>integer</string>
<key>arguments</key><array>
<map><key>va</key><map><key>type</key><string>vector</string></map></map>
<map><key>vb</key><map><key>type</key><string>vector</string></map></map>
<map><key>margin</key><map><key>type</key><string>float</string></map></map>
</array>
</map>
<key>osApproxEquals</key>
@ -7168,15 +7233,6 @@
<key>arguments</key><array>
<map><key>va</key><map><key>type</key><string>vector</string></map></map>
<map><key>vb</key><map><key>type</key><string>vector</string></map></map>
<map><key>margin</key><map><key>type</key><string>float</string></map></map>
</array>
</map>
<key>osApproxEquals</key>
<map>
<key>return</key><string>integer</string>
<key>arguments</key><array>
<map><key>ra</key><map><key>type</key><string>rotation</string></map></map>
<map><key>rb</key><map><key>type</key><string>rotation</string></map></map>
</array>
</map>
<key>osAvatarName2Key</key>
@ -7205,15 +7261,15 @@
<map>
<key>return</key><string>integer</string>
<key>arguments</key><array>
<map><key>sFirstName</key><map><key>type</key><string>string</string></map></map>
<map><key>sLastName</key><map><key>type</key><string>string</string></map></map>
<map><key>avkey</key><map><key>type</key><string>key</string></map></map>
</array>
</map>
<key>osAvatarType</key>
<map>
<key>return</key><string>integer</string>
<key>arguments</key><array>
<map><key>avkey</key><map><key>type</key><string>key</string></map></map>
<map><key>sFirstName</key><map><key>type</key><string>string</string></map></map>
<map><key>sLastName</key><map><key>type</key><string>string</string></map></map>
</array>
</map>
<key>osCauseDamage</key>
@ -7322,6 +7378,8 @@
<key>return</key><string>string</string>
<key>arguments</key><array>
<map><key>drawList</key><map><key>type</key><string>string</string></map></map>
<map><key>startX</key><map><key>type</key><string>integer</string></map></map>
<map><key>startY</key><map><key>type</key><string>integer</string></map></map>
<map><key>endX</key><map><key>type</key><string>integer</string></map></map>
<map><key>endY</key><map><key>type</key><string>integer</string></map></map>
</array>
@ -7331,8 +7389,6 @@
<key>return</key><string>string</string>
<key>arguments</key><array>
<map><key>drawList</key><map><key>type</key><string>string</string></map></map>
<map><key>startX</key><map><key>type</key><string>integer</string></map></map>
<map><key>startY</key><map><key>type</key><string>integer</string></map></map>
<map><key>endX</key><map><key>type</key><string>integer</string></map></map>
<map><key>endY</key><map><key>type</key><string>integer</string></map></map>
</array>
@ -7623,14 +7679,6 @@
<map><key>itemNameOrId</key><map><key>type</key><string>string</string></map></map>
</array>
</map>
<key>osGetLinkInventoryDesc</key>
<map>
<key>return</key><string>string</string>
<key>arguments</key><array>
<map><key>linkNumber</key><map><key>type</key><string>integer</string></map></map>
<map><key>itemNameOrId</key><map><key>type</key><string>string</string></map></map>
</array>
</map>
<key>osGetInventoryItemKey</key>
<map>
<key>return</key><string>key</string>
@ -7638,23 +7686,6 @@
<map><key>name</key><map><key>type</key><string>string</string></map></map>
</array>
</map>
<key>osGetLinkInventoryAssetKey</key>
<map>
<key>return</key><string>key</string>
<key>arguments</key><array>
<map><key>linkNumber</key><map><key>type</key><string>integer</string></map></map>
<map><key>name</key><map><key>type</key><string>string</string></map></map>
<map><key>type</key><map><key>type</key><string>integer</string></map></map>
</array>
</map>
<key>osGetLinkInventoryItemKey</key>
<map>
<key>return</key><string>key</string>
<key>arguments</key><array>
<map><key>linkNumber</key><map><key>type</key><string>integer</string></map></map>
<map><key>name</key><map><key>type</key><string>string</string></map></map>
</array>
</map>
<key>osGetInventoryItemKeys</key>
<map>
<key>return</key><string>list</string>
@ -7683,6 +7714,52 @@
<map><key>type</key><map><key>type</key><string>integer</string></map></map>
</array>
</map>
<key>osGetLastChangedEventKey</key>
<map>
<key>return</key><string>key</string>
<key>arguments</key><undef/>
</map>
<key>osGetLinkColor</key>
<map>
<key>return</key><string>vector</string>
<key>arguments</key><array>
<map><key>linknum</key><map><key>type</key><string>integer</string></map></map>
<map><key>face</key><map><key>type</key><string>integer</string></map></map>
</array>
</map>
<key>osGetLinkInventoryDesc</key>
<map>
<key>return</key><string>string</string>
<key>arguments</key><array>
<map><key>linkNumber</key><map><key>type</key><string>integer</string></map></map>
<map><key>itemNameorid</key><map><key>type</key><string>string</string></map></map>
</array>
</map>
<key>osGetLinkInventoryItemKey</key>
<map>
<key>return</key><string>key</string>
<key>arguments</key><array>
<map><key>linkNumber</key><map><key>type</key><string>integer</string></map></map>
<map><key>name</key><map><key>type</key><string>string</string></map></map>
</array>
</map>
<key>osGetLinkInventoryItemKeys</key>
<map>
<key>return</key><string>list</string>
<key>arguments</key><array>
<map><key>linkNumber</key><map><key>type</key><string>integer</string></map></map>
<map><key>type</key><map><key>type</key><string>integer</string></map></map>
</array>
</map>
<key>osGetLinkInventoryKey</key>
<map>
<key>return</key><string>key</string>
<key>arguments</key><array>
<map><key>linkNumber</key><map><key>type</key><string>integer</string></map></map>
<map><key>name</key><map><key>type</key><string>string</string></map></map>
<map><key>type</key><map><key>type</key><string>integer</string></map></map>
</array>
</map>
<key>osGetLinkInventoryName</key>
<map>
<key>return</key><string>string</string>
@ -7699,43 +7776,6 @@
<map><key>type</key><map><key>type</key><string>integer</string></map></map>
</array>
</map>
<key>osGetLinkInventoryItemKeys</key>
<map>
<key>return</key><string>list</string>
<key>arguments</key><array>
<map><key>linkNumber</key><map><key>type</key><string>integer</string></map></map>
<map><key>type</key><map><key>type</key><string>integer</string></map></map>
</array>
</map>
<key>osRemoveLinkInventory</key>
<map>
<key>arguments</key><array>
<map><key>linkNumber</key><map><key>type</key><string>integer</string></map></map>
<map><key>name</key><map><key>type</key><string>integer</string></map></map>
</array>
</map>
<key>osGiveLinkInventory</key>
<map>
<key>arguments</key><array>
<map><key>linkNumber</key><map><key>type</key><string>integer</string></map></map>
<map><key>destination</key><map><key>type</key><string>key</string></map></map>
<map><key>inventory</key><map><key>type</key><string>string</string></map></map>
</array>
</map>
<key>osGiveLinkInventoryList</key>
<map>
<key>arguments</key><array>
<map><key>linkNumber</key><map><key>type</key><string>integer</string></map></map>
<map><key>destination</key><map><key>type</key><string>key</string></map></map>
<map><key>category</key><map><key>type</key><string>string</string></map></map>
<map><key>inventory</key><map><key>type</key><string>string</string></map></map>
</array>
</map>
<key>osGetLastChangedEventKey</key>
<map>
<key>return</key><string>key</string>
<key>arguments</key><undef/>
</map>
<key>osGetLinkNumber</key>
<map>
<key>return</key><string>integer</string>
@ -7843,14 +7883,14 @@
<key>osGetPrimCount</key>
<map>
<key>return</key><string>integer</string>
<key>arguments</key><undef/>
<key>arguments</key><array>
<map><key>object_id</key><map><key>type</key><string>key</string></map></map>
</array>
</map>
<key>osGetPrimCount</key>
<map>
<key>return</key><string>integer</string>
<key>arguments</key><array>
<map><key>object_id</key><map><key>type</key><string>key</string></map></map>
</array>
<key>arguments</key><undef/>
</map>
<key>osGetPrimitiveParams</key>
<map>
@ -7925,14 +7965,14 @@
<key>osGetSittingAvatarsCount</key>
<map>
<key>return</key><string>integer</string>
<key>arguments</key><array>
<map><key>object_id</key><map><key>type</key><string>key</string></map></map>
</array>
<key>arguments</key><undef/>
</map>
<key>osGetSittingAvatarsCount</key>
<map>
<key>return</key><string>integer</string>
<key>arguments</key><undef/>
<key>arguments</key><array>
<map><key>object_id</key><map><key>type</key><string>key</string></map></map>
</array>
</map>
<key>osGetStandTarget</key>
<map>
@ -7962,6 +8002,23 @@
<map><key>param</key><map><key>type</key><string>string</string></map></map>
</array>
</map>
<key>osGiveLinkInventory</key>
<map>
<key>arguments</key><array>
<map><key>linkNumber</key><map><key>type</key><string>integer</string></map></map>
<map><key>destination</key><map><key>type</key><string>key</string></map></map>
<map><key>inventory</key><map><key>type</key><string>string</string></map></map>
</array>
</map>
<key>osGiveLinkInventoryList</key>
<map>
<key>arguments</key><array>
<map><key>linkNumber</key><map><key>type</key><string>integer</string></map></map>
<map><key>destination</key><map><key>type</key><string>key</string></map></map>
<map><key>category</key><map><key>type</key><string>string</string></map></map>
<map><key>inventory</key><map><key>type</key><string>list</string></map></map>
</array>
</map>
<key>osInviteToGroup</key>
<map>
<key>return</key><string>integer</string>
@ -8157,7 +8214,6 @@
<map><key>name</key><map><key>type</key><string>string</string></map></map>
<map><key>position</key><map><key>type</key><string>vector</string></map></map>
<map><key>notecard</key><map><key>type</key><string>string</string></map></map>
<map><key>options</key><map><key>type</key><string>integer</string></map></map>
</array>
</map>
<key>osNpcCreate</key>
@ -8168,6 +8224,7 @@
<map><key>name</key><map><key>type</key><string>string</string></map></map>
<map><key>position</key><map><key>type</key><string>vector</string></map></map>
<map><key>notecard</key><map><key>type</key><string>string</string></map></map>
<map><key>options</key><map><key>type</key><string>integer</string></map></map>
</array>
</map>
<key>osNpcGetOwner</key>
@ -8242,6 +8299,7 @@
<key>arguments</key><array>
<map><key>npc</key><map><key>type</key><string>key</string></map></map>
<map><key>notecard</key><map><key>type</key><string>string</string></map></map>
<map><key>includeHuds</key><map><key>type</key><string>integer</string></map></map>
</array>
</map>
<key>osNpcSaveAppearance</key>
@ -8250,14 +8308,12 @@
<key>arguments</key><array>
<map><key>npc</key><map><key>type</key><string>key</string></map></map>
<map><key>notecard</key><map><key>type</key><string>string</string></map></map>
<map><key>includeHuds</key><map><key>type</key><string>integer</string></map></map>
</array>
</map>
<key>osNpcSay</key>
<map>
<key>arguments</key><array>
<map><key>npc</key><map><key>type</key><string>key</string></map></map>
<map><key>channel</key><map><key>type</key><string>integer</string></map></map>
<map><key>message</key><map><key>type</key><string>string</string></map></map>
</array>
</map>
@ -8265,6 +8321,7 @@
<map>
<key>arguments</key><array>
<map><key>npc</key><map><key>type</key><string>key</string></map></map>
<map><key>channel</key><map><key>type</key><string>integer</string></map></map>
<map><key>message</key><map><key>type</key><string>string</string></map></map>
</array>
</map>
@ -8435,13 +8492,21 @@
<key>osRegionNotice</key>
<map>
<key>arguments</key><array>
<map><key>agentID</key><map><key>type</key><string>key</string></map></map>
<map><key>msg</key><map><key>type</key><string>string</string></map></map>
</array>
</map>
<key>osRegionNotice</key>
<map>
<key>arguments</key><array>
<map><key>agentID</key><map><key>type</key><string>key</string></map></map>
<map><key>msg</key><map><key>type</key><string>string</string></map></map>
</array>
</map>
<key>osRegionRestart</key>
<map>
<key>return</key><string>integer</string>
<key>arguments</key><array>
<map><key>seconds</key><map><key>type</key><string>float</string></map></map>
<map><key>msg</key><map><key>type</key><string>string</string></map></map>
</array>
</map>
@ -8452,12 +8517,11 @@
<map><key>seconds</key><map><key>type</key><string>float</string></map></map>
</array>
</map>
<key>osRegionRestart</key>
<key>osRemoveLinkInventory</key>
<map>
<key>return</key><string>integer</string>
<key>arguments</key><array>
<map><key>seconds</key><map><key>type</key><string>float</string></map></map>
<map><key>msg</key><map><key>type</key><string>string</string></map></map>
<map><key>linkNumber</key><map><key>type</key><string>integer</string></map></map>
<map><key>name</key><map><key>type</key><string>string</string></map></map>
</array>
</map>
<key>osReplaceAgentEnvironment</key>
@ -8697,7 +8761,7 @@
<key>return</key><string>string</string>
<key>arguments</key><array>
<map><key>drawList</key><map><key>type</key><string>string</string></map></map>
<map><key>color</key><map><key>type</key><string>vector</string></map></map>
<map><key>color</key><map><key>type</key><string>string</string></map></map>
</array>
</map>
<key>osSetPenColor</key>
@ -8705,7 +8769,7 @@
<key>return</key><string>string</string>
<key>arguments</key><array>
<map><key>drawList</key><map><key>type</key><string>string</string></map></map>
<map><key>color</key><map><key>type</key><string>string</string></map></map>
<map><key>color</key><map><key>type</key><string>vector</string></map></map>
</array>
</map>
<key>osSetPenColor</key>
@ -8747,17 +8811,6 @@
</array>
</map>
<key>osSetProjectionParams</key>
<map>
<key>arguments</key><array>
<map><key>linknumber</key><map><key>type</key><string>integer</string></map></map>
<map><key>projection</key><map><key>type</key><string>integer</string></map></map>
<map><key>texture</key><map><key>type</key><string>key</string></map></map>
<map><key>fov</key><map><key>type</key><string>float</string></map></map>
<map><key>focus</key><map><key>type</key><string>float</string></map></map>
<map><key>amb</key><map><key>type</key><string>float</string></map></map>
</array>
</map>
<key>osSetProjectionParams</key>
<map>
<key>arguments</key><array>
<map><key>projection</key><map><key>type</key><string>integer</string></map></map>
@ -8778,6 +8831,17 @@
<map><key>amb</key><map><key>type</key><string>float</string></map></map>
</array>
</map>
<key>osSetProjectionParams</key>
<map>
<key>arguments</key><array>
<map><key>linknumber</key><map><key>type</key><string>integer</string></map></map>
<map><key>projection</key><map><key>type</key><string>integer</string></map></map>
<map><key>texture</key><map><key>type</key><string>key</string></map></map>
<map><key>fov</key><map><key>type</key><string>float</string></map></map>
<map><key>focus</key><map><key>type</key><string>float</string></map></map>
<map><key>amb</key><map><key>type</key><string>float</string></map></map>
</array>
</map>
<key>osSetRegionSunSettings</key>
<map>
<key>arguments</key><array>
@ -8923,6 +8987,8 @@
<key>arguments</key><array>
<map><key>src</key><map><key>type</key><string>string</string></map></map>
<map><key>value</key><map><key>type</key><string>string</string></map></map>
<map><key>start</key><map><key>type</key><string>integer</string></map></map>
<map><key>count</key><map><key>type</key><string>integer</string></map></map>
<map><key>ignorecase</key><map><key>type</key><string>integer</string></map></map>
</array>
</map>
@ -8932,8 +8998,6 @@
<key>arguments</key><array>
<map><key>src</key><map><key>type</key><string>string</string></map></map>
<map><key>value</key><map><key>type</key><string>string</string></map></map>
<map><key>start</key><map><key>type</key><string>integer</string></map></map>
<map><key>count</key><map><key>type</key><string>integer</string></map></map>
<map><key>ignorecase</key><map><key>type</key><string>integer</string></map></map>
</array>
</map>
@ -8970,6 +9034,7 @@
<key>arguments</key><array>
<map><key>src</key><map><key>type</key><string>string</string></map></map>
<map><key>start</key><map><key>type</key><string>integer</string></map></map>
<map><key>length</key><map><key>type</key><string>integer</string></map></map>
</array>
</map>
<key>osStringSubString</key>
@ -8978,7 +9043,6 @@
<key>arguments</key><array>
<map><key>src</key><map><key>type</key><string>string</string></map></map>
<map><key>start</key><map><key>type</key><string>integer</string></map></map>
<map><key>length</key><map><key>type</key><string>integer</string></map></map>
</array>
</map>
<key>osSunGetParam</key>
@ -8999,7 +9063,6 @@
<map>
<key>arguments</key><array>
<map><key>agent</key><map><key>type</key><string>string</string></map></map>
<map><key>regionName</key><map><key>type</key><string>string</string></map></map>
<map><key>position</key><map><key>type</key><string>vector</string></map></map>
<map><key>lookat</key><map><key>type</key><string>vector</string></map></map>
</array>
@ -9018,6 +9081,7 @@
<map>
<key>arguments</key><array>
<map><key>agent</key><map><key>type</key><string>string</string></map></map>
<map><key>regionName</key><map><key>type</key><string>string</string></map></map>
<map><key>position</key><map><key>type</key><string>vector</string></map></map>
<map><key>lookat</key><map><key>type</key><string>vector</string></map></map>
</array>
@ -9033,6 +9097,14 @@
</array>
</map>
<key>osTeleportOwner</key>
<map>
<key>arguments</key><array>
<map><key>regionName</key><map><key>type</key><string>string</string></map></map>
<map><key>position</key><map><key>type</key><string>vector</string></map></map>
<map><key>lookat</key><map><key>type</key><string>vector</string></map></map>
</array>
</map>
<key>osTeleportOwner</key>
<map>
<key>arguments</key><array>
<map><key>position</key><map><key>type</key><string>vector</string></map></map>
@ -9048,12 +9120,11 @@
<map><key>lookat</key><map><key>type</key><string>vector</string></map></map>
</array>
</map>
<key>osTeleportOwner</key>
<key>osTemperature2sRGB</key>
<map>
<key>return</key><string>vector</string>
<key>arguments</key><array>
<map><key>regionName</key><map><key>type</key><string>string</string></map></map>
<map><key>position</key><map><key>type</key><string>vector</string></map></map>
<map><key>lookat</key><map><key>type</key><string>vector</string></map></map>
<map><key>dtemp</key><map><key>type</key><string>float</string></map></map>
</array>
</map>
<key>osTerrainFlush</key>
@ -9119,39 +9190,5 @@
<key>return</key><string>string</string>
<key>arguments</key><undef/>
</map>
<key>osAESEncrypt</key>
<map>
<key>return</key><string>string</string>
<key>arguments</key><array>
<map><key>secret</key><map><key>type</key><string>string</string></map></map>
<map><key>plainText</key><map><key>type</key><string>string</string></map></map>
</array>
</map>
<key>osAESEncryptTo</key>
<map>
<key>return</key><string>string</string>
<key>arguments</key><array>
<map><key>secret</key><map><key>type</key><string>string</string></map></map>
<map><key>plainText</key><map><key>type</key><string>string</string></map></map>
<map><key>ivString</key><map><key>type</key><string>string</string></map></map>
</array>
</map>
<key>osAESDecrypt</key>
<map>
<key>return</key><string>string</string>
<key>arguments</key><array>
<map><key>secret</key><map><key>type</key><string>string</string></map></map>
<map><key>encryptedText</key><map><key>type</key><string>string</string></map></map>
</array>
</map>
<key>osAESDecryptFrom</key>
<map>
<key>return</key><string>string</string>
<key>arguments</key><array>
<map><key>secret</key><map><key>type</key><string>string</string></map></map>
<map><key>encryptedText</key><map><key>type</key><string>string</string></map></map>
<map><key>ivString</key><map><key>type</key><string>string</string></map></map>
</array>
</map>
</map>
</map></llsd>