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 llsd-lsl-syntax-version2 controls @@ -1714,7 +1714,7 @@ OS_APIVERSION typeinteger - value22 + value23 OS_ATTACH_MSG_ALL typeinteger @@ -3615,6 +3615,7 @@ arguments valtypeinteger + tooltipReturns absolute version as val (ie as postive value) llAcos @@ -3622,6 +3623,7 @@ arguments valtypefloat + tooltipReturns cosine of val (val in radians) llAddToLandBanList @@ -3680,14 +3682,16 @@ arguments valtypefloat + tooltipReturns sine of val (val in radians) llAtan2 returnfloat arguments - xtypefloat ytypefloat + xtypefloat + tooltipReturns the angle whose tangent is the y/x llAttachToAvatar @@ -3873,6 +3877,14 @@ endtypeinteger + llDerezObject + + returninteger + arguments + objectUUIDtypekey + flagtypeinteger + + llDetachFromAvatar arguments @@ -4165,6 +4177,16 @@ objtypestring + llGetCameraAspect + + returnfloat + arguments + + llGetCameraFOV + + returnfloat + arguments + llGetCameraPos returnvector @@ -5009,7 +5031,6 @@ linknumbertypeinteger soundtypestring volumetypefloat - flagstypeinteger llLinkPlaySound @@ -5018,6 +5039,7 @@ linknumbertypeinteger soundtypestring volumetypefloat + flagstypeinteger 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.