diff --git a/OpenSim/Data/PGSQL/PGSQLGenericTableHandler.cs b/OpenSim/Data/PGSQL/PGSQLGenericTableHandler.cs
index 2d8aef0bae..7fe70d2c7a 100644
--- a/OpenSim/Data/PGSQL/PGSQLGenericTableHandler.cs
+++ b/OpenSim/Data/PGSQL/PGSQLGenericTableHandler.cs
@@ -534,7 +534,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]);
}
diff --git a/OpenSim/Data/PGSQL/PGSQLSimulationData.cs b/OpenSim/Data/PGSQL/PGSQLSimulationData.cs
index 155594f33c..931459aa74 100755
--- a/OpenSim/Data/PGSQL/PGSQLSimulationData.cs
+++ b/OpenSim/Data/PGSQL/PGSQLSimulationData.cs
@@ -784,7 +784,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))
@@ -896,7 +896,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))
{
@@ -908,10 +908,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
@@ -920,7 +923,8 @@ namespace OpenSim.Data.PGSQL
regionSettings.OnSave += StoreRegionSettings;
//Store new values
- StoreNewRegionSettings(regionSettings);
+ // StoreNewRegionSettings(regionSettings);
+ StoreRegionSettings(regionSettings);
LoadSpawnPoints(regionSettings);
@@ -928,51 +932,69 @@ namespace OpenSim.Data.PGSQL
}
///
- /// Store region settings, need to check if the check is really necesary. If we can make something for creating new region.
+ /// Store region settings
///
/// region settings.
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);
- }
- else
- {
- //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))
+ connection.Open();
+ NpgsqlCommand command = new NpgsqlCommand(queryString, connection, connection.BeginTransaction());
+ using (command)
{
- cmd.Parameters.AddRange(CreateRegionSettingParameters(regionSettings));
- conn.Open();
- cmd.ExecuteNonQuery();
+ try
+ {
+ command.Parameters.AddRange(CreateRegionSettingParameters(regionSettings));
+ command.ExecuteNonQuery();
+ command.Transaction.Commit();
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine(e);
+ command.Transaction.Rollback();
+ throw;
+ }
}
}
SaveSpawnPoints(regionSettings);
@@ -983,39 +1005,6 @@ namespace OpenSim.Data.PGSQL
//Not used??
}
- #region Private Methods
-
- ///
- /// Stores new regionsettings.
- ///
- /// The region settings.
- 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
///
@@ -1601,7 +1590,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),
@@ -1968,7 +1959,6 @@ namespace OpenSim.Data.PGSQL
#endregion
- #endregion
private void LoadSpawnPoints(RegionSettings rs)
{
@@ -1983,14 +1973,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);
}
}
@@ -2030,15 +2020,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 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 extraSettings = new Dictionary();
+ while (reader.Read())
+ {
+ extraSettings.Add(reader["Name"].ToString(), reader["value"].ToString());
+ }
+ return extraSettings;
}
}
}
diff --git a/OpenSim/Data/PGSQL/Resources/RegionStore.migrations b/OpenSim/Data/PGSQL/Resources/RegionStore.migrations
index 0c89495036..bde59a7c29 100644
--- a/OpenSim/Data/PGSQL/Resources/RegionStore.migrations
+++ b/OpenSim/Data/PGSQL/Resources/RegionStore.migrations
@@ -1262,8 +1262,45 @@ COMMIT;
:VERSION 54 #----- add pbr terrain storage
BEGIN;
-ALTER TABLE regionsettings ADD COLUMN "TerrainPBR1" uuid NOT NULL;
-ALTER TABLE regionsettings ADD COLUMN "TerrainPBR2" uuid NOT NULL;
-ALTER TABLE regionsettings ADD COLUMN "TerrainPBR3" uuid NOT NULL;
-ALTER TABLE regionsettings ADD COLUMN "TerrainPBR4" uuid NOT NULL;
+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;
diff --git a/OpenSim/Data/SQLite/Resources/RegionStore.migrations b/OpenSim/Data/SQLite/Resources/RegionStore.migrations
index 92d046e6b5..11a09e570c 100644
--- a/OpenSim/Data/SQLite/Resources/RegionStore.migrations
+++ b/OpenSim/Data/SQLite/Resources/RegionStore.migrations
@@ -414,8 +414,8 @@ COMMIT;
:VERSION 42 #----- add pbr terrain storage
BEGIN;
-ALTER TABLE `regionsettings` ADD COLUMN `TerrainPBR1` char(36) NOT NULL;
-ALTER TABLE `regionsettings` ADD COLUMN `TerrainPBR2` char(36) NOT NULL;
-ALTER TABLE `regionsettings` ADD COLUMN `TerrainPBR3` char(36) NOT NULL;
-ALTER TABLE `regionsettings` ADD COLUMN `TerrainPBR4` char(36) NOT NULL;
+ALTER TABLE regionsettings ADD COLUMN TerrainPBR1 char(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000';
+ALTER TABLE regionsettings ADD COLUMN TerrainPBR2 char(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000';
+ALTER TABLE regionsettings ADD COLUMN TerrainPBR3 char(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000';
+ALTER TABLE regionsettings ADD COLUMN TerrainPBR4 char(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000';
COMMIT;
diff --git a/OpenSim/Framework/AgentUpdateArgs.cs b/OpenSim/Framework/AgentUpdateArgs.cs
index 994ab87fba..2e9ece5e18 100644
--- a/OpenSim/Framework/AgentUpdateArgs.cs
+++ b/OpenSim/Framework/AgentUpdateArgs.cs
@@ -78,6 +78,7 @@ namespace OpenSim.Framework
public bool NeedsCameraCollision;
public uint lastpacketSequence;
public double lastUpdateTS;
+ public double lastMoveUpdateTS;
public AgentUpdateArgs()
{
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
index 5898370b6e..454347fa55 100755
--- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
@@ -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;
- ///
- /// This checks the update significance against the last update made.
- ///
- /// Can only be called by one thread at a time
- ///
- ///
- public bool CheckAgentUpdateSignificance(AgentUpdatePacket.AgentDataBlock x)
- {
- return CheckAgentMovementUpdateSignificance(x) || CheckAgentCameraUpdateSignificance(x);
- }
-
///
/// This checks the movement/state update significance against the last update made.
///
/// Can only be called by one thread at a time
///
///
- 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
/// Can only be called by one thread at a time
///
///
+ [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;
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index 1abf0167d3..572aaa3777 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -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;
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index 9fb07d5bcb..6e24a26d7c 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -7788,17 +7788,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
public void llSetCameraEyeOffset(LSL_Vector offset)
{
m_host.SetCameraEyeOffset(offset);
-
- if (m_host.ParentGroup.RootPart.GetCameraEyeOffset().IsZero())
- m_host.ParentGroup.RootPart.SetCameraEyeOffset(offset);
}
public void llSetCameraAtOffset(LSL_Vector offset)
{
m_host.SetCameraAtOffset(offset);
-
- if (m_host.ParentGroup.RootPart.GetCameraAtOffset().IsZero())
- m_host.ParentGroup.RootPart.SetCameraAtOffset(offset);
}
public void llSetLinkCamera(LSL_Integer link, LSL_Vector eye, LSL_Vector at)
@@ -14991,6 +14985,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))
@@ -18768,6 +18789,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
@@ -18811,6 +18863,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;
+ }
+
///
/// Get a notecard line.
///
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs
index 325f342e0e..9061624d06 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs
@@ -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();
@@ -521,5 +522,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
LSL_Integer llLinksetDataWriteProtected(LSL_String name, LSL_String value, LSL_String pass);
LSL_Integer llIsFriend(LSL_Key agent_id);
+ LSL_Integer llDerezObject(LSL_Key objectUUID, LSL_Integer flag);
}
}
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs
index 1ccaf85fa8..74f19eab1c 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs
@@ -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;
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs
index 41effdfec5..e84e664cf5 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs
@@ -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()
{
@@ -2796,11 +2802,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
{
return m_LSL_Functions.llLinksetDataFindKeys(pattern, start, count);
}
-
+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public LSL_Integer llIsFriend(LSL_Key agent_id)
{
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);
+ }
}
}
diff --git a/bin/ScriptSyntax.xml b/bin/ScriptSyntax.xml
index 0c33b1d99d..c249714d8d 100644
--- a/bin/ScriptSyntax.xml
+++ b/bin/ScriptSyntax.xml
@@ -1,4 +1,4 @@
-9a2d5a5e-484a-40b0-82bc-092443b08ff7
+4782a83e-4ec0-2ed4-2d2a-c59df5a3ccf0
llLinksetDataAvailable
@@ -6934,8 +6956,7 @@
returninteger
arguments
- sFirstNametypestring
- sLastNametypestring
+ avkeytypekey
tooltipReturns the type of a avatar in region:\n+ < 0 in case of error.\n+ 0 if avatar not found in region.\n+ 1 if it is a normal avatar.\n+ 2 if it is a NPC.\n\n- Threat Level: Not Checked.\n- Permissions: Always allowed by default.\n- Sleep: 0 seconds.
@@ -6943,7 +6964,8 @@
returninteger
arguments
- avkeytypekey
+ sFirstNametypestring
+ sLastNametypestring
tooltipReturns the type of a avatar in region:\n+ < 0 in case of error.\n+ 0 if avatar not found in region.\n+ 1 if it is a normal avatar.\n+ 2 if it is a NPC.\n\n- Threat Level: Not Checked.\n- Permissions: Always allowed by default.\n- Sleep: 0 seconds.
@@ -7067,6 +7089,8 @@
returnstring
arguments
drawListtypestring
+ startXtypeinteger
+ startYtypeinteger
endXtypeinteger
endYtypeinteger
@@ -7077,8 +7101,6 @@
returnstring
arguments
drawListtypestring
- startXtypeinteger
- startYtypeinteger
endXtypeinteger
endYtypeinteger
@@ -7482,6 +7504,52 @@
tooltipReturns a list of items names within the prim inventory specified by the items type or INVENTORY_ALL.\n- Threat Level: Not Checked.\n- Permissions: Always allowed by default.\n- Sleep: 0 seconds.
+ osGetLastChangedEventKey
+
+ returnkey
+ arguments
+
+ osGetLinkColor
+
+ returnvector
+ arguments
+ linknumtypeinteger
+ facetypeinteger
+
+
+ osGetLinkInventoryDesc
+
+ returnstring
+ arguments
+ linkNumbertypeinteger
+ itemNameoridtypestring
+
+
+ osGetLinkInventoryItemKey
+
+ returnkey
+ arguments
+ linkNumbertypeinteger
+ nametypestring
+
+
+ osGetLinkInventoryItemKeys
+
+ returnlist
+ arguments
+ linkNumbertypeinteger
+ typetypeinteger
+
+
+ osGetLinkInventoryKey
+
+ returnkey
+ arguments
+ linkNumbertypeinteger
+ nametypestring
+ typetypeinteger
+
+
osGetLinkInventoryName
returnstring
@@ -7803,6 +7871,23 @@
tooltipGets the value of param property for plugin module.\n- Threat Level: VeryLow.\n- Permissions: Always allowed by default.\n- Sleep: 0 seconds.
+ osGiveLinkInventory
+
+ arguments
+ linkNumbertypeinteger
+ destinationtypekey
+ inventorytypestring
+
+
+ osGiveLinkInventoryList
+
+ arguments
+ linkNumbertypeinteger
+ destinationtypekey
+ categorytypestring
+ inventorytypelist
+
+
osInviteToGroup
returninteger
@@ -8023,7 +8108,6 @@
nametypestring
positiontypevector
notecardtypestring
- optionstypeinteger
tooltipCreates an NPC named firstname lastname at position from avatar appearance resource cloneFrom.\n- Threat Level: High.\n- Permissions: ${OSSL|osslNPC}.\n- Sleep: 0 seconds.
@@ -8035,6 +8119,7 @@
nametypestring
positiontypevector
notecardtypestring
+ optionstypeinteger
tooltipCreates an NPC named firstname lastname at position from avatar appearance resource cloneFrom.\n- Threat Level: High.\n- Permissions: ${OSSL|osslNPC}.\n- Sleep: 0 seconds.
@@ -8119,6 +8204,7 @@
arguments
npctypekey
notecardtypestring
+ includeHudstypeinteger
tooltipSave the NPC's current appearance to a notecard in the prim's inventory.\n- Threat Level: High.\n- Permissions: ${OSSL|osslNPC}.\n- Sleep: 0 seconds.
@@ -8128,7 +8214,6 @@
arguments
npctypekey
notecardtypestring
- includeHudstypeinteger
tooltipSave the NPC's current appearance including Huds to a notecard in the prim's inventory.\n- Threat Level: High.\n- Permissions: ${OSSL|osslNPC}.\n- Sleep: 0 seconds.
@@ -8136,7 +8221,6 @@
arguments
npctypekey
- channeltypeinteger
messagetypestring
tooltipMakes an npc says message on the given channel.\n- Threat Level: High.\n- Permissions: ${OSSL|osslNPC}.\n- Sleep: 0 seconds.
@@ -8145,6 +8229,7 @@
arguments
npctypekey
+ channeltypeinteger
messagetypestring
tooltipnpc says message on the given channel.\n- Threat Level: High.\n- Permissions: ${OSSL|osslNPC}.\n- Sleep: 0 seconds.
@@ -8338,6 +8423,7 @@
osRegionNotice
arguments
+ agentIDtypekey
msgtypestring
tooltipSends a region notice to the entire current region.\n- Threat Level: VeryHigh.\n- Permissions: ESTATE_MANAGER,ESTATE_OWNER.\n- Sleep: 0 seconds.
@@ -8345,7 +8431,14 @@
osRegionNotice
arguments
- agentIDtypekey
+ msgtypestring
+
+
+ osRegionRestart
+
+ returninteger
+ arguments
+ secondstypefloat
msgtypestring
tooltipSends a region notice to the specified avatar in the current region.\n- Threat Level: VeryHigh.\n- Permissions: ESTATE_MANAGER,ESTATE_OWNER.\n- Sleep: 0 seconds.
@@ -8358,12 +8451,11 @@
tooltipRestarts a region after a specified timeout.\n- Threat Level: High.\n- Permissions: ESTATE_MANAGER,ESTATE_OWNER.\n- Sleep: 0 seconds.
- osRegionRestart
+ osRemoveLinkInventory
- returninteger
arguments
- secondstypefloat
- msgtypestring
+ linkNumbertypeinteger
+ nametypestring
tooltipSend a warning messages to all users in the region and restart the region after a specified timeout.\n- Threat Level: High.\n- Permissions: ESTATE_MANAGER,ESTATE_OWNER.\n- Sleep: 0 seconds.
@@ -8633,7 +8725,7 @@
returnstring
arguments
drawListtypestring
- colortypevector
+ colortypestring
tooltipThis sets the pen's drawing color to either the specified named .NET color named colors or to a 32-bit color value (formatted as eight hexadecimal digits in the format aarrggbb, representing the eight-bit alpha, red, green and blue channels).\n- Threat Level: Not Checked.\n- Permissions: Always allowed by default.\n- Sleep: 0 seconds.
@@ -8642,7 +8734,7 @@
returnstring
arguments
drawListtypestring
- colortypestring
+ colortypevector
tooltipThis sets the pen's drawing color to either the specified named .NET color named colors or to a 32-bit color value (formatted as eight hexadecimal digits in the format aarrggbb, representing the eight-bit alpha, red, green and blue channels).\n- Threat Level: Not Checked.\n- Permissions: Always allowed by default.\n- Sleep: 0 seconds.
@@ -8724,6 +8816,17 @@
tooltipSets a prim projector parameters, argument projection is TRUE(1) or FALSE(0). The prim can be any prim with giving UUID.\n- Threat Level: Not Checked.\n- Permissions: Not Specified.\n- Sleep: 0 seconds.
+ osSetProjectionParams
+
+ arguments
+ linknumbertypeinteger
+ projectiontypeinteger
+ texturetypekey
+ fovtypefloat
+ focustypefloat
+ ambtypefloat
+
+
osSetRegionSunSettings
arguments
@@ -8887,6 +8990,8 @@
arguments
srctypestring
valuetypestring
+ starttypeinteger
+ counttypeinteger
ignorecasetypeinteger
tooltipReports the zero-based index of the last occurrence of string value withing string scr. returns -1 if not found. It can compare ignoring case with ignoreCase TRUE(1) or considering case if FALSE(0).\n- Threat Level: Not Checked.\n- Permissions: Always allowed by default.\n- Sleep: 0 seconds.
@@ -8897,8 +9002,6 @@
arguments
srctypestring
valuetypestring
- starttypeinteger
- counttypeinteger
ignorecasetypeinteger
tooltipReports the zero-based index of the last occurrence of string value withing string scr. returns -1 if not found. It can compare ignoring case with ignoreCase TRUE(1) or considering case if FALSE(0).\n- Threat Level: Not Checked.\n- Permissions: Always allowed by default.\n- Sleep: 0 seconds.
@@ -8939,6 +9042,7 @@
arguments
srctypestring
starttypeinteger
+ lengthtypeinteger
tooltip\n- Threat Level: None.\n- Permissions: Always allowed by default.\n- Sleep: 0 seconds.
@@ -8948,7 +9052,6 @@
arguments
srctypestring
starttypeinteger
- lengthtypeinteger
tooltip\n- Threat Level: None.\n- Permissions: Always allowed by default.\n- Sleep: 0 seconds.
@@ -8972,7 +9075,6 @@
arguments
agenttypestring
- regionNametypestring
positiontypevector
lookattypevector
@@ -8993,6 +9095,7 @@
arguments
agenttypestring
+ regionNametypestring
positiontypevector
lookattypevector
@@ -9010,6 +9113,14 @@
tooltipTeleports an agent within the current region.\n- Threat Level: Severe.\n- Permissions: osslParcelO,ESTATE_MANAGER,ESTATE_OWNER.\n- Sleep: 0 seconds.
osTeleportOwner
+
+ arguments
+ regionNametypestring
+ positiontypevector
+ lookattypevector
+
+
+ osTeleportOwner
arguments
positiontypevector
@@ -9027,12 +9138,11 @@
tooltipTeleports the owner of the object containing the script to the specified location in the local grid; the region coordinates are specified as region cells (not as global coordinates based on meters).\n- Threat Level: None.\n- Permissions: osslParcelOG,ESTATE_MANAGER,ESTATE_OWNER.\n- Sleep: 5 seconds.
- osTeleportOwner
+ osTemperature2sRGB
+ returnvector
arguments
- regionNametypestring
- positiontypevector
- lookattypevector
+ dtemptypefloat
tooltipTeleports the owner of the object containing the script to the specified location in any addressable region, including hypergrid destinations.\n- Threat Level: None.\n- Permissions: osslParcelOG,ESTATE_MANAGER,ESTATE_OWNER.\n- Sleep: 5 seconds.