diff --git a/OpenSim/Client/MXP/ClientStack/MXPClientView.cs b/OpenSim/Client/MXP/ClientStack/MXPClientView.cs index 94a81f09bb..d414f08d82 100644 --- a/OpenSim/Client/MXP/ClientStack/MXPClientView.cs +++ b/OpenSim/Client/MXP/ClientStack/MXPClientView.cs @@ -692,6 +692,8 @@ namespace OpenSim.Client.MXP.ClientStack public event UUIDNameRequest OnTeleportHomeRequest; public event ScriptAnswer OnScriptAnswer; public event AgentSit OnUndo; + public event AgentSit OnRedo; + public event LandUndo OnLandUndo; public event ForceReleaseControls OnForceReleaseControls; public event GodLandStatRequest OnLandStatRequest; public event DetailedEstateDataRequest OnDetailedEstateDataRequest; diff --git a/OpenSim/Client/Sirikata/ClientStack/SirikataClientView.cs b/OpenSim/Client/Sirikata/ClientStack/SirikataClientView.cs index eac20bc6ce..d305ffea4d 100644 --- a/OpenSim/Client/Sirikata/ClientStack/SirikataClientView.cs +++ b/OpenSim/Client/Sirikata/ClientStack/SirikataClientView.cs @@ -338,6 +338,8 @@ namespace OpenSim.Client.Sirikata.ClientStack public event UUIDNameRequest OnTeleportHomeRequest; public event ScriptAnswer OnScriptAnswer; public event AgentSit OnUndo; + public event AgentSit OnRedo; + public event LandUndo OnLandUndo; public event ForceReleaseControls OnForceReleaseControls; public event GodLandStatRequest OnLandStatRequest; public event DetailedEstateDataRequest OnDetailedEstateDataRequest; diff --git a/OpenSim/Client/VWoHTTP/ClientStack/VWHClientView.cs b/OpenSim/Client/VWoHTTP/ClientStack/VWHClientView.cs index 20122112b0..ef74677836 100644 --- a/OpenSim/Client/VWoHTTP/ClientStack/VWHClientView.cs +++ b/OpenSim/Client/VWoHTTP/ClientStack/VWHClientView.cs @@ -343,6 +343,8 @@ namespace OpenSim.Client.VWoHTTP.ClientStack public event UUIDNameRequest OnTeleportHomeRequest = delegate { }; public event ScriptAnswer OnScriptAnswer = delegate { }; public event AgentSit OnUndo = delegate { }; + public event AgentSit OnRedo = delegate { }; + public event LandUndo OnLandUndo = delegate { }; public event ForceReleaseControls OnForceReleaseControls = delegate { }; public event GodLandStatRequest OnLandStatRequest = delegate { }; public event DetailedEstateDataRequest OnDetailedEstateDataRequest = delegate { }; diff --git a/OpenSim/Data/SQLite/SQLiteRegionData.cs b/OpenSim/Data/SQLite/SQLiteRegionData.cs index b68de1a87b..5a4ee2ab72 100644 --- a/OpenSim/Data/SQLite/SQLiteRegionData.cs +++ b/OpenSim/Data/SQLite/SQLiteRegionData.cs @@ -617,18 +617,42 @@ namespace OpenSim.Data.SQLite { lock (ds) { - using (SqliteCommand cmd = new SqliteCommand("delete from land where UUID=:UUID", m_conn)) + // Can't use blanket SQL statements when using SqlAdapters unless you re-read the data into the adapter + // after you're done. + // replaced below code with the SqliteAdapter version. + //using (SqliteCommand cmd = new SqliteCommand("delete from land where UUID=:UUID", m_conn)) + //{ + // cmd.Parameters.Add(new SqliteParameter(":UUID", globalID.ToString())); + // cmd.ExecuteNonQuery(); + //} + + //using (SqliteCommand cmd = new SqliteCommand("delete from landaccesslist where LandUUID=:UUID", m_conn)) + //{ + // cmd.Parameters.Add(new SqliteParameter(":UUID", globalID.ToString())); + // cmd.ExecuteNonQuery(); + //} + + DataTable land = ds.Tables["land"]; + DataTable landaccesslist = ds.Tables["landaccesslist"]; + DataRow landRow = land.Rows.Find(globalID.ToString()); + if (landRow != null) { - cmd.Parameters.Add(new SqliteParameter(":UUID", globalID.ToString())); - cmd.ExecuteNonQuery(); + land.Rows.Remove(landRow); + } + List rowsToDelete = new List(); + foreach (DataRow rowToCheck in landaccesslist.Rows) + { + if (rowToCheck["LandUUID"].ToString() == globalID.ToString()) + rowsToDelete.Add(rowToCheck); + } + for (int iter = 0; iter < rowsToDelete.Count; iter++) + { + landaccesslist.Rows.Remove(rowsToDelete[iter]); } - using (SqliteCommand cmd = new SqliteCommand("delete from landaccesslist where LandUUID=:UUID", m_conn)) - { - cmd.Parameters.Add(new SqliteParameter(":UUID", globalID.ToString())); - cmd.ExecuteNonQuery(); - } + } + Commit(); } /// @@ -655,12 +679,27 @@ namespace OpenSim.Data.SQLite } // I know this caused someone issues before, but OpenSim is unusable if we leave this stuff around - using (SqliteCommand cmd = new SqliteCommand("delete from landaccesslist where LandUUID=:LandUUID", m_conn)) - { - cmd.Parameters.Add(new SqliteParameter(":LandUUID", parcel.LandData.GlobalID.ToString())); - cmd.ExecuteNonQuery(); - } + //using (SqliteCommand cmd = new SqliteCommand("delete from landaccesslist where LandUUID=:LandUUID", m_conn)) + //{ + // cmd.Parameters.Add(new SqliteParameter(":LandUUID", parcel.LandData.GlobalID.ToString())); + // cmd.ExecuteNonQuery(); +// } + + // This is the slower.. but more appropriate thing to do + + // We can't modify the table with direct queries before calling Commit() and re-filling them. + List rowsToDelete = new List(); + foreach (DataRow rowToCheck in landaccesslist.Rows) + { + if (rowToCheck["LandUUID"].ToString() == parcel.LandData.GlobalID.ToString()) + rowsToDelete.Add(rowToCheck); + } + for (int iter = 0; iter < rowsToDelete.Count; iter++) + { + landaccesslist.Rows.Remove(rowsToDelete[iter]); + } + rowsToDelete.Clear(); foreach (ParcelManager.ParcelAccessEntry entry in parcel.LandData.ParcelAccessList) { DataRow newAccessRow = landaccesslist.NewRow(); @@ -1711,7 +1750,7 @@ namespace OpenSim.Data.SQLite row["terrain_raise_limit"] = settings.TerrainRaiseLimit; row["terrain_lower_limit"] = settings.TerrainLowerLimit; row["use_estate_sun"] = settings.UseEstateSun; - row["sandbox"] = settings.Sandbox; + row["Sandbox"] = settings.Sandbox; // database uses upper case S for sandbox row["sunvectorx"] = settings.SunVector.X; row["sunvectory"] = settings.SunVector.Y; row["sunvectorz"] = settings.SunVector.Z; @@ -1813,6 +1852,7 @@ namespace OpenSim.Data.SQLite /// private void addPrim(SceneObjectPart prim, UUID sceneGroupID, UUID regionUUID) { + DataTable prims = ds.Tables["prims"]; DataTable shapes = ds.Tables["primshapes"]; @@ -1961,6 +2001,40 @@ namespace OpenSim.Data.SQLite return cmd; } + /// + /// create an update command + /// + /// table name + /// + /// + /// the created command + private static SqliteCommand createUpdateCommand(string table, string pk1, string pk2, DataTable dt) + { + string sql = "update " + table + " set "; + string subsql = String.Empty; + foreach (DataColumn col in dt.Columns) + { + if (subsql.Length > 0) + { + // a map function would rock so much here + subsql += ", "; + } + subsql += col.ColumnName + "= :" + col.ColumnName; + } + sql += subsql; + sql += " where " + pk1 + " and " + pk2; + SqliteCommand cmd = new SqliteCommand(sql); + + // this provides the binding for all our parameters, so + // much less code than it used to be + + foreach (DataColumn col in dt.Columns) + { + cmd.Parameters.Add(createSqliteParameter(col.ColumnName, col.DataType)); + } + return cmd; + } + /// /// /// @@ -2079,6 +2153,11 @@ namespace OpenSim.Data.SQLite da.UpdateCommand = createUpdateCommand("land", "UUID=:UUID", ds.Tables["land"]); da.UpdateCommand.Connection = conn; + + SqliteCommand delete = new SqliteCommand("delete from land where UUID=:UUID"); + delete.Parameters.Add(createSqliteParameter("UUID", typeof(String))); + da.DeleteCommand = delete; + da.DeleteCommand.Connection = conn; } /// @@ -2090,6 +2169,16 @@ namespace OpenSim.Data.SQLite { da.InsertCommand = createInsertCommand("landaccesslist", ds.Tables["landaccesslist"]); da.InsertCommand.Connection = conn; + + da.UpdateCommand = createUpdateCommand("landaccesslist", "LandUUID=:landUUID", "AccessUUID=:AccessUUID", ds.Tables["landaccesslist"]); + da.UpdateCommand.Connection = conn; + + SqliteCommand delete = new SqliteCommand("delete from landaccesslist where LandUUID= :LandUUID and AccessUUID= :AccessUUID"); + delete.Parameters.Add(createSqliteParameter("LandUUID", typeof(String))); + delete.Parameters.Add(createSqliteParameter("AccessUUID", typeof(String))); + da.DeleteCommand = delete; + da.DeleteCommand.Connection = conn; + } private void setupRegionSettingsCommands(SqliteDataAdapter da, SqliteConnection conn) diff --git a/OpenSim/Framework/AvatarAppearance.cs b/OpenSim/Framework/AvatarAppearance.cs index a3ea499357..a2a5c84845 100644 --- a/OpenSim/Framework/AvatarAppearance.cs +++ b/OpenSim/Framework/AvatarAppearance.cs @@ -69,7 +69,7 @@ namespace OpenSim.Framework private static UUID HAIR_ASSET = new UUID("d342e6c0-b9d2-11dc-95ff-0800200c9a66"); private static UUID HAIR_ITEM = new UUID("d342e6c1-b9d2-11dc-95ff-0800200c9a66"); - public readonly static int VISUALPARAM_COUNT = 218; + public readonly static int VISUALPARAM_COUNT = 218; protected UUID m_owner; @@ -361,7 +361,7 @@ namespace OpenSim.Framework // This sets Visual Params with *less* weirder values then default. Instead of a ugly alien, it looks like a fat scientist SetDefaultParams(m_visualparams); SetDefaultWearables(); - m_texture = GetDefaultTexture(); + m_texture = GetDefaultTexture(); } public AvatarAppearance(UUID avatarID, AvatarWearable[] wearables, byte[] visualParams) @@ -390,11 +390,12 @@ namespace OpenSim.Framework + 0.08f * (float)m_visualparams[(int)VPElement.SHOES_PLATFORM_HEIGHT] / 255.0f // Shoe platform height + 0.07f * (float)m_visualparams[(int)VPElement.SHOES_HEEL_HEIGHT] / 255.0f // Shoe heel height + 0.076f * (float)m_visualparams[(int)VPElement.SHAPE_NECK_LENGTH] / 255.0f; // Neck length - m_hipOffset = (0.615385f // Half of avatar + m_hipOffset = (((1.23077f // Half of avatar + + 0.516945f * (float)m_visualparams[(int)VPElement.SHAPE_HEIGHT] / 255.0f // Body height + + 0.3836f * (float)m_visualparams[(int)VPElement.SHAPE_LEG_LENGTH] / 255.0f // Leg length + 0.08f * (float)m_visualparams[(int)VPElement.SHOES_PLATFORM_HEIGHT] / 255.0f // Shoe platform height + 0.07f * (float)m_visualparams[(int)VPElement.SHOES_HEEL_HEIGHT] / 255.0f // Shoe heel height - + 0.3836f * (float)m_visualparams[(int)VPElement.SHAPE_LEG_LENGTH] / 255.0f // Leg length - - m_avatarHeight / 2) * 0.3f - 0.04f; + ) / 2) - m_avatarHeight / 2) * 0.31f - 0.0425f; diff --git a/OpenSim/Framework/Console/LocalConsole.cs b/OpenSim/Framework/Console/LocalConsole.cs index b7e191b969..be936b6671 100644 --- a/OpenSim/Framework/Console/LocalConsole.cs +++ b/OpenSim/Framework/Console/LocalConsole.cs @@ -38,7 +38,7 @@ namespace OpenSim.Framework.Console { /// /// A console that uses cursor control and color - /// + /// public class LocalConsole : CommandConsole { // private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); @@ -100,8 +100,8 @@ namespace OpenSim.Framework.Console private int SetCursorTop(int top) { // From at least mono 2.4.2.3, window resizing can give mono an invalid row and column values. If we try - // to set a cursor row position with a currently invalid column, mono will throw an exception. - // Therefore, we need to make sure that the column position is valid first. + // to set a cursor row position with a currently invalid column, mono will throw an exception. + // Therefore, we need to make sure that the column position is valid first. int left = System.Console.CursorLeft; if (left < 0) @@ -129,12 +129,12 @@ namespace OpenSim.Framework.Console /// /// /// The new cursor column. - /// + /// private int SetCursorLeft(int left) { // From at least mono 2.4.2.3, window resizing can give mono an invalid row and column values. If we try - // to set a cursor column position with a currently invalid row, mono will throw an exception. - // Therefore, we need to make sure that the row position is valid first. + // to set a cursor column position with a currently invalid row, mono will throw an exception. + // Therefore, we need to make sure that the row position is valid first. int top = System.Console.CursorTop; if (top < 0) @@ -183,7 +183,7 @@ namespace OpenSim.Framework.Console System.Console.Write("{0}", prompt); SetCursorTop(new_y); - SetCursorLeft(new_x); + SetCursorLeft(new_x); } } diff --git a/OpenSim/Framework/Console/RemoteConsole.cs b/OpenSim/Framework/Console/RemoteConsole.cs index 9fdd1b8a14..6f8348de66 100644 --- a/OpenSim/Framework/Console/RemoteConsole.cs +++ b/OpenSim/Framework/Console/RemoteConsole.cs @@ -302,9 +302,9 @@ namespace OpenSim.Framework.Console if (!UUID.TryParse(post["ID"].ToString(), out id)) return reply; - lock(m_Connections) + lock (m_Connections) { - if(!m_Connections.ContainsKey(id)) + if (!m_Connections.ContainsKey(id)) return reply; } diff --git a/OpenSim/Framework/IClientAPI.cs b/OpenSim/Framework/IClientAPI.cs index 3f53258713..222bae0d52 100644 --- a/OpenSim/Framework/IClientAPI.cs +++ b/OpenSim/Framework/IClientAPI.cs @@ -152,6 +152,8 @@ namespace OpenSim.Framework public delegate void AgentSit(IClientAPI remoteClient, UUID agentID); + public delegate void LandUndo(IClientAPI remoteClient); + public delegate void AvatarPickerRequest(IClientAPI remoteClient, UUID agentdata, UUID queryID, string UserQuery); public delegate void GrabObject( @@ -419,9 +421,9 @@ namespace OpenSim.Framework public delegate void AcceptCallingCard(IClientAPI remoteClient, UUID transactionID, UUID folderID); public delegate void DeclineCallingCard(IClientAPI remoteClient, UUID transactionID); - + public delegate void SoundTrigger( - UUID soundId, UUID ownerid, UUID objid, UUID parentid, double Gain, Vector3 Position, UInt64 Handle); + UUID soundId, UUID ownerid, UUID objid, UUID parentid, double Gain, Vector3 Position, UInt64 Handle, float radius); public delegate void StartLure(byte lureType, string message, UUID targetID, IClientAPI client); public delegate void TeleportLureRequest(UUID lureID, uint teleportFlags, IClientAPI client); @@ -988,6 +990,8 @@ namespace OpenSim.Framework event ScriptAnswer OnScriptAnswer; event AgentSit OnUndo; + event AgentSit OnRedo; + event LandUndo OnLandUndo; event ForceReleaseControls OnForceReleaseControls; event GodLandStatRequest OnLandStatRequest; diff --git a/OpenSim/Framework/LandData.cs b/OpenSim/Framework/LandData.cs index 071a66758f..060e88696a 100644 --- a/OpenSim/Framework/LandData.cs +++ b/OpenSim/Framework/LandData.cs @@ -358,6 +358,32 @@ namespace OpenSim.Framework } } + private int[] _mediaSize = new int[2]; + public int[] MediaSize + { + get + { + return _mediaSize; + } + set + { + _mediaSize = value; + } + } + + private string _mediaType = ""; + public string MediaType + { + get + { + return _mediaType; + } + set + { + _mediaType = value; + } + } + /// /// URL to the shoutcast music stream to play on the parcel /// diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs index a86a83146d..96eceb07df 100755 --- a/OpenSim/Region/Application/OpenSim.cs +++ b/OpenSim/Region/Application/OpenSim.cs @@ -367,7 +367,6 @@ namespace OpenSim m_console.Commands.AddCommand("hypergrid", false, "unlink-region", "unlink-region or : ", "Unlink a hypergrid region", RunCommand); - } public override void ShutdownSpecific() @@ -433,7 +432,7 @@ namespace OpenSim // kick client... if (alert != null) presence.ControllingClient.Kick(alert); - else + else presence.ControllingClient.Kick("\nThe OpenSim manager kicked you out.\n"); // ...and close on our side @@ -640,7 +639,6 @@ namespace OpenSim } } - /// /// Load, Unload, and list Region modules in use /// @@ -972,7 +970,6 @@ namespace OpenSim scene.RegionInfo.RegionLocX, scene.RegionInfo.RegionLocY, scene.RegionInfo.InternalEndPoint.Port)); - }); break; @@ -1097,7 +1094,7 @@ namespace OpenSim } else { - MainConsole.Instance.Output(string.Format("A user with the name {0} {1} already exists!", firstName, lastName)); + MainConsole.Instance.Output(string.Format("A user with the name {0} {1} already exists!", firstName, lastName)); } } diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs index e39323f549..6cc0bd21a8 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs @@ -233,6 +233,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP public event ObjectBuy OnObjectBuy; public event BuyObjectInventory OnBuyObjectInventory; public event AgentSit OnUndo; + public event AgentSit OnRedo; + public event LandUndo OnLandUndo; public event ForceReleaseControls OnForceReleaseControls; public event GodLandStatRequest OnLandStatRequest; public event RequestObjectPropertiesFamily OnObjectGroupRequest; @@ -4667,6 +4669,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP AddLocalPacketHandler(PacketType.ObjectName, HandleObjectName, false); AddLocalPacketHandler(PacketType.ObjectPermissions, HandleObjectPermissions, false); AddLocalPacketHandler(PacketType.Undo, HandleUndo, false); + AddLocalPacketHandler(PacketType.UndoLand, HandleLandUndo, false); + AddLocalPacketHandler(PacketType.Redo, HandleRedo, false); AddLocalPacketHandler(PacketType.ObjectDuplicateOnRay, HandleObjectDuplicateOnRay); AddLocalPacketHandler(PacketType.RequestObjectPropertiesFamily, HandleRequestObjectPropertiesFamily, false); AddLocalPacketHandler(PacketType.ObjectIncludeInSearch, HandleObjectIncludeInSearch); @@ -5212,7 +5216,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP args.Type = ChatTypeEnum.Shout; args.Position = new Vector3(); args.Scene = Scene; - args.Sender = this; + args.Sender = this; ChatMessage handlerChatFromClient2 = OnChatFromClient; if (handlerChatFromClient2 != null) handlerChatFromClient2(this, args); @@ -5836,7 +5840,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP handlerSoundTrigger(soundTriggerPacket.SoundData.SoundID, soundTriggerPacket.SoundData.OwnerID, soundTriggerPacket.SoundData.ObjectID, soundTriggerPacket.SoundData.ParentID, soundTriggerPacket.SoundData.Gain, soundTriggerPacket.SoundData.Position, - soundTriggerPacket.SoundData.Handle); + soundTriggerPacket.SoundData.Handle, 0); } return true; @@ -6734,6 +6738,56 @@ namespace OpenSim.Region.ClientStack.LindenUDP return true; } + private bool HandleLandUndo(IClientAPI sender, Packet Pack) + { + UndoLandPacket undolanditem = (UndoLandPacket)Pack; + + #region Packet Session and User Check + if (m_checkPackets) + { + if (undolanditem.AgentData.SessionID != SessionId || + undolanditem.AgentData.AgentID != AgentId) + return true; + } + #endregion + + LandUndo handlerOnUndo = OnLandUndo; + if (handlerOnUndo != null) + { + handlerOnUndo(this); + } + return true; + } + + private bool HandleRedo(IClientAPI sender, Packet Pack) + { + RedoPacket redoitem = (RedoPacket)Pack; + + #region Packet Session and User Check + if (m_checkPackets) + { + if (redoitem.AgentData.SessionID != SessionId || + redoitem.AgentData.AgentID != AgentId) + return true; + } + #endregion + + if (redoitem.ObjectData.Length > 0) + { + for (int i = 0; i < redoitem.ObjectData.Length; i++) + { + UUID objiD = redoitem.ObjectData[i].ObjectID; + AgentSit handlerOnRedo = OnRedo; + if (handlerOnRedo != null) + { + handlerOnRedo(this, objiD); + } + + } + } + return true; + } + private bool HandleObjectDuplicateOnRay(IClientAPI sender, Packet Pack) { ObjectDuplicateOnRayPacket dupeOnRay = (ObjectDuplicateOnRayPacket)Pack; diff --git a/OpenSim/Region/CoreModules/Asset/CenomeAssetCache.cs b/OpenSim/Region/CoreModules/Asset/CenomeAssetCache.cs index 1903eb9887..b1b7b27a6c 100644 --- a/OpenSim/Region/CoreModules/Asset/CenomeAssetCache.cs +++ b/OpenSim/Region/CoreModules/Asset/CenomeAssetCache.cs @@ -330,7 +330,7 @@ namespace OpenSim.Region.CoreModules.Asset //m_log.DebugFormat("[XXX] name = {0} (this module's name: {1}", name, Name); if (name != Name) - return; + return; long maxSize = DefaultMaxSize; int maxCount = DefaultMaxCount; diff --git a/OpenSim/Region/CoreModules/Avatar/Combat/CombatModule.cs b/OpenSim/Region/CoreModules/Avatar/Combat/CombatModule.cs index 61b6d65cc7..406999167f 100644 --- a/OpenSim/Region/CoreModules/Avatar/Combat/CombatModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Combat/CombatModule.cs @@ -148,13 +148,19 @@ namespace OpenSim.Region.CoreModules.Avatar.Combat.CombatModule private void AvatarEnteringParcel(ScenePresence avatar, int localLandID, UUID regionID) { ILandObject obj = avatar.Scene.LandChannel.GetLandObject(avatar.AbsolutePosition.X, avatar.AbsolutePosition.Y); - if ((obj.LandData.Flags & (uint)ParcelFlags.AllowDamage) != 0) + try { - avatar.Invulnerable = false; + if ((obj.LandData.Flags & (uint)ParcelFlags.AllowDamage) != 0) + { + avatar.Invulnerable = false; + } + else + { + avatar.Invulnerable = true; + } } - else + catch (Exception ex) { - avatar.Invulnerable = true; } } } diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Asset/LocalAssetServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Asset/LocalAssetServiceConnector.cs index 2f21e6dfdd..50348da728 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Asset/LocalAssetServiceConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Asset/LocalAssetServiceConnector.cs @@ -224,7 +224,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Asset m_Cache.Cache(a); // if (null == a) -// m_log.WarnFormat("[LOCAL ASSET SERVICES CONNECTOR]: Could not asynchronously find asset with id {0}", id); +// m_log.WarnFormat("[LOCAL ASSET SERVICES CONNECTOR]: Could not asynchronously find asset with id {0}", id); Util.FireAndForget(delegate { handler(assetID, s, a); }); }); diff --git a/OpenSim/Region/CoreModules/World/Access/AccessModule.cs b/OpenSim/Region/CoreModules/World/Access/AccessModule.cs index 73f7ae333b..e4fe352bbd 100644 --- a/OpenSim/Region/CoreModules/World/Access/AccessModule.cs +++ b/OpenSim/Region/CoreModules/World/Access/AccessModule.cs @@ -109,7 +109,7 @@ namespace OpenSim.Region.CoreModules.World { foreach (Scene s in m_SceneList) { - if(!ProcessCommand(s, cmd)) + if (!ProcessCommand(s, cmd)) break; } } diff --git a/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs b/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs index c3e57f0574..e77a23bc97 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs @@ -99,7 +99,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver.Tests Quaternion rotationOffset = new Quaternion(20, 30, 40, 50); Vector3 offsetPosition = new Vector3(5, 10, 15); - return new SceneObjectPart(ownerId, shape, groupPosition, rotationOffset, offsetPosition) { Name = partName }; + return new SceneObjectPart(ownerId, shape, groupPosition, rotationOffset, offsetPosition) { Name = partName }; } protected SceneObjectPart CreateSceneObjectPart2() @@ -112,7 +112,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver.Tests Vector3 offsetPosition = new Vector3(20, 25, 30); return new SceneObjectPart(ownerId, shape, groupPosition, rotationOffset, offsetPosition) { Name = partName }; - } + } /// /// Test saving a V0.2 OpenSim Region Archive. @@ -231,7 +231,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver.Tests foreach (string name in names) { if (name.EndsWith(".Resources.test-sound.wav")) - soundDataResourceName = name; + soundDataResourceName = name; } Assert.That(soundDataResourceName, Is.Not.Null); @@ -259,7 +259,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver.Tests = new TaskInventoryItem { AssetID = soundUuid, ItemID = soundItemUuid, Name = soundItemName }; part1.Inventory.AddInventoryItem(item1, true); } - } + } m_scene.AddNewSceneObject(object1, false); @@ -306,15 +306,15 @@ namespace OpenSim.Region.CoreModules.World.Archiver.Tests /// Test loading the region settings of a V0.2 OpenSim Region Archive. /// [Test] - public void TestLoadOarV0_2RegionSettings() + public void TestLoadOarV0_2RegionSettings() { TestHelper.InMethod(); - //log4net.Config.XmlConfigurator.Configure(); + //log4net.Config.XmlConfigurator.Configure(); MemoryStream archiveWriteStream = new MemoryStream(); TarArchiveWriter tar = new TarArchiveWriter(archiveWriteStream); - tar.WriteDir(ArchiveConstants.TERRAINS_PATH); + tar.WriteDir(ArchiveConstants.TERRAINS_PATH); tar.WriteFile(ArchiveConstants.CONTROL_FILE_PATH, ArchiveWriteRequestExecution.Create0p2ControlFile()); RegionSettings rs = new RegionSettings(); @@ -329,11 +329,11 @@ namespace OpenSim.Region.CoreModules.World.Archiver.Tests rs.DisablePhysics = true; rs.DisableScripts = true; rs.Elevation1NW = 15.9; - rs.Elevation1NE = 45.3; + rs.Elevation1NE = 45.3; rs.Elevation1SE = 49; rs.Elevation1SW = 1.9; rs.Elevation2NW = 4.5; - rs.Elevation2NE = 19.2; + rs.Elevation2NE = 19.2; rs.Elevation2SE = 9.2; rs.Elevation2SW = 2.1; rs.FixedSun = true; @@ -411,7 +411,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver.Tests // Quaternion part2RotationOffset = new Quaternion(60, 70, 80, 90); // Vector3 part2OffsetPosition = new Vector3(20, 25, 30); - SceneObjectPart part2 = CreateSceneObjectPart2(); + SceneObjectPart part2 = CreateSceneObjectPart2(); // Create an oar file that we can use for the merge { @@ -420,9 +420,9 @@ namespace OpenSim.Region.CoreModules.World.Archiver.Tests TerrainModule terrainModule = new TerrainModule(); Scene scene = SceneSetupHelpers.SetupScene(); - SceneSetupHelpers.SetupSceneModules(scene, archiverModule, serialiserModule, terrainModule); + SceneSetupHelpers.SetupSceneModules(scene, archiverModule, serialiserModule, terrainModule); - m_scene.AddNewSceneObject(new SceneObjectGroup(part2), false); + m_scene.AddNewSceneObject(new SceneObjectGroup(part2), false); // Write out this scene scene.EventManager.OnOarFileSaved += SaveCompleted; diff --git a/OpenSim/Region/CoreModules/World/Sound/SoundModule.cs b/OpenSim/Region/CoreModules/World/Sound/SoundModule.cs index 37f1f2eb9f..1f5a4ffad4 100644 --- a/OpenSim/Region/CoreModules/World/Sound/SoundModule.cs +++ b/OpenSim/Region/CoreModules/World/Sound/SoundModule.cs @@ -60,7 +60,7 @@ namespace OpenSim.Region.CoreModules.World.Sound } public virtual void PlayAttachedSound( - UUID soundID, UUID ownerID, UUID objectID, double gain, Vector3 position, byte flags) + UUID soundID, UUID ownerID, UUID objectID, double gain, Vector3 position, byte flags, float radius) { foreach (ScenePresence p in m_scene.GetAvatars()) { @@ -69,14 +69,17 @@ namespace OpenSim.Region.CoreModules.World.Sound continue; // Scale by distance - gain = (float)((double)gain*((100.0 - dis) / 100.0)); + if (radius == 0) + gain = (float)((double)gain * ((100.0 - dis) / 100.0)); + else + gain = (float)((double)gain * ((radius - dis) / radius)); p.ControllingClient.SendPlayAttachedSound(soundID, objectID, ownerID, (float)gain, flags); } } public virtual void TriggerSound( - UUID soundId, UUID ownerID, UUID objectID, UUID parentID, double gain, Vector3 position, UInt64 handle) + UUID soundId, UUID ownerID, UUID objectID, UUID parentID, double gain, Vector3 position, UInt64 handle, float radius) { foreach (ScenePresence p in m_scene.GetAvatars()) { @@ -85,7 +88,10 @@ namespace OpenSim.Region.CoreModules.World.Sound continue; // Scale by distance - gain = (float)((double)gain*((100.0 - dis) / 100.0)); + if (radius == 0) + gain = (float)((double)gain * ((100.0 - dis) / 100.0)); + else + gain = (float)((double)gain * ((radius - dis) / radius)); p.ControllingClient.SendTriggeredSound( soundId, ownerID, objectID, parentID, handle, position, (float)gain); diff --git a/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs b/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs index a40828b080..1e7ea7bce6 100644 --- a/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs +++ b/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs @@ -84,6 +84,7 @@ namespace OpenSim.Region.CoreModules.World.Terrain private ITerrainChannel m_revert; private Scene m_scene; private volatile bool m_tainted; + private readonly UndoStack m_undo = new UndoStack(5); #region ICommandableModule Members @@ -174,6 +175,11 @@ namespace OpenSim.Region.CoreModules.World.Terrain #region ITerrainModule Members + public void UndoTerrain(ITerrainChannel channel) + { + m_channel = channel; + } + /// /// Loads a terrain file from disk and installs it in the scene. /// @@ -574,6 +580,7 @@ namespace OpenSim.Region.CoreModules.World.Terrain { client.OnModifyTerrain += client_OnModifyTerrain; client.OnBakeTerrain += client_OnBakeTerrain; + client.OnLandUndo += client_OnLandUndo; } /// @@ -664,6 +671,19 @@ namespace OpenSim.Region.CoreModules.World.Terrain return changesLimited; } + private void client_OnLandUndo(IClientAPI client) + { + lock (m_undo) + { + if (m_undo.Count > 0) + { + LandUndoState goback = m_undo.Pop(); + if (goback != null) + goback.PlaybackState(); + } + } + } + /// /// Sends a copy of the current terrain to the scenes clients /// @@ -718,6 +738,7 @@ namespace OpenSim.Region.CoreModules.World.Terrain } if (allowed) { + StoreUndoState(); m_painteffects[(StandardTerrainEffects) action].PaintEffect( m_channel, allowMask, west, south, height, size, seconds); @@ -758,6 +779,7 @@ namespace OpenSim.Region.CoreModules.World.Terrain if (allowed) { + StoreUndoState(); m_floodeffects[(StandardTerrainEffects) action].FloodEffect( m_channel, fillArea, size); @@ -782,6 +804,25 @@ namespace OpenSim.Region.CoreModules.World.Terrain } } + private void StoreUndoState() + { + lock (m_undo) + { + if (m_undo.Count > 0) + { + LandUndoState last = m_undo.Peek(); + if (last != null) + { + if (last.Compare(m_channel)) + return; + } + } + + LandUndoState nUndo = new LandUndoState(this, m_channel); + m_undo.Push(nUndo); + } + } + #region Console Commands private void InterfaceLoadFile(Object[] args) diff --git a/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs b/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs index 0bd1a26c41..ce9362f0b9 100644 --- a/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs +++ b/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs @@ -194,6 +194,8 @@ namespace OpenSim.Region.Examples.SimpleModule public event ObjectBuy OnObjectBuy; public event BuyObjectInventory OnBuyObjectInventory; public event AgentSit OnUndo; + public event AgentSit OnRedo; + public event LandUndo OnLandUndo; public event ForceReleaseControls OnForceReleaseControls; diff --git a/OpenSim/Region/Framework/Interfaces/IDynamicTextureManager.cs b/OpenSim/Region/Framework/Interfaces/IDynamicTextureManager.cs index c289cdbaf6..8954513c06 100644 --- a/OpenSim/Region/Framework/Interfaces/IDynamicTextureManager.cs +++ b/OpenSim/Region/Framework/Interfaces/IDynamicTextureManager.cs @@ -65,7 +65,7 @@ namespace OpenSim.Region.Framework.Interfaces /// The UUID of the texture updater, not the texture UUID. If you need the texture UUID then you will need /// to obtain it directly from the SceneObjectPart. For instance, if ALL_SIDES is set then this texture /// can be obtained as SceneObjectPart.Shape.Textures.DefaultTexture.TextureID - /// + /// UUID AddDynamicTextureData(UUID simID, UUID primID, string contentType, string data, string extraParams, int updateTimer, bool SetBlending, byte AlphaValue); diff --git a/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs b/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs index fa9bf19dee..f58904f8c8 100644 --- a/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs +++ b/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs @@ -150,7 +150,7 @@ namespace OpenSim.Region.Framework.Interfaces /// /// A list of inventory items with that name. /// If no inventory item has that name then an empty list is returned. - /// + /// IList GetInventoryItems(string name); /// diff --git a/OpenSim/Region/Framework/Interfaces/ISoundModule.cs b/OpenSim/Region/Framework/Interfaces/ISoundModule.cs index 379fabdf03..6117a80d9e 100644 --- a/OpenSim/Region/Framework/Interfaces/ISoundModule.cs +++ b/OpenSim/Region/Framework/Interfaces/ISoundModule.cs @@ -32,9 +32,9 @@ namespace OpenSim.Region.Framework.Interfaces { public interface ISoundModule { - void PlayAttachedSound(UUID soundID, UUID ownerID, UUID objectID, double gain, Vector3 position, byte flags); + void PlayAttachedSound(UUID soundID, UUID ownerID, UUID objectID, double gain, Vector3 position, byte flags, float radius); void TriggerSound( - UUID soundId, UUID ownerID, UUID objectID, UUID parentID, double gain, Vector3 position, UInt64 handle); + UUID soundId, UUID ownerID, UUID objectID, UUID parentID, double gain, Vector3 position, UInt64 handle, float radius); } } \ No newline at end of file diff --git a/OpenSim/Region/Framework/Interfaces/ITerrainModule.cs b/OpenSim/Region/Framework/Interfaces/ITerrainModule.cs index 7caac55e9e..5947afb927 100644 --- a/OpenSim/Region/Framework/Interfaces/ITerrainModule.cs +++ b/OpenSim/Region/Framework/Interfaces/ITerrainModule.cs @@ -62,5 +62,7 @@ namespace OpenSim.Region.Framework.Interfaces void SaveToStream(string filename, Stream stream); void InstallPlugin(string name, ITerrainEffect plug); + + void UndoTerrain(ITerrainChannel channel); } } diff --git a/OpenSim/Region/Framework/Interfaces/IWorldComm.cs b/OpenSim/Region/Framework/Interfaces/IWorldComm.cs index 948b9dc522..8da99a0cc9 100644 --- a/OpenSim/Region/Framework/Interfaces/IWorldComm.cs +++ b/OpenSim/Region/Framework/Interfaces/IWorldComm.cs @@ -62,7 +62,7 @@ namespace OpenSim.Region.Framework.Interfaces /// name to filter on /// key to filter on (user given, could be totally faked) /// msg to filter on - /// number of the scripts handle + /// number of the scripts handle int Listen(uint LocalID, UUID itemID, UUID hostID, int channel, string name, UUID id, string msg); /// @@ -77,19 +77,19 @@ namespace OpenSim.Region.Framework.Interfaces /// channel to sent on /// name of sender (object or avatar) /// key of sender (object or avatar) - /// msg to sent + /// msg to sent void DeliverMessage(ChatTypeEnum type, int channel, string name, UUID id, string msg); /// /// Are there any listen events ready to be dispatched? /// - /// boolean indication + /// boolean indication bool HasMessages(); /// /// Pop the first availlable listen event from the queue /// - /// ListenerInfo with filter filled in + /// ListenerInfo with filter filled in IWorldCommListenerInfo GetNextMessage(); void ListenControl(UUID itemID, int handle, int active); diff --git a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs index fd526eb214..712dcc70e8 100644 --- a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs +++ b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs @@ -418,15 +418,12 @@ namespace OpenSim.Region.Framework.Scenes.Animation { if (m_scenePresence.IsChildAgent) return; - - UUID[] animIDs; - int[] sequenceNums; - UUID[] objectIDs; - m_animations.GetArrays(out animIDs, out sequenceNums, out objectIDs); - - m_scenePresence.ControllingClient.SendAnimations( - animIDs, sequenceNums, m_scenePresence.ControllingClient.AgentId, objectIDs); + m_scenePresence.Scene.ForEachScenePresence( + delegate(ScenePresence SP) + { + SP.Animator.SendAnimPack(); + }); } /// diff --git a/OpenSim/Region/Framework/Scenes/EventManager.cs b/OpenSim/Region/Framework/Scenes/EventManager.cs index 9f74b2a14c..57e1c37b3d 100644 --- a/OpenSim/Region/Framework/Scenes/EventManager.cs +++ b/OpenSim/Region/Framework/Scenes/EventManager.cs @@ -209,7 +209,7 @@ namespace OpenSim.Region.Framework.Scenes /// Triggered when an object or attachment enters a scene /// public event OnIncomingSceneObjectDelegate OnIncomingSceneObject; - public delegate void OnIncomingSceneObjectDelegate(SceneObjectGroup so); + public delegate void OnIncomingSceneObjectDelegate(SceneObjectGroup so); public delegate void NewInventoryItemUploadComplete(UUID avatarID, UUID assetID, string name, int userlevel); @@ -413,7 +413,7 @@ namespace OpenSim.Region.Framework.Scenes } } } - } + } public void TriggerGetScriptRunning(IClientAPI controllingClient, UUID objectID, UUID itemID) { @@ -433,7 +433,7 @@ namespace OpenSim.Region.Framework.Scenes e.Message, e.StackTrace); } } - } + } } public void TriggerOnScriptChangedEvent(uint localID, uint change) @@ -454,7 +454,7 @@ namespace OpenSim.Region.Framework.Scenes e.Message, e.StackTrace); } } - } + } } public void TriggerOnClientMovement(ScenePresence avatar) @@ -475,7 +475,7 @@ namespace OpenSim.Region.Framework.Scenes e.Message, e.StackTrace); } } - } + } } public void TriggerPermissionError(UUID user, string reason) @@ -496,7 +496,7 @@ namespace OpenSim.Region.Framework.Scenes e.Message, e.StackTrace); } } - } + } } public void TriggerOnPluginConsole(string[] args) @@ -517,7 +517,7 @@ namespace OpenSim.Region.Framework.Scenes e.Message, e.StackTrace); } } - } + } } public void TriggerOnFrame() @@ -538,11 +538,11 @@ namespace OpenSim.Region.Framework.Scenes e.Message, e.StackTrace); } } - } + } } public void TriggerOnNewClient(IClientAPI client) - { + { OnNewClientDelegate handlerNewClient = OnNewClient; if (handlerNewClient != null) { @@ -559,10 +559,10 @@ namespace OpenSim.Region.Framework.Scenes e.Message, e.StackTrace); } } - } + } if (client is IClientCore) - { + { OnClientConnectCoreDelegate handlerClientConnect = OnClientConnect; if (handlerClientConnect != null) { @@ -579,7 +579,7 @@ namespace OpenSim.Region.Framework.Scenes e.Message, e.StackTrace); } } - } + } } } @@ -601,11 +601,11 @@ namespace OpenSim.Region.Framework.Scenes e.Message, e.StackTrace); } } - } + } } public void TriggerOnRemovePresence(UUID agentId) - { + { OnRemovePresenceDelegate handlerRemovePresence = OnRemovePresence; if (handlerRemovePresence != null) { @@ -622,11 +622,11 @@ namespace OpenSim.Region.Framework.Scenes e.Message, e.StackTrace); } } - } + } } public void TriggerOnBackup(IRegionDataStore dstore) - { + { OnBackupDelegate handlerOnAttach = OnBackup; if (handlerOnAttach != null) { @@ -643,7 +643,7 @@ namespace OpenSim.Region.Framework.Scenes e.Message, e.StackTrace); } } - } + } } public void TriggerParcelPrimCountUpdate() @@ -664,7 +664,7 @@ namespace OpenSim.Region.Framework.Scenes e.Message, e.StackTrace); } } - } + } } public void TriggerMoneyTransfer(Object sender, MoneyTransferArgs args) @@ -685,7 +685,7 @@ namespace OpenSim.Region.Framework.Scenes e.Message, e.StackTrace); } } - } + } } public void TriggerTerrainTick() @@ -706,7 +706,7 @@ namespace OpenSim.Region.Framework.Scenes e.Message, e.StackTrace); } } - } + } } public void TriggerParcelPrimCountAdd(SceneObjectGroup obj) @@ -727,7 +727,7 @@ namespace OpenSim.Region.Framework.Scenes e.Message, e.StackTrace); } } - } + } } public void TriggerObjectBeingRemovedFromScene(SceneObjectGroup obj) @@ -748,11 +748,11 @@ namespace OpenSim.Region.Framework.Scenes e.Message, e.StackTrace); } } - } + } } public void TriggerShutdown() - { + { OnShutdownDelegate handlerShutdown = OnShutdown; if (handlerShutdown != null) { @@ -769,11 +769,11 @@ namespace OpenSim.Region.Framework.Scenes e.Message, e.StackTrace); } } - } + } } public void TriggerObjectGrab(uint localID, uint originalID, Vector3 offsetPos, IClientAPI remoteClient, SurfaceTouchEventArgs surfaceArgs) - { + { ObjectGrabDelegate handlerObjectGrab = OnObjectGrab; if (handlerObjectGrab != null) { @@ -790,11 +790,11 @@ namespace OpenSim.Region.Framework.Scenes e.Message, e.StackTrace); } } - } + } } public void TriggerObjectGrabbing(uint localID, uint originalID, Vector3 offsetPos, IClientAPI remoteClient, SurfaceTouchEventArgs surfaceArgs) - { + { ObjectGrabDelegate handlerObjectGrabbing = OnObjectGrabbing; if (handlerObjectGrabbing != null) { @@ -811,11 +811,11 @@ namespace OpenSim.Region.Framework.Scenes e.Message, e.StackTrace); } } - } + } } public void TriggerObjectDeGrab(uint localID, uint originalID, IClientAPI remoteClient, SurfaceTouchEventArgs surfaceArgs) - { + { ObjectDeGrabDelegate handlerObjectDeGrab = OnObjectDeGrab; if (handlerObjectDeGrab != null) { @@ -832,11 +832,11 @@ namespace OpenSim.Region.Framework.Scenes e.Message, e.StackTrace); } } - } + } } public void TriggerScriptReset(uint localID, UUID itemID) - { + { ScriptResetDelegate handlerScriptReset = OnScriptReset; if (handlerScriptReset != null) { @@ -853,11 +853,11 @@ namespace OpenSim.Region.Framework.Scenes e.Message, e.StackTrace); } } - } + } } public void TriggerRezScript(uint localID, UUID itemID, string script, int startParam, bool postOnRez, string engine, int stateSource) - { + { NewRezScript handlerRezScript = OnRezScript; if (handlerRezScript != null) { @@ -874,7 +874,7 @@ namespace OpenSim.Region.Framework.Scenes e.Message, e.StackTrace); } } - } + } } public void TriggerStartScript(uint localID, UUID itemID) @@ -895,7 +895,7 @@ namespace OpenSim.Region.Framework.Scenes e.Message, e.StackTrace); } } - } + } } public void TriggerStopScript(uint localID, UUID itemID) @@ -916,11 +916,11 @@ namespace OpenSim.Region.Framework.Scenes e.Message, e.StackTrace); } } - } + } } public void TriggerRemoveScript(uint localID, UUID itemID) - { + { RemoveScript handlerRemoveScript = OnRemoveScript; if (handlerRemoveScript != null) { @@ -937,7 +937,7 @@ namespace OpenSim.Region.Framework.Scenes e.Message, e.StackTrace); } } - } + } } public bool TriggerGroupMove(UUID groupID, Vector3 delta) @@ -1036,7 +1036,7 @@ namespace OpenSim.Region.Framework.Scenes e.Message, e.StackTrace); } } - } + } } public void TriggerLandObjectAdded(ILandObject newParcel) @@ -1057,7 +1057,7 @@ namespace OpenSim.Region.Framework.Scenes e.Message, e.StackTrace); } } - } + } } public void TriggerLandObjectRemoved(UUID globalID) @@ -1078,7 +1078,7 @@ namespace OpenSim.Region.Framework.Scenes e.Message, e.StackTrace); } } - } + } } public void TriggerLandObjectUpdated(uint localParcelID, ILandObject newParcel) @@ -1104,7 +1104,7 @@ namespace OpenSim.Region.Framework.Scenes e.Message, e.StackTrace); } } - } + } } public void TriggerIncomingInstantMessage(GridInstantMessage message) @@ -1125,7 +1125,7 @@ namespace OpenSim.Region.Framework.Scenes e.Message, e.StackTrace); } } - } + } } public void TriggerUnhandledInstantMessage(GridInstantMessage message) @@ -1146,7 +1146,7 @@ namespace OpenSim.Region.Framework.Scenes e.Message, e.StackTrace); } } - } + } } public void TriggerClientClosed(UUID ClientID, Scene scene) @@ -1167,7 +1167,7 @@ namespace OpenSim.Region.Framework.Scenes e.Message, e.StackTrace); } } - } + } } public void TriggerOnMakeChildAgent(ScenePresence presence) @@ -1188,7 +1188,7 @@ namespace OpenSim.Region.Framework.Scenes e.Message, e.StackTrace); } } - } + } } public void TriggerOnMakeRootAgent(ScenePresence presence) @@ -1209,7 +1209,7 @@ namespace OpenSim.Region.Framework.Scenes e.Message, e.StackTrace); } } - } + } } public void TriggerOnIncomingSceneObject(SceneObjectGroup so) @@ -1229,12 +1229,12 @@ namespace OpenSim.Region.Framework.Scenes "[EVENT MANAGER]: Delegate for TriggerOnIncomingSceneObject failed - continuing. {0} {1}", e.Message, e.StackTrace); } - } + } } } public void TriggerOnRegisterCaps(UUID agentID, Caps caps) - { + { RegisterCapsEvent handlerRegisterCaps = OnRegisterCaps; if (handlerRegisterCaps != null) { @@ -1251,7 +1251,7 @@ namespace OpenSim.Region.Framework.Scenes e.Message, e.StackTrace); } } - } + } } public void TriggerOnDeregisterCaps(UUID agentID, Caps caps) @@ -1272,7 +1272,7 @@ namespace OpenSim.Region.Framework.Scenes e.Message, e.StackTrace); } } - } + } } public void TriggerOnNewInventoryItemUploadComplete(UUID agentID, UUID AssetID, String AssetName, int userlevel) @@ -1293,7 +1293,7 @@ namespace OpenSim.Region.Framework.Scenes e.Message, e.StackTrace); } } - } + } } public void TriggerLandBuy(Object sender, LandBuyArgs args) @@ -1314,7 +1314,7 @@ namespace OpenSim.Region.Framework.Scenes e.Message, e.StackTrace); } } - } + } } public void TriggerValidateLandBuy(Object sender, LandBuyArgs args) @@ -1335,11 +1335,11 @@ namespace OpenSim.Region.Framework.Scenes e.Message, e.StackTrace); } } - } + } } public void TriggerAtTargetEvent(uint localID, uint handle, Vector3 targetpos, Vector3 currentpos) - { + { ScriptAtTargetEvent handlerScriptAtTargetEvent = OnScriptAtTargetEvent; if (handlerScriptAtTargetEvent != null) { @@ -1356,7 +1356,7 @@ namespace OpenSim.Region.Framework.Scenes e.Message, e.StackTrace); } } - } + } } public void TriggerNotAtTargetEvent(uint localID) @@ -1377,11 +1377,11 @@ namespace OpenSim.Region.Framework.Scenes e.Message, e.StackTrace); } } - } + } } public void TriggerAtRotTargetEvent(uint localID, uint handle, Quaternion targetrot, Quaternion currentrot) - { + { ScriptAtRotTargetEvent handlerScriptAtRotTargetEvent = OnScriptAtRotTargetEvent; if (handlerScriptAtRotTargetEvent != null) { @@ -1398,7 +1398,7 @@ namespace OpenSim.Region.Framework.Scenes e.Message, e.StackTrace); } } - } + } } public void TriggerNotAtRotTargetEvent(uint localID) @@ -1419,7 +1419,7 @@ namespace OpenSim.Region.Framework.Scenes e.Message, e.StackTrace); } } - } + } } public void TriggerRequestChangeWaterHeight(float height) @@ -1440,7 +1440,7 @@ namespace OpenSim.Region.Framework.Scenes e.Message, e.StackTrace); } } - } + } } public void TriggerAvatarKill(uint KillerObjectLocalID, ScenePresence DeadAvatar) @@ -1461,7 +1461,7 @@ namespace OpenSim.Region.Framework.Scenes e.Message, e.StackTrace); } } - } + } } public void TriggerSignificantClientMovement(IClientAPI client) @@ -1482,7 +1482,7 @@ namespace OpenSim.Region.Framework.Scenes e.Message, e.StackTrace); } } - } + } } public void TriggerOnChatFromWorld(Object sender, OSChatMessage chat) @@ -1503,7 +1503,7 @@ namespace OpenSim.Region.Framework.Scenes e.Message, e.StackTrace); } } - } + } } public void TriggerOnChatFromClient(Object sender, OSChatMessage chat) @@ -1524,7 +1524,7 @@ namespace OpenSim.Region.Framework.Scenes e.Message, e.StackTrace); } } - } + } } public void TriggerOnChatBroadcast(Object sender, OSChatMessage chat) @@ -1545,7 +1545,7 @@ namespace OpenSim.Region.Framework.Scenes e.Message, e.StackTrace); } } - } + } } internal void TriggerControlEvent(uint p, UUID scriptUUID, UUID avatarID, uint held, uint _changed) @@ -1566,7 +1566,7 @@ namespace OpenSim.Region.Framework.Scenes e.Message, e.StackTrace); } } - } + } } public void TriggerNoticeNoLandDataFromStorage() @@ -1587,7 +1587,7 @@ namespace OpenSim.Region.Framework.Scenes e.Message, e.StackTrace); } } - } + } } public void TriggerIncomingLandDataFromStorage(List landData) @@ -1608,7 +1608,7 @@ namespace OpenSim.Region.Framework.Scenes e.Message, e.StackTrace); } } - } + } } public void TriggerSetAllowForcefulBan(bool allow) @@ -1629,7 +1629,7 @@ namespace OpenSim.Region.Framework.Scenes e.Message, e.StackTrace); } } - } + } } public void TriggerRequestParcelPrimCountUpdate() @@ -1650,7 +1650,7 @@ namespace OpenSim.Region.Framework.Scenes e.Message, e.StackTrace); } } - } + } } public void TriggerParcelPrimCountTainted() @@ -1671,7 +1671,7 @@ namespace OpenSim.Region.Framework.Scenes e.Message, e.StackTrace); } } - } + } } // this lets us keep track of nasty script events like timer, etc. @@ -1710,7 +1710,7 @@ namespace OpenSim.Region.Framework.Scenes e.Message, e.StackTrace); } } - } + } } public float GetCurrentTimeAsSunLindenHour() @@ -1737,7 +1737,7 @@ namespace OpenSim.Region.Framework.Scenes } public void TriggerOarFileLoaded(Guid requestId, string message) - { + { OarFileLoaded handlerOarFileLoaded = OnOarFileLoaded; if (handlerOarFileLoaded != null) { @@ -1754,7 +1754,7 @@ namespace OpenSim.Region.Framework.Scenes e.Message, e.StackTrace); } } - } + } } public void TriggerOarFileSaved(Guid requestId, string message) @@ -1775,7 +1775,7 @@ namespace OpenSim.Region.Framework.Scenes e.Message, e.StackTrace); } } - } + } } public void TriggerEmptyScriptCompileQueue(int numScriptsFailed, string message) @@ -1796,7 +1796,7 @@ namespace OpenSim.Region.Framework.Scenes e.Message, e.StackTrace); } } - } + } } public void TriggerScriptCollidingStart(uint localId, ColliderArgs colliders) @@ -1817,7 +1817,7 @@ namespace OpenSim.Region.Framework.Scenes e.Message, e.StackTrace); } } - } + } } public void TriggerScriptColliding(uint localId, ColliderArgs colliders) @@ -1838,7 +1838,7 @@ namespace OpenSim.Region.Framework.Scenes e.Message, e.StackTrace); } } - } + } } public void TriggerScriptCollidingEnd(uint localId, ColliderArgs colliders) @@ -1859,7 +1859,7 @@ namespace OpenSim.Region.Framework.Scenes e.Message, e.StackTrace); } } - } + } } public void TriggerScriptLandCollidingStart(uint localId, ColliderArgs colliders) @@ -1880,7 +1880,7 @@ namespace OpenSim.Region.Framework.Scenes e.Message, e.StackTrace); } } - } + } } public void TriggerScriptLandColliding(uint localId, ColliderArgs colliders) @@ -1901,7 +1901,7 @@ namespace OpenSim.Region.Framework.Scenes e.Message, e.StackTrace); } } - } + } } public void TriggerScriptLandCollidingEnd(uint localId, ColliderArgs colliders) @@ -1922,11 +1922,11 @@ namespace OpenSim.Region.Framework.Scenes e.Message, e.StackTrace); } } - } + } } public void TriggerSetRootAgentScene(UUID agentID, Scene scene) - { + { OnSetRootAgentSceneDelegate handlerSetRootAgentScene = OnSetRootAgentScene; if (handlerSetRootAgentScene != null) { @@ -1943,7 +1943,7 @@ namespace OpenSim.Region.Framework.Scenes e.Message, e.StackTrace); } } - } + } } public void TriggerOnRegionUp(GridRegion otherRegion) @@ -1964,7 +1964,7 @@ namespace OpenSim.Region.Framework.Scenes e.Message, e.StackTrace); } } - } + } } } } \ No newline at end of file diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs index 7df3e50792..c6cee753cb 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs @@ -585,6 +585,9 @@ namespace OpenSim.Region.Framework.Scenes m_log.Error("[AGENT INVENTORY]: Failed to find item " + oldItemID.ToString()); return; } + + if ((item.CurrentPermissions & (uint)PermissionMask.Copy) == 0) + return; } AssetBase asset = AssetService.Get(item.AssetID.ToString()); diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 2909311e07..41fd1e1567 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -1976,6 +1976,23 @@ namespace OpenSim.Region.Framework.Scenes return; } + if (grp.RootPart.RETURN_AT_EDGE) + { + // We remove the object here + try + { + List objects = new List(); + objects.Add(grp); + SceneObjectGroup[] objectsArray = objects.ToArray(); + returnObjects(objectsArray, UUID.Zero); + } + catch (Exception) + { + m_log.Warn("[DATABASE]: exception when trying to return the prim that crossed the border."); + } + return; + } + int thisx = (int)RegionInfo.RegionLocX; int thisy = (int)RegionInfo.RegionLocY; Vector3 EastCross = new Vector3(0.1f,0,0); @@ -2044,19 +2061,25 @@ namespace OpenSim.Region.Framework.Scenes Border crossedBordery = GetCrossedBorder(attemptedPosition + SouthCross, Cardinals.S); //(crossedBorderx.BorderLine.Z / (int)Constants.RegionSize) - if (crossedBordery.BorderLine.Z > 0) + try { - pos.Y = ((pos.Y + crossedBordery.BorderLine.Z)); - changeY = (int)(crossedBordery.BorderLine.Z / (int)Constants.RegionSize); - } - else - pos.Y = ((pos.Y + Constants.RegionSize)); + if (crossedBordery.BorderLine.Z > 0) + { + pos.Y = ((pos.Y + crossedBordery.BorderLine.Z)); + changeY = (int)(crossedBordery.BorderLine.Z / (int)Constants.RegionSize); + } + else + pos.Y = ((pos.Y + Constants.RegionSize)); - newRegionHandle - = Util.UIntsToLong((uint)((thisx - changeX) * Constants.RegionSize), - (uint)((thisy + changeY) * Constants.RegionSize)); - // x - 1 - // y + 1 + newRegionHandle + = Util.UIntsToLong((uint)((thisx - changeX) * Constants.RegionSize), + (uint)((thisy + changeY) * Constants.RegionSize)); + // x - 1 + // y + 1 + } + catch (Exception ex) + { + } } else { @@ -2518,7 +2541,7 @@ namespace OpenSim.Region.Framework.Scenes AttachObject( sp.ControllingClient, grp.LocalId, (uint)0, grp.GroupRotation, grp.AbsolutePosition, false); RootPrim.RemFlag(PrimFlags.TemporaryOnRez); - grp.SendGroupFullUpdate(); + grp.SendGroupFullUpdate(); } else { @@ -2684,6 +2707,7 @@ namespace OpenSim.Region.Framework.Scenes client.OnGrabUpdate += ProcessObjectGrabUpdate; client.OnDeGrabObject += ProcessObjectDeGrab; client.OnUndo += m_sceneGraph.HandleUndo; + client.OnRedo += m_sceneGraph.HandleRedo; client.OnObjectDescription += m_sceneGraph.PrimDescription; client.OnObjectDrop += m_sceneGraph.DropObject; client.OnObjectSaleInfo += ObjectSaleInfo; @@ -2838,6 +2862,7 @@ namespace OpenSim.Region.Framework.Scenes client.OnGrabObject -= ProcessObjectGrab; client.OnDeGrabObject -= ProcessObjectDeGrab; client.OnUndo -= m_sceneGraph.HandleUndo; + client.OnRedo -= m_sceneGraph.HandleRedo; client.OnObjectDescription -= m_sceneGraph.PrimDescription; client.OnObjectDrop -= m_sceneGraph.DropObject; client.OnObjectSaleInfo -= ObjectSaleInfo; diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs index 1ac061a1b2..321cc45f71 100644 --- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs +++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs @@ -452,6 +452,15 @@ namespace OpenSim.Region.Framework.Scenes part.Undo(); } } + protected internal void HandleRedo(IClientAPI remoteClient, UUID primId) + { + if (primId != UUID.Zero) + { + SceneObjectPart part = m_parentScene.GetSceneObjectPart(primId); + if (part != null) + part.Redo(); + } + } protected internal void HandleObjectGroupUpdate( IClientAPI remoteClient, UUID GroupID, uint objectLocalID, UUID Garbage) @@ -633,7 +642,7 @@ namespace OpenSim.Region.Framework.Scenes // it get cleaned up // group.RootPart.RemFlag(PrimFlags.TemporaryOnRez); - group.HasGroupChanged = false; + group.HasGroupChanged = false; } else { diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index 94e64e474b..6357192552 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs @@ -298,7 +298,16 @@ namespace OpenSim.Region.Framework.Scenes { m_scene.CrossPrimGroupIntoNewRegion(val, this, true); } - + if (RootPart.GetStatusSandbox()) + { + if (Util.GetDistanceTo(RootPart.StatusSandboxPos, value) > 10) + { + RootPart.ScriptSetPhysicsStatus(false); + Scene.SimChat(Utils.StringToBytes("Hit Sandbox Limit"), + ChatTypeEnum.DebugChannel, 0x7FFFFFFF, RootPart.AbsolutePosition, Name, UUID, false); + return; + } + } lock (m_parts) { foreach (SceneObjectPart part in m_parts.Values) @@ -398,6 +407,34 @@ namespace OpenSim.Region.Framework.Scenes } } + private SceneObjectPart m_PlaySoundMasterPrim = null; + public SceneObjectPart PlaySoundMasterPrim + { + get { return m_PlaySoundMasterPrim; } + set { m_PlaySoundMasterPrim = value; } + } + + private List m_PlaySoundSlavePrims = new List(); + public List PlaySoundSlavePrims + { + get { return m_LoopSoundSlavePrims; } + set { m_LoopSoundSlavePrims = value; } + } + + private SceneObjectPart m_LoopSoundMasterPrim = null; + public SceneObjectPart LoopSoundMasterPrim + { + get { return m_LoopSoundMasterPrim; } + set { m_LoopSoundMasterPrim = value; } + } + + private List m_LoopSoundSlavePrims = new List(); + public List LoopSoundSlavePrims + { + get { return m_LoopSoundSlavePrims; } + set { m_LoopSoundSlavePrims = value; } + } + // The UUID for the Region this Object is in. public UUID RegionUUID { @@ -1782,32 +1819,6 @@ namespace OpenSim.Region.Framework.Scenes } } - public void rotLookAt(Quaternion target, float strength, float damping) - { - SceneObjectPart rootpart = m_rootPart; - if (rootpart != null) - { - if (IsAttachment) - { - /* - ScenePresence avatar = m_scene.GetScenePresence(rootpart.AttachedAvatar); - if (avatar != null) - { - Rotate the Av? - } */ - } - else - { - if (rootpart.PhysActor != null) - { - rootpart.PhysActor.APIDTarget = new Quaternion(target.X, target.Y, target.Z, target.W); - rootpart.PhysActor.APIDStrength = strength; - rootpart.PhysActor.APIDDamping = damping; - rootpart.PhysActor.APIDActive = true; - } - } - } - } public void stopLookAt() { SceneObjectPart rootpart = m_rootPart; @@ -1966,6 +1977,8 @@ namespace OpenSim.Region.Framework.Scenes foreach (SceneObjectPart part in m_parts.Values) { + if (!IsSelected) + part.UpdateLookAt(); part.SendScheduledUpdates(); } } @@ -2467,11 +2480,14 @@ namespace OpenSim.Region.Framework.Scenes { if (m_rootPart.PhysActor.IsPhysical) { - Vector3 llmoveforce = pos - AbsolutePosition; - Vector3 grabforce = llmoveforce; - grabforce = (grabforce / 10) * m_rootPart.PhysActor.Mass; - m_rootPart.PhysActor.AddForce(grabforce,true); - m_scene.PhysicsScene.AddPhysicsActorTaint(m_rootPart.PhysActor); + if (!m_rootPart.BlockGrab) + { + Vector3 llmoveforce = pos - AbsolutePosition; + Vector3 grabforce = llmoveforce; + grabforce = (grabforce / 10) * m_rootPart.PhysActor.Mass; + m_rootPart.PhysActor.AddForce(grabforce, true); + m_scene.PhysicsScene.AddPhysicsActorTaint(m_rootPart.PhysActor); + } } else { @@ -2827,6 +2843,7 @@ namespace OpenSim.Region.Framework.Scenes SceneObjectPart part = GetChildPart(localID); if (part != null) { + part.IgnoreUndoUpdate = true; if (scale.X > m_scene.m_maxNonphys) scale.X = m_scene.m_maxNonphys; if (scale.Y > m_scene.m_maxNonphys) @@ -2854,6 +2871,7 @@ namespace OpenSim.Region.Framework.Scenes { if (obPart.UUID != m_rootPart.UUID) { + obPart.IgnoreUndoUpdate = true; Vector3 oldSize = new Vector3(obPart.Scale); float f = 1.0f; @@ -2913,6 +2931,8 @@ namespace OpenSim.Region.Framework.Scenes z *= a; } } + obPart.IgnoreUndoUpdate = false; + obPart.StoreUndoState(); } } } @@ -2928,6 +2948,7 @@ namespace OpenSim.Region.Framework.Scenes { foreach (SceneObjectPart obPart in m_parts.Values) { + obPart.IgnoreUndoUpdate = true; if (obPart.UUID != m_rootPart.UUID) { Vector3 currentpos = new Vector3(obPart.OffsetPosition); @@ -2941,6 +2962,8 @@ namespace OpenSim.Region.Framework.Scenes obPart.Resize(newSize); obPart.UpdateOffSet(currentpos); } + obPart.IgnoreUndoUpdate = false; + obPart.StoreUndoState(); } } @@ -2950,6 +2973,8 @@ namespace OpenSim.Region.Framework.Scenes m_scene.PhysicsScene.AddPhysicsActorTaint(part.PhysActor); } + part.IgnoreUndoUpdate = false; + part.StoreUndoState(); HasGroupChanged = true; ScheduleGroupForTerseUpdate(); } @@ -2965,13 +2990,26 @@ namespace OpenSim.Region.Framework.Scenes /// public void UpdateGroupPosition(Vector3 pos) { + foreach (SceneObjectPart part in Children.Values) + { + part.StoreUndoState(); + } if (m_scene.EventManager.TriggerGroupMove(UUID, pos)) { if (IsAttachment) { m_rootPart.AttachedPos = pos; } - + if (RootPart.GetStatusSandbox()) + { + if (Util.GetDistanceTo(RootPart.StatusSandboxPos, pos) > 10) + { + RootPart.ScriptSetPhysicsStatus(false); + pos = AbsolutePosition; + Scene.SimChat(Utils.StringToBytes("Hit Sandbox Limit"), + ChatTypeEnum.DebugChannel, 0x7FFFFFFF, RootPart.AbsolutePosition, Name, UUID, false); + } + } AbsolutePosition = pos; HasGroupChanged = true; @@ -2990,7 +3028,10 @@ namespace OpenSim.Region.Framework.Scenes public void UpdateSinglePosition(Vector3 pos, uint localID) { SceneObjectPart part = GetChildPart(localID); - + foreach (SceneObjectPart parts in Children.Values) + { + parts.StoreUndoState(); + } if (part != null) { if (part.UUID == m_rootPart.UUID) @@ -3012,6 +3053,10 @@ namespace OpenSim.Region.Framework.Scenes /// private void UpdateRootPosition(Vector3 pos) { + foreach (SceneObjectPart part in Children.Values) + { + part.StoreUndoState(); + } Vector3 newPos = new Vector3(pos.X, pos.Y, pos.Z); Vector3 oldPos = new Vector3(AbsolutePosition.X + m_rootPart.OffsetPosition.X, @@ -3055,6 +3100,10 @@ namespace OpenSim.Region.Framework.Scenes /// public void UpdateGroupRotationR(Quaternion rot) { + foreach (SceneObjectPart parts in Children.Values) + { + parts.StoreUndoState(); + } m_rootPart.UpdateRotation(rot); PhysicsActor actor = m_rootPart.PhysActor; @@ -3075,6 +3124,10 @@ namespace OpenSim.Region.Framework.Scenes /// public void UpdateGroupRotationPR(Vector3 pos, Quaternion rot) { + foreach (SceneObjectPart parts in Children.Values) + { + parts.StoreUndoState(); + } m_rootPart.UpdateRotation(rot); PhysicsActor actor = m_rootPart.PhysActor; @@ -3098,6 +3151,10 @@ namespace OpenSim.Region.Framework.Scenes public void UpdateSingleRotation(Quaternion rot, uint localID) { SceneObjectPart part = GetChildPart(localID); + foreach (SceneObjectPart parts in Children.Values) + { + parts.StoreUndoState(); + } if (part != null) { if (part.UUID == m_rootPart.UUID) @@ -3128,8 +3185,11 @@ namespace OpenSim.Region.Framework.Scenes } else { + part.IgnoreUndoUpdate = true; part.UpdateRotation(rot); part.OffsetPosition = pos; + part.IgnoreUndoUpdate = false; + part.StoreUndoState(); } } } @@ -3143,6 +3203,7 @@ namespace OpenSim.Region.Framework.Scenes Quaternion axRot = rot; Quaternion oldParentRot = m_rootPart.RotationOffset; + m_rootPart.StoreUndoState(); m_rootPart.UpdateRotation(rot); if (m_rootPart.PhysActor != null) { @@ -3156,6 +3217,7 @@ namespace OpenSim.Region.Framework.Scenes { if (prim.UUID != m_rootPart.UUID) { + prim.IgnoreUndoUpdate = true; Vector3 axPos = prim.OffsetPosition; axPos *= oldParentRot; axPos *= Quaternion.Inverse(axRot); @@ -3168,7 +3230,14 @@ namespace OpenSim.Region.Framework.Scenes } } } - + foreach (SceneObjectPart childpart in Children.Values) + { + if (childpart != m_rootPart) + { + childpart.IgnoreUndoUpdate = false; + childpart.StoreUndoState(); + } + } m_rootPart.ScheduleTerseUpdate(); } diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index dd797fcdae..5c283bc4fe 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -133,6 +133,18 @@ namespace OpenSim.Region.Framework.Scenes [XmlIgnore] public bool DIE_AT_EDGE; + [XmlIgnore] + public bool RETURN_AT_EDGE; + + [XmlIgnore] + public bool BlockGrab; + + [XmlIgnore] + public bool StatusSandbox; + + [XmlIgnore] + public Vector3 StatusSandboxPos; + // TODO: This needs to be persisted in next XML version update! [XmlIgnore] public readonly int[] PayPrice = {-2,-2,-2,-2,-2}; @@ -219,6 +231,15 @@ namespace OpenSim.Region.Framework.Scenes [XmlIgnore] public Quaternion SpinOldOrientation = Quaternion.Identity; + [XmlIgnore] + public Quaternion m_APIDTarget = Quaternion.Identity; + + [XmlIgnore] + public float m_APIDDamp = 0; + + [XmlIgnore] + public float m_APIDStrength = 0; + /// /// This part's inventory /// @@ -232,6 +253,9 @@ namespace OpenSim.Region.Framework.Scenes [XmlIgnore] public bool Undoing; + [XmlIgnore] + public bool IgnoreUndoUpdate = false; + [XmlIgnore] private PrimFlags LocalFlags; [XmlIgnore] @@ -253,6 +277,7 @@ namespace OpenSim.Region.Framework.Scenes private string m_text = String.Empty; private string m_touchName = String.Empty; private readonly UndoStack m_undo = new UndoStack(5); + private readonly UndoStack m_redo = new UndoStack(5); private UUID _creatorID; private bool m_passTouches; @@ -501,6 +526,27 @@ namespace OpenSim.Region.Framework.Scenes } } + [XmlIgnore] + public Quaternion APIDTarget + { + get { return m_APIDTarget; } + set { m_APIDTarget = value; } + } + + [XmlIgnore] + public float APIDDamp + { + get { return m_APIDDamp; } + set { m_APIDDamp = value; } + } + + [XmlIgnore] + public float APIDStrength + { + get { return m_APIDStrength; } + set { m_APIDStrength = value; } + } + public ulong RegionHandle { get { return m_regionHandle; } @@ -512,6 +558,33 @@ namespace OpenSim.Region.Framework.Scenes get { return m_scriptAccessPin; } set { m_scriptAccessPin = (int)value; } } + private SceneObjectPart m_PlaySoundMasterPrim = null; + public SceneObjectPart PlaySoundMasterPrim + { + get { return m_PlaySoundMasterPrim; } + set { m_PlaySoundMasterPrim = value; } + } + + private List m_PlaySoundSlavePrims = new List(); + public List PlaySoundSlavePrims + { + get { return m_LoopSoundSlavePrims; } + set { m_LoopSoundSlavePrims = value; } + } + + private SceneObjectPart m_LoopSoundMasterPrim = null; + public SceneObjectPart LoopSoundMasterPrim + { + get { return m_LoopSoundMasterPrim; } + set { m_LoopSoundMasterPrim = value; } + } + + private List m_LoopSoundSlavePrims = new List(); + public List LoopSoundSlavePrims + { + get { return m_LoopSoundSlavePrims; } + set { m_LoopSoundSlavePrims = value; } + } [XmlIgnore] public Byte[] TextureAnimation @@ -573,8 +646,6 @@ namespace OpenSim.Region.Framework.Scenes } set { - StoreUndoState(); - m_groupPosition = value; PhysicsActor actor = PhysActor; @@ -1401,6 +1472,10 @@ namespace OpenSim.Region.Framework.Scenes { m_undo.Clear(); } + lock (m_redo) + { + m_redo.Clear(); + } StoreUndoState(); } @@ -1711,6 +1786,66 @@ namespace OpenSim.Region.Framework.Scenes return m_parentGroup.RootPart.DIE_AT_EDGE; } + public bool GetReturnAtEdge() + { + if (m_parentGroup == null) + return false; + if (m_parentGroup.IsDeleted) + return false; + + return m_parentGroup.RootPart.RETURN_AT_EDGE; + } + + public void SetReturnAtEdge(bool p) + { + if (m_parentGroup == null) + return; + if (m_parentGroup.IsDeleted) + return; + + m_parentGroup.RootPart.RETURN_AT_EDGE = p; + } + + public bool GetBlockGrab() + { + if (m_parentGroup == null) + return false; + if (m_parentGroup.IsDeleted) + return false; + + return m_parentGroup.RootPart.BlockGrab; + } + + public void SetBlockGrab(bool p) + { + if (m_parentGroup == null) + return; + if (m_parentGroup.IsDeleted) + return; + + m_parentGroup.RootPart.BlockGrab = p; + } + + public void SetStatusSandbox(bool p) + { + if (m_parentGroup == null) + return; + if (m_parentGroup.IsDeleted) + return; + StatusSandboxPos = m_parentGroup.RootPart.AbsolutePosition; + m_parentGroup.RootPart.StatusSandbox = p; + } + + public bool GetStatusSandbox() + { + if (m_parentGroup == null) + return false; + if (m_parentGroup.IsDeleted) + return false; + + return m_parentGroup.RootPart.StatusSandbox; + } + public int GetAxisRotation(int axis) { //Cannot use ScriptBaseClass constants as no referance to it currently. @@ -1917,7 +2052,7 @@ namespace OpenSim.Region.Framework.Scenes // play the sound. if (startedColliders.Count > 0 && CollisionSound != UUID.Zero && CollisionSoundVolume > 0.0f) { - SendSound(CollisionSound.ToString(), CollisionSoundVolume, true, (byte)0); + SendSound(CollisionSound.ToString(), CollisionSoundVolume, true, (byte)0, 0, false, false); } if ((m_parentGroup.RootPart.ScriptEvents & scriptEvents.collision_start) != 0) @@ -2491,9 +2626,8 @@ namespace OpenSim.Region.Framework.Scenes List avatarts = m_parentGroup.Scene.GetAvatars(); foreach (ScenePresence p in avatarts) { - // TODO: some filtering by distance of avatar - - p.ControllingClient.SendPreLoadSound(objectID, objectID, soundID); + if (!(Util.GetDistanceTo(p.AbsolutePosition, AbsolutePosition) >= 100)) + p.ControllingClient.SendPreLoadSound(objectID, objectID, soundID); } } @@ -2554,7 +2688,38 @@ namespace OpenSim.Region.Framework.Scenes public void RotLookAt(Quaternion target, float strength, float damping) { - m_parentGroup.rotLookAt(target, strength, damping); + rotLookAt(target, strength, damping); + } + + public void rotLookAt(Quaternion target, float strength, float damping) + { + if (IsAttachment) + { + /* + ScenePresence avatar = m_scene.GetScenePresence(rootpart.AttachedAvatar); + if (avatar != null) + { + Rotate the Av? + } */ + } + else + { + APIDDamp = damping; + APIDStrength = strength; + APIDTarget = target; + } + } + + public void startLookAt(Quaternion rot, float damp, float strength) + { + APIDDamp = damp; + APIDStrength = strength; + APIDTarget = rot; + } + + public void stopLookAt() + { + APIDTarget = Quaternion.Identity; } /// @@ -2814,7 +2979,7 @@ namespace OpenSim.Region.Framework.Scenes /// /// /// - public void SendSound(string sound, double volume, bool triggered, byte flags) + public void SendSound(string sound, double volume, bool triggered, byte flags, float radius, bool useMaster, bool isMaster) { if (volume > 1) volume = 1; @@ -2850,10 +3015,51 @@ namespace OpenSim.Region.Framework.Scenes ISoundModule soundModule = m_parentGroup.Scene.RequestModuleInterface(); if (soundModule != null) { - if (triggered) - soundModule.TriggerSound(soundID, ownerID, objectID, parentID, volume, position, regionHandle); + if (useMaster) + { + if (isMaster) + { + if (triggered) + soundModule.TriggerSound(soundID, ownerID, objectID, parentID, volume, position, regionHandle, radius); + else + soundModule.PlayAttachedSound(soundID, ownerID, objectID, volume, position, flags, radius); + ParentGroup.PlaySoundMasterPrim = this; + ownerID = this._ownerID; + objectID = this.UUID; + parentID = this.GetRootPartUUID(); + position = this.AbsolutePosition; // region local + regionHandle = this.ParentGroup.Scene.RegionInfo.RegionHandle; + if (triggered) + soundModule.TriggerSound(soundID, ownerID, objectID, parentID, volume, position, regionHandle, radius); + else + soundModule.PlayAttachedSound(soundID, ownerID, objectID, volume, position, flags, radius); + foreach (SceneObjectPart prim in ParentGroup.PlaySoundSlavePrims) + { + ownerID = prim._ownerID; + objectID = prim.UUID; + parentID = prim.GetRootPartUUID(); + position = prim.AbsolutePosition; // region local + regionHandle = prim.ParentGroup.Scene.RegionInfo.RegionHandle; + if (triggered) + soundModule.TriggerSound(soundID, ownerID, objectID, parentID, volume, position, regionHandle, radius); + else + soundModule.PlayAttachedSound(soundID, ownerID, objectID, volume, position, flags, radius); + } + ParentGroup.PlaySoundSlavePrims.Clear(); + ParentGroup.PlaySoundMasterPrim = null; + } + else + { + ParentGroup.PlaySoundSlavePrims.Add(this); + } + } else - soundModule.PlayAttachedSound(soundID, ownerID, objectID, volume, position, flags); + { + if (triggered) + soundModule.TriggerSound(soundID, ownerID, objectID, parentID, volume, position, regionHandle, radius); + else + soundModule.PlayAttachedSound(soundID, ownerID, objectID, volume, position, flags, radius); + } } } @@ -3156,6 +3362,14 @@ namespace OpenSim.Region.Framework.Scenes hasProfileCut = hasDimple; // is it the same thing? } + public void SetVehicleFlags(int param, bool remove) + { + if (PhysActor != null) + { + PhysActor.VehicleFlags(param, remove); + } + } + public void SetGroup(UUID groupID, IClientAPI client) { _groupID = groupID; @@ -3260,27 +3474,30 @@ namespace OpenSim.Region.Framework.Scenes { if (!Undoing) { - if (m_parentGroup != null) + if (!IgnoreUndoUpdate) { - lock (m_undo) + if (m_parentGroup != null) { - if (m_undo.Count > 0) + lock (m_undo) { - UndoState last = m_undo.Peek(); - if (last != null) + if (m_undo.Count > 0) { - if (last.Compare(this)) - return; + UndoState last = m_undo.Peek(); + if (last != null) + { + if (last.Compare(this)) + return; + } } + + if (m_parentGroup.GetSceneMaxUndo() > 0) + { + UndoState nUndo = new UndoState(this); + + m_undo.Push(nUndo); + } + } - - if (m_parentGroup.GetSceneMaxUndo() > 0) - { - UndoState nUndo = new UndoState(this); - - m_undo.Push(nUndo); - } - } } } @@ -3751,14 +3968,39 @@ namespace OpenSim.Region.Framework.Scenes lock (m_undo) { if (m_undo.Count > 0) + { + UndoState nUndo = null; + if (m_parentGroup.GetSceneMaxUndo() > 0) { - UndoState goback = m_undo.Pop(); - if (goback != null) - goback.PlaybackState(this); + nUndo = new UndoState(this); + } + UndoState goback = m_undo.Pop(); + if (goback != null) + { + goback.PlaybackState(this); + if (nUndo != null) + m_redo.Push(nUndo); + } } } } + public void Redo() + { + lock (m_redo) + { + if (m_parentGroup.GetSceneMaxUndo() > 0) + { + UndoState nUndo = new UndoState(this); + + m_undo.Push(nUndo); + } + UndoState gofwd = m_redo.Pop(); + if (gofwd != null) + gofwd.PlayfwdState(this); + } + } + public void UpdateExtraParam(ushort type, bool inUse, byte[] data) { m_shape.ReadInUpdateExtraParam(type, inUse, data); @@ -3802,6 +4044,18 @@ namespace OpenSim.Region.Framework.Scenes (pos.Z != OffsetPosition.Z)) { Vector3 newPos = new Vector3(pos.X, pos.Y, pos.Z); + + if (ParentGroup.RootPart.GetStatusSandbox()) + { + if (Util.GetDistanceTo(ParentGroup.RootPart.StatusSandboxPos, newPos) > 10) + { + ParentGroup.RootPart.ScriptSetPhysicsStatus(false); + newPos = OffsetPosition; + ParentGroup.Scene.SimChat(Utils.StringToBytes("Hit Sandbox Limit"), + ChatTypeEnum.DebugChannel, 0x7FFFFFFF, ParentGroup.RootPart.AbsolutePosition, Name, UUID, false); + } + } + OffsetPosition = newPos; ScheduleTerseUpdate(); } @@ -4094,7 +4348,6 @@ namespace OpenSim.Region.Framework.Scenes (rot.Z != RotationOffset.Z) || (rot.W != RotationOffset.W)) { - //StoreUndoState(); RotationOffset = rot; ParentGroup.HasGroupChanged = true; ScheduleTerseUpdate(); @@ -4278,7 +4531,7 @@ namespace OpenSim.Region.Framework.Scenes else { // m_log.DebugFormat( -// "[SCENE OBJECT PART]: Scheduling part {0} {1} for full update in aggregateScriptEvents()", Name, LocalId); +// "[SCENE OBJECT PART]: Scheduling part {0} {1} for full update in aggregateScriptEvents()", Name, LocalId); ScheduleFullUpdate(); } } @@ -4396,5 +4649,36 @@ namespace OpenSim.Region.Framework.Scenes Inventory.ApplyNextOwnerPermissions(); } + public void UpdateLookAt() + { + try + { + if (APIDTarget != Quaternion.Identity) + { + if (Single.IsNaN(APIDTarget.W) == true) + { + APIDTarget = Quaternion.Identity; + return; + } + Quaternion rot = RotationOffset; + Quaternion dir = (rot - APIDTarget); + float speed = ((APIDStrength / APIDDamp) * (float)(Math.PI / 180.0f)); + if (dir.Z > speed) + { + rot.Z -= speed; + } + if (dir.Z < -speed) + { + rot.Z += speed; + } + rot.Normalize(); + UpdateRotation(rot); + } + } + catch (Exception ex) + { + m_log.Error("[Physics] " + ex); + } + } } } diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs index 298ede9da5..a555eaec92 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs @@ -314,7 +314,7 @@ namespace OpenSim.Region.Framework.Scenes } ); } - } + } private void RestoreSavedScriptState(UUID oldID, UUID newID) { @@ -579,7 +579,7 @@ namespace OpenSim.Region.Framework.Scenes m_items.TryGetValue(itemId, out item); return item; - } + } /// /// Get inventory items by name. @@ -588,7 +588,7 @@ namespace OpenSim.Region.Framework.Scenes /// /// A list of inventory items with that name. /// If no inventory item has that name then an empty list is returned. - /// + /// public IList GetInventoryItems(string name) { IList items = new List(); diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 9c7559b2ec..49736633d4 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -164,6 +164,8 @@ namespace OpenSim.Region.Framework.Scenes private Quaternion m_bodyRot= Quaternion.Identity; + private Quaternion m_bodyRotPrevious = Quaternion.Identity; + private const int LAND_VELOCITYMAG_MAX = 12; public bool IsRestrictedToRegion; @@ -225,7 +227,7 @@ namespace OpenSim.Region.Framework.Scenes // Agent's Draw distance. protected float m_DrawDistance; - protected AvatarAppearance m_appearance; + protected AvatarAppearance m_appearance; // neighbouring regions we have enabled a child agent in // holds the seed cap for the child agent in that region @@ -508,6 +510,12 @@ namespace OpenSim.Region.Framework.Scenes set { m_bodyRot = value; } } + public Quaternion PreviousRotation + { + get { return m_bodyRotPrevious; } + set { m_bodyRotPrevious = value; } + } + /// /// If this is true, agent doesn't have a representation in this scene. /// this is an agent 'looking into' this scene from a nearby scene(region) @@ -640,7 +648,7 @@ namespace OpenSim.Region.Framework.Scenes #region Constructor(s) public ScenePresence() - { + { m_sendCourseLocationsMethod = SendCoarseLocationsDefault; CreateSceneViewer(); m_animator = new ScenePresenceAnimator(this); @@ -824,6 +832,31 @@ namespace OpenSim.Region.Framework.Scenes if (pos.X < 0 || pos.Y < 0 || pos.Z < 0) { Vector3 emergencyPos = new Vector3(((int)Constants.RegionSize * 0.5f), ((int)Constants.RegionSize * 0.5f), 128); + + if (pos.X < 0) + { + emergencyPos.X = (int)Constants.RegionSize + pos.X; + if (!(pos.Y < 0)) + emergencyPos.Y = pos.Y; + if (!(pos.Z < 0)) + emergencyPos.X = pos.X; + } + if (pos.Y < 0) + { + emergencyPos.Y = (int)Constants.RegionSize + pos.Y; + if (!(pos.X < 0)) + emergencyPos.X = pos.X; + if (!(pos.Z < 0)) + emergencyPos.Z = pos.Z; + } + if (pos.Z < 0) + { + if (!(pos.X < 0)) + emergencyPos.X = pos.X; + if (!(pos.Y < 0)) + emergencyPos.Y = pos.Y; + //Leave as 128 + } m_log.WarnFormat( "[SCENE PRESENCE]: MakeRootAgent() was given an illegal position of {0} for avatar {1}, {2}. Substituting {3}", @@ -2704,36 +2737,75 @@ namespace OpenSim.Region.Framework.Scenes { // Checks if where it's headed exists a region + bool needsTransit = false; if (m_scene.TestBorderCross(pos2, Cardinals.W)) { if (m_scene.TestBorderCross(pos2, Cardinals.S)) + { + needsTransit = true; neighbor = HaveNeighbor(Cardinals.SW, ref fix); + } else if (m_scene.TestBorderCross(pos2, Cardinals.N)) + { + needsTransit = true; neighbor = HaveNeighbor(Cardinals.NW, ref fix); + } else + { + needsTransit = true; neighbor = HaveNeighbor(Cardinals.W, ref fix); + } } else if (m_scene.TestBorderCross(pos2, Cardinals.E)) { if (m_scene.TestBorderCross(pos2, Cardinals.S)) + { + needsTransit = true; neighbor = HaveNeighbor(Cardinals.SE, ref fix); + } else if (m_scene.TestBorderCross(pos2, Cardinals.N)) + { + needsTransit = true; neighbor = HaveNeighbor(Cardinals.NE, ref fix); + } else + { + needsTransit = true; neighbor = HaveNeighbor(Cardinals.E, ref fix); + } } else if (m_scene.TestBorderCross(pos2, Cardinals.S)) + { + needsTransit = true; neighbor = HaveNeighbor(Cardinals.S, ref fix); + } else if (m_scene.TestBorderCross(pos2, Cardinals.N)) + { + needsTransit = true; neighbor = HaveNeighbor(Cardinals.N, ref fix); + } + - // Makes sure avatar does not end up outside region - if (neighbor < 0) - AbsolutePosition = new Vector3( - AbsolutePosition.X + 3*fix[0], - AbsolutePosition.Y + 3*fix[1], - AbsolutePosition.Z); + if (neighbor <= 0) + { + if (!needsTransit) + { + if (m_requestedSitTargetUUID == UUID.Zero) + { + Vector3 pos = AbsolutePosition; + if (AbsolutePosition.X < 0) + pos.X += Velocity.X; + else if (AbsolutePosition.X > Constants.RegionSize) + pos.X -= Velocity.X; + if (AbsolutePosition.Y < 0) + pos.Y += Velocity.Y; + else if (AbsolutePosition.Y > Constants.RegionSize) + pos.Y -= Velocity.Y; + AbsolutePosition = pos; + } + } + } else if (neighbor > 0) CrossToNewRegion(); } @@ -3193,7 +3265,7 @@ namespace OpenSim.Region.Framework.Scenes m_physicsActor.OnCollisionUpdate += PhysicsCollisionUpdate; m_physicsActor.OnOutOfBounds += OutOfBoundsCall; // Called for PhysicsActors when there's something wrong m_physicsActor.SubscribeEvents(500); - m_physicsActor.LocalID = LocalId; + m_physicsActor.LocalID = LocalId; } private void OutOfBoundsCall(Vector3 pos) @@ -3285,7 +3357,7 @@ namespace OpenSim.Region.Framework.Scenes } if (m_health <= 0) m_scene.EventManager.TriggerAvatarKill(killerObj, this); - } + } } public void setHealthWithUpdate(float health) diff --git a/OpenSim/Region/Framework/Scenes/UndoState.cs b/OpenSim/Region/Framework/Scenes/UndoState.cs index 713ff69d32..55e407ec5f 100644 --- a/OpenSim/Region/Framework/Scenes/UndoState.cs +++ b/OpenSim/Region/Framework/Scenes/UndoState.cs @@ -26,6 +26,7 @@ */ using OpenMetaverse; +using OpenSim.Region.Framework.Interfaces; namespace OpenSim.Region.Framework.Scenes { @@ -35,29 +36,21 @@ namespace OpenSim.Region.Framework.Scenes public Vector3 Scale = Vector3.Zero; public Quaternion Rotation = Quaternion.Identity; - public UndoState(Vector3 pos, Quaternion rot, Vector3 scale) - { - Position = pos; - Rotation = rot; - Scale = scale; - } - public UndoState(SceneObjectPart part) { if (part != null) { if (part.ParentID == 0) { - Position = part.AbsolutePosition; + Position = part.ParentGroup.AbsolutePosition; Rotation = part.RotationOffset; - + Scale = part.Shape.Scale; } else { Position = part.OffsetPosition; Rotation = part.RotationOffset; Scale = part.Shape.Scale; - } } } @@ -68,7 +61,7 @@ namespace OpenSim.Region.Framework.Scenes { if (part.ParentID == 0) { - if (Position == part.AbsolutePosition && Rotation == part.RotationOffset) + if (Position == part.ParentGroup.AbsolutePosition && Rotation == part.ParentGroup.Rotation) return true; else return false; @@ -93,24 +86,78 @@ namespace OpenSim.Region.Framework.Scenes if (part.ParentID == 0) { - part.ParentGroup.AbsolutePosition = Position; - part.UpdateRotation(Rotation); + if (Position != Vector3.Zero) + part.ParentGroup.AbsolutePosition = Position; + part.RotationOffset = Rotation; + if (Scale != Vector3.Zero) + part.Resize(Scale); part.ParentGroup.ScheduleGroupForTerseUpdate(); } else { - part.OffsetPosition = Position; + if (Position != Vector3.Zero) + part.OffsetPosition = Position; part.UpdateRotation(Rotation); - part.Resize(Scale); + if (Scale != Vector3.Zero) + part.Resize(Scale); part.ScheduleTerseUpdate(); + } + part.Undoing = false; + + } + } + public void PlayfwdState(SceneObjectPart part) + { + if (part != null) + { + part.Undoing = true; + + if (part.ParentID == 0) + { + if (Position != Vector3.Zero) + part.ParentGroup.AbsolutePosition = Position; + if (Rotation != Quaternion.Identity) + part.UpdateRotation(Rotation); + if (Scale != Vector3.Zero) + part.Resize(Scale); + part.ParentGroup.ScheduleGroupForTerseUpdate(); + } + else + { + if (Position != Vector3.Zero) + part.OffsetPosition = Position; + if (Rotation != Quaternion.Identity) + part.UpdateRotation(Rotation); + if (Scale != Vector3.Zero) + part.Resize(Scale); part.ScheduleTerseUpdate(); } part.Undoing = false; } } + } + public class LandUndoState + { + public ITerrainModule m_terrainModule; + public ITerrainChannel m_terrainChannel; - public UndoState() + public LandUndoState(ITerrainModule terrainModule, ITerrainChannel terrainChannel) { + m_terrainModule = terrainModule; + m_terrainChannel = terrainChannel; + } + + public bool Compare(ITerrainChannel terrainChannel) + { + if (m_terrainChannel != terrainChannel) + return false; + else + return false; + } + + public void PlaybackState() + { + m_terrainModule.UndoTerrain(m_terrainChannel); } } } diff --git a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs index b421623fb7..009dd37ad3 100644 --- a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs +++ b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs @@ -774,6 +774,8 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server public event UUIDNameRequest OnTeleportHomeRequest; public event ScriptAnswer OnScriptAnswer; public event AgentSit OnUndo; + public event AgentSit OnRedo; + public event LandUndo OnLandUndo; public event ForceReleaseControls OnForceReleaseControls; public event GodLandStatRequest OnLandStatRequest; public event DetailedEstateDataRequest OnDetailedEstateDataRequest; diff --git a/OpenSim/Region/OptionalModules/Scripting/Minimodule/SOPObject.cs b/OpenSim/Region/OptionalModules/Scripting/Minimodule/SOPObject.cs index 31f28e0355..5bfe4bedce 100644 --- a/OpenSim/Region/OptionalModules/Scripting/Minimodule/SOPObject.cs +++ b/OpenSim/Region/OptionalModules/Scripting/Minimodule/SOPObject.cs @@ -767,7 +767,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule if (!CanEdit()) return; - GetSOP().SendSound(asset.ToString(), volume, true, 0); + GetSOP().SendSound(asset.ToString(), volume, true, 0, 0, false, false); } #endregion diff --git a/OpenSim/Region/OptionalModules/Scripting/Minimodule/World.cs b/OpenSim/Region/OptionalModules/Scripting/Minimodule/World.cs index c7cd37b2df..45bb005903 100644 --- a/OpenSim/Region/OptionalModules/Scripting/Minimodule/World.cs +++ b/OpenSim/Region/OptionalModules/Scripting/Minimodule/World.cs @@ -231,7 +231,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule if (soundModule != null) { soundModule.TriggerSound(audio, UUID.Zero, UUID.Zero, UUID.Zero, volume, position, - m_internalScene.RegionInfo.RegionHandle); + m_internalScene.RegionInfo.RegionHandle, 0); } } @@ -241,7 +241,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule if (soundModule != null) { soundModule.TriggerSound(audio, UUID.Zero, UUID.Zero, UUID.Zero, 1.0, position, - m_internalScene.RegionInfo.RegionHandle); + m_internalScene.RegionInfo.RegionHandle, 0); } } diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs index 1d15552993..b331001a84 100644 --- a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs +++ b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs @@ -298,6 +298,8 @@ namespace OpenSim.Region.OptionalModules.World.NPC public event ObjectBuy OnObjectBuy; public event BuyObjectInventory OnBuyObjectInventory; public event AgentSit OnUndo; + public event AgentSit OnRedo; + public event LandUndo OnLandUndo; public event ForceReleaseControls OnForceReleaseControls; public event GodLandStatRequest OnLandStatRequest; diff --git a/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsActor.cs b/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsActor.cs index 31366db75b..5e2eeebc44 100644 --- a/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsActor.cs +++ b/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsActor.cs @@ -185,6 +185,11 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin } + public override void VehicleFlags(int param, bool remove) + { + + } + public override void SetVolumeDetect(int param) { diff --git a/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETCharacter.cs b/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETCharacter.cs index 97eb6a2e5e..6a54705cb1 100644 --- a/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETCharacter.cs +++ b/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETCharacter.cs @@ -362,6 +362,11 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin } + public override void VehicleFlags(int param, bool remove) + { + + } + public override void SetVolumeDetect(int param) { diff --git a/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETPrim.cs b/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETPrim.cs index 9603ea4571..920ed96ee7 100644 --- a/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETPrim.cs +++ b/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETPrim.cs @@ -397,6 +397,11 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin //TODO: } + public override void VehicleFlags(int param, bool remove) + { + + } + public override void SetVolumeDetect(int param) { //TODO: GhostObject diff --git a/OpenSim/Region/Physics/BulletXPlugin/BulletXPlugin.cs b/OpenSim/Region/Physics/BulletXPlugin/BulletXPlugin.cs index d5d146e11a..e2a6a2ed11 100644 --- a/OpenSim/Region/Physics/BulletXPlugin/BulletXPlugin.cs +++ b/OpenSim/Region/Physics/BulletXPlugin/BulletXPlugin.cs @@ -500,6 +500,18 @@ namespace OpenSim.Region.Physics.BulletXPlugin public BulletXScene(String sceneIdentifier) { //identifier = sceneIdentifier; + cDispatcher = new CollisionDispatcherLocal(this); + Vector3 worldMinDim = new Vector3((float)minXY, (float)minXY, (float)minZ); + Vector3 worldMaxDim = new Vector3((float)maxXY, (float)maxXY, (float)maxZ); + opCache = new AxisSweep3(worldMinDim, worldMaxDim, maxHandles); + sicSolver = new SequentialImpulseConstraintSolver(); + + lock (BulletXLock) + { + ddWorld = new DiscreteDynamicsWorld(cDispatcher, opCache, sicSolver); + ddWorld.Gravity = new Vector3(0, 0, -gravity); + } + //this._heightmap = new float[65536]; } public static float Gravity @@ -582,12 +594,12 @@ namespace OpenSim.Region.Physics.BulletXPlugin pos.Y = position.Y; pos.Z = position.Z + 20; BulletXCharacter newAv = null; - newAv.Flying = isFlying; lock (BulletXLock) { newAv = new BulletXCharacter(avName, this, pos); _characters.Add(newAv.RigidBody, newAv); } + newAv.Flying = isFlying; return newAv; } @@ -983,6 +995,11 @@ namespace OpenSim.Region.Physics.BulletXPlugin public override void VehicleRotationParam(int param, OpenMetaverse.Quaternion rotation) { + } + + public override void VehicleFlags(int param, bool remove) + { + } public override void SetVolumeDetect(int param) diff --git a/OpenSim/Region/Physics/Manager/PhysicsActor.cs b/OpenSim/Region/Physics/Manager/PhysicsActor.cs index 9c192ede80..880c3ea3cb 100644 --- a/OpenSim/Region/Physics/Manager/PhysicsActor.cs +++ b/OpenSim/Region/Physics/Manager/PhysicsActor.cs @@ -208,6 +208,7 @@ namespace OpenSim.Region.Physics.Manager public abstract void VehicleFloatParam(int param, float value); public abstract void VehicleVectorParam(int param, Vector3 value); public abstract void VehicleRotationParam(int param, Quaternion rotation); + public abstract void VehicleFlags(int param, bool remove); public abstract void SetVolumeDetect(int param); // Allows the detection of collisions with inherently non-physical prims. see llVolumeDetect for more @@ -352,6 +353,11 @@ namespace OpenSim.Region.Physics.Manager } + public override void VehicleFlags(int param, bool remove) + { + + } + public override void SetVolumeDetect(int param) { diff --git a/OpenSim/Region/Physics/Manager/VehicleConstants.cs b/OpenSim/Region/Physics/Manager/VehicleConstants.cs index 532e55e5fc..f0775c1a8e 100644 --- a/OpenSim/Region/Physics/Manager/VehicleConstants.cs +++ b/OpenSim/Region/Physics/Manager/VehicleConstants.cs @@ -91,7 +91,9 @@ namespace OpenSim.Region.Physics.Manager BANKING_EFFICIENCY = 38, BANKING_MIX = 39, BANKING_TIMESCALE = 40, - REFERENCE_FRAME = 44 + REFERENCE_FRAME = 44, + BLOCK_EXIT = 45, + ROLL_FRAME = 46 } @@ -107,7 +109,13 @@ namespace OpenSim.Region.Physics.Manager LIMIT_MOTOR_UP = 64, MOUSELOOK_STEER = 128, MOUSELOOK_BANK = 256, - CAMERA_DECOUPLED = 512 + CAMERA_DECOUPLED = 512, + NO_X = 1024, + NO_Y = 2048, + NO_Z = 4096, + LOCK_HOVER_HEIGHT = 8192, + NO_DEFLECTION = 16392, + LOCK_ROTATION = 32784 } } diff --git a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs index 06ed8fb20d..a2229e8aa5 100644 --- a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs +++ b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs @@ -734,6 +734,11 @@ namespace OpenSim.Region.Physics.OdePlugin } + public override void VehicleFlags(int param, bool remove) + { + + } + public override void SetVolumeDetect(int param) { diff --git a/OpenSim/Region/Physics/OdePlugin/ODEDynamics.cs b/OpenSim/Region/Physics/OdePlugin/ODEDynamics.cs index 008070b687..9beeabba0a 100644 --- a/OpenSim/Region/Physics/OdePlugin/ODEDynamics.cs +++ b/OpenSim/Region/Physics/OdePlugin/ODEDynamics.cs @@ -72,37 +72,40 @@ namespace OpenSim.Region.Physics.OdePlugin // Vehicle properties - private Vehicle m_type = Vehicle.TYPE_NONE; // If a 'VEHICLE', and what kind - // private Quaternion m_referenceFrame = Quaternion.Identity; // Axis modifier - private VehicleFlag m_flags = (VehicleFlag) 0; // Boolean settings: - // HOVER_TERRAIN_ONLY - // HOVER_GLOBAL_HEIGHT - // NO_DEFLECTION_UP - // HOVER_WATER_ONLY - // HOVER_UP_ONLY - // LIMIT_MOTOR_UP - // LIMIT_ROLL_ONLY - + private Vehicle m_type = Vehicle.TYPE_NONE; // If a 'VEHICLE', and what kind + // private Quaternion m_referenceFrame = Quaternion.Identity; // Axis modifier + private VehicleFlag m_flags = (VehicleFlag) 0; // Boolean settings: + // HOVER_TERRAIN_ONLY + // HOVER_GLOBAL_HEIGHT + // NO_DEFLECTION_UP + // HOVER_WATER_ONLY + // HOVER_UP_ONLY + // LIMIT_MOTOR_UP + // LIMIT_ROLL_ONLY + private VehicleFlag m_Hoverflags = (VehicleFlag)0; + private Vector3 m_BlockingEndPoint = Vector3.Zero; + private Quaternion m_RollreferenceFrame = Quaternion.Identity; // Linear properties - private Vector3 m_linearMotorDirection = Vector3.Zero; // velocity requested by LSL, decayed by time - private Vector3 m_linearMotorDirectionLASTSET = Vector3.Zero; // velocity requested by LSL - private Vector3 m_dir = Vector3.Zero; // velocity applied to body + private Vector3 m_linearMotorDirection = Vector3.Zero; // velocity requested by LSL, decayed by time + private Vector3 m_linearMotorDirectionLASTSET = Vector3.Zero; // velocity requested by LSL + private Vector3 m_dir = Vector3.Zero; // velocity applied to body private Vector3 m_linearFrictionTimescale = Vector3.Zero; private float m_linearMotorDecayTimescale = 0; private float m_linearMotorTimescale = 0; private Vector3 m_lastLinearVelocityVector = Vector3.Zero; + private d.Vector3 m_lastPositionVector = new d.Vector3(); // private bool m_LinearMotorSetLastFrame = false; // private Vector3 m_linearMotorOffset = Vector3.Zero; //Angular properties - private Vector3 m_angularMotorDirection = Vector3.Zero; // angular velocity requested by LSL motor - private int m_angularMotorApply = 0; // application frame counter - private Vector3 m_angularMotorVelocity = Vector3.Zero; // current angular motor velocity - private float m_angularMotorTimescale = 0; // motor angular velocity ramp up rate - private float m_angularMotorDecayTimescale = 0; // motor angular velocity decay rate - private Vector3 m_angularFrictionTimescale = Vector3.Zero; // body angular velocity decay rate - private Vector3 m_lastAngularVelocity = Vector3.Zero; // what was last applied to body - // private Vector3 m_lastVertAttractor = Vector3.Zero; // what VA was last applied to body + private Vector3 m_angularMotorDirection = Vector3.Zero; // angular velocity requested by LSL motor + private int m_angularMotorApply = 0; // application frame counter + private Vector3 m_angularMotorVelocity = Vector3.Zero; // current angular motor velocity + private float m_angularMotorTimescale = 0; // motor angular velocity ramp up rate + private float m_angularMotorDecayTimescale = 0; // motor angular velocity decay rate + private Vector3 m_angularFrictionTimescale = Vector3.Zero; // body angular velocity decay rate + private Vector3 m_lastAngularVelocity = Vector3.Zero; // what was last applied to body + // private Vector3 m_lastVertAttractor = Vector3.Zero; // what VA was last applied to body //Deflection properties // private float m_angularDeflectionEfficiency = 0; @@ -120,14 +123,14 @@ namespace OpenSim.Region.Physics.OdePlugin // private float m_VhoverEfficiency = 0f; private float m_VhoverTimescale = 0f; private float m_VhoverTargetHeight = -1.0f; // if <0 then no hover, else its the current target height - private float m_VehicleBuoyancy = 0f; //KF: m_VehicleBuoyancy is set by VEHICLE_BUOYANCY for a vehicle. + private float m_VehicleBuoyancy = 0f; //KF: m_VehicleBuoyancy is set by VEHICLE_BUOYANCY for a vehicle. // Modifies gravity. Slider between -1 (double-gravity) and 1 (full anti-gravity) // KF: So far I have found no good method to combine a script-requested .Z velocity and gravity. // Therefore only m_VehicleBuoyancy=1 (0g) will use the script-requested .Z velocity. - //Attractor properties - private float m_verticalAttractionEfficiency = 1.0f; // damped - private float m_verticalAttractionTimescale = 500f; // Timescale > 300 means no vert attractor. + //Attractor properties + private float m_verticalAttractionEfficiency = 1.0f; // damped + private float m_verticalAttractionTimescale = 500f; // Timescale > 300 means no vert attractor. internal void ProcessFloatVehicleParam(Vehicle pParam, float pValue) { @@ -255,6 +258,9 @@ namespace OpenSim.Region.Physics.OdePlugin case Vehicle.LINEAR_MOTOR_OFFSET: // m_linearMotorOffset = new Vector3(pValue.X, pValue.Y, pValue.Z); break; + case Vehicle.BLOCK_EXIT: + m_BlockingEndPoint = new Vector3(pValue.X, pValue.Y, pValue.Z); + break; } }//end ProcessVectorVehicleParam @@ -265,15 +271,189 @@ namespace OpenSim.Region.Physics.OdePlugin case Vehicle.REFERENCE_FRAME: // m_referenceFrame = pValue; break; + case Vehicle.ROLL_FRAME: + m_RollreferenceFrame = pValue; + break; } }//end ProcessRotationVehicleParam + internal void ProcessVehicleFlags(int pParam, bool remove) + { + if (remove) + { + if (pParam == -1) + { + m_flags = (VehicleFlag)0; + m_Hoverflags = (VehicleFlag)0; + return; + } + if ((pParam & (int)VehicleFlag.HOVER_GLOBAL_HEIGHT) == (int)VehicleFlag.HOVER_GLOBAL_HEIGHT) + { + if ((m_Hoverflags & VehicleFlag.HOVER_GLOBAL_HEIGHT) != (VehicleFlag)0) + m_Hoverflags &= ~(VehicleFlag.HOVER_GLOBAL_HEIGHT); + } + if ((pParam & (int)VehicleFlag.HOVER_TERRAIN_ONLY) == (int)VehicleFlag.HOVER_TERRAIN_ONLY) + { + if ((m_Hoverflags & VehicleFlag.HOVER_TERRAIN_ONLY) != (VehicleFlag)0) + m_Hoverflags &= ~(VehicleFlag.HOVER_TERRAIN_ONLY); + } + if ((pParam & (int)VehicleFlag.HOVER_UP_ONLY) == (int)VehicleFlag.HOVER_UP_ONLY) + { + if ((m_Hoverflags & VehicleFlag.HOVER_UP_ONLY) != (VehicleFlag)0) + m_Hoverflags &= ~(VehicleFlag.HOVER_UP_ONLY); + } + if ((pParam & (int)VehicleFlag.HOVER_WATER_ONLY) == (int)VehicleFlag.HOVER_WATER_ONLY) + { + if ((m_Hoverflags & VehicleFlag.HOVER_WATER_ONLY) != (VehicleFlag)0) + m_Hoverflags &= ~(VehicleFlag.HOVER_WATER_ONLY); + } + if ((pParam & (int)VehicleFlag.LIMIT_MOTOR_UP) == (int)VehicleFlag.LIMIT_MOTOR_UP) + { + if ((m_flags & VehicleFlag.LIMIT_MOTOR_UP) != (VehicleFlag)0) + m_flags &= ~(VehicleFlag.LIMIT_MOTOR_UP); + } + if ((pParam & (int)VehicleFlag.LIMIT_ROLL_ONLY) == (int)VehicleFlag.LIMIT_ROLL_ONLY) + { + if ((m_flags & VehicleFlag.LIMIT_ROLL_ONLY) != (VehicleFlag)0) + m_flags &= ~(VehicleFlag.LIMIT_ROLL_ONLY); + } + if ((pParam & (int)VehicleFlag.MOUSELOOK_BANK) == (int)VehicleFlag.MOUSELOOK_BANK) + { + if ((m_flags & VehicleFlag.MOUSELOOK_BANK) != (VehicleFlag)0) + m_flags &= ~(VehicleFlag.MOUSELOOK_BANK); + } + if ((pParam & (int)VehicleFlag.MOUSELOOK_STEER) == (int)VehicleFlag.MOUSELOOK_STEER) + { + if ((m_flags & VehicleFlag.MOUSELOOK_STEER) != (VehicleFlag)0) + m_flags &= ~(VehicleFlag.MOUSELOOK_STEER); + } + if ((pParam & (int)VehicleFlag.NO_DEFLECTION_UP) == (int)VehicleFlag.NO_DEFLECTION_UP) + { + if ((m_flags & VehicleFlag.NO_DEFLECTION_UP) != (VehicleFlag)0) + m_flags &= ~(VehicleFlag.NO_DEFLECTION_UP); + } + if ((pParam & (int)VehicleFlag.CAMERA_DECOUPLED) == (int)VehicleFlag.CAMERA_DECOUPLED) + { + if ((m_flags & VehicleFlag.CAMERA_DECOUPLED) != (VehicleFlag)0) + m_flags &= ~(VehicleFlag.CAMERA_DECOUPLED); + } + if ((pParam & (int)VehicleFlag.NO_X) == (int)VehicleFlag.NO_X) + { + if ((m_flags & VehicleFlag.NO_X) != (VehicleFlag)0) + m_flags &= ~(VehicleFlag.NO_X); + } + if ((pParam & (int)VehicleFlag.NO_Y) == (int)VehicleFlag.NO_Y) + { + if ((m_flags & VehicleFlag.NO_Y) != (VehicleFlag)0) + m_flags &= ~(VehicleFlag.NO_Y); + } + if ((pParam & (int)VehicleFlag.NO_Z) == (int)VehicleFlag.NO_Z) + { + if ((m_flags & VehicleFlag.NO_Z) != (VehicleFlag)0) + m_flags &= ~(VehicleFlag.NO_Z); + } + if ((pParam & (int)VehicleFlag.LOCK_HOVER_HEIGHT) == (int)VehicleFlag.LOCK_HOVER_HEIGHT) + { + if ((m_Hoverflags & VehicleFlag.LOCK_HOVER_HEIGHT) != (VehicleFlag)0) + m_Hoverflags &= ~(VehicleFlag.LOCK_HOVER_HEIGHT); + } + if ((pParam & (int)VehicleFlag.NO_DEFLECTION) == (int)VehicleFlag.NO_DEFLECTION) + { + if ((m_flags & VehicleFlag.NO_DEFLECTION) != (VehicleFlag)0) + m_flags &= ~(VehicleFlag.NO_DEFLECTION); + } + if ((pParam & (int)VehicleFlag.LOCK_ROTATION) == (int)VehicleFlag.LOCK_ROTATION) + { + if ((m_flags & VehicleFlag.LOCK_ROTATION) != (VehicleFlag)0) + m_flags &= ~(VehicleFlag.LOCK_ROTATION); + } + } + else + { + if ((pParam & (int)VehicleFlag.HOVER_GLOBAL_HEIGHT) == (int)VehicleFlag.HOVER_GLOBAL_HEIGHT) + { + m_Hoverflags |= (VehicleFlag.HOVER_GLOBAL_HEIGHT | m_flags); + } + if ((pParam & (int)VehicleFlag.HOVER_TERRAIN_ONLY) == (int)VehicleFlag.HOVER_TERRAIN_ONLY) + { + m_Hoverflags |= (VehicleFlag.HOVER_TERRAIN_ONLY | m_flags); + } + if ((pParam & (int)VehicleFlag.HOVER_UP_ONLY) == (int)VehicleFlag.HOVER_UP_ONLY) + { + m_Hoverflags |= (VehicleFlag.HOVER_UP_ONLY | m_flags); + } + if ((pParam & (int)VehicleFlag.HOVER_WATER_ONLY) == (int)VehicleFlag.HOVER_WATER_ONLY) + { + m_Hoverflags |= (VehicleFlag.HOVER_WATER_ONLY | m_flags); + } + if ((pParam & (int)VehicleFlag.LIMIT_MOTOR_UP) == (int)VehicleFlag.LIMIT_MOTOR_UP) + { + m_flags |= (VehicleFlag.LIMIT_MOTOR_UP | m_flags); + } + if ((pParam & (int)VehicleFlag.MOUSELOOK_BANK) == (int)VehicleFlag.MOUSELOOK_BANK) + { + m_flags |= (VehicleFlag.MOUSELOOK_BANK | m_flags); + } + if ((pParam & (int)VehicleFlag.MOUSELOOK_STEER) == (int)VehicleFlag.MOUSELOOK_STEER) + { + m_flags |= (VehicleFlag.MOUSELOOK_STEER | m_flags); + } + if ((pParam & (int)VehicleFlag.NO_DEFLECTION_UP) == (int)VehicleFlag.NO_DEFLECTION_UP) + { + m_flags |= (VehicleFlag.NO_DEFLECTION_UP | m_flags); + } + if ((pParam & (int)VehicleFlag.CAMERA_DECOUPLED) == (int)VehicleFlag.CAMERA_DECOUPLED) + { + m_flags |= (VehicleFlag.CAMERA_DECOUPLED | m_flags); + } + if ((pParam & (int)VehicleFlag.NO_X) == (int)VehicleFlag.NO_X) + { + m_flags |= (VehicleFlag.NO_X); + } + if ((pParam & (int)VehicleFlag.NO_Y) == (int)VehicleFlag.NO_Y) + { + m_flags |= (VehicleFlag.NO_Y); + } + if ((pParam & (int)VehicleFlag.NO_Z) == (int)VehicleFlag.NO_Z) + { + m_flags |= (VehicleFlag.NO_Z); + } + if ((pParam & (int)VehicleFlag.LOCK_HOVER_HEIGHT) == (int)VehicleFlag.LOCK_HOVER_HEIGHT) + { + m_Hoverflags |= (VehicleFlag.LOCK_HOVER_HEIGHT); + } + if ((pParam & (int)VehicleFlag.NO_DEFLECTION) == (int)VehicleFlag.NO_DEFLECTION) + { + m_flags |= (VehicleFlag.NO_DEFLECTION); + } + if ((pParam & (int)VehicleFlag.LOCK_ROTATION) == (int)VehicleFlag.LOCK_ROTATION) + { + m_flags |= (VehicleFlag.LOCK_ROTATION); + } + } + }//end ProcessVehicleFlags + internal void ProcessTypeChange(Vehicle pType) { // Set Defaults For Type m_type = pType; switch (pType) { + case Vehicle.TYPE_NONE: + m_linearFrictionTimescale = new Vector3(0, 0, 0); + m_angularFrictionTimescale = new Vector3(0, 0, 0); + m_linearMotorDirection = Vector3.Zero; + m_linearMotorTimescale = 0; + m_linearMotorDecayTimescale = 0; + m_angularMotorDirection = Vector3.Zero; + m_angularMotorTimescale = 0; + m_angularMotorDecayTimescale = 0; + m_VhoverHeight = 0; + m_VhoverTimescale = 0; + m_VehicleBuoyancy = 0; + m_flags = (VehicleFlag)0; + break; + case Vehicle.TYPE_SLED: m_linearFrictionTimescale = new Vector3(30, 1, 1000); m_angularFrictionTimescale = new Vector3(1000, 1000, 1000); @@ -295,9 +475,9 @@ namespace OpenSim.Region.Physics.OdePlugin // m_bankingMix = 1; // m_bankingTimescale = 10; // m_referenceFrame = Quaternion.Identity; - m_flags &= - ~(VehicleFlag.HOVER_WATER_ONLY | VehicleFlag.HOVER_TERRAIN_ONLY | - VehicleFlag.HOVER_GLOBAL_HEIGHT | VehicleFlag.HOVER_UP_ONLY); + m_Hoverflags &= + ~(VehicleFlag.HOVER_WATER_ONLY | VehicleFlag.HOVER_TERRAIN_ONLY | + VehicleFlag.HOVER_GLOBAL_HEIGHT | VehicleFlag.HOVER_UP_ONLY); m_flags |= (VehicleFlag.NO_DEFLECTION_UP | VehicleFlag.LIMIT_ROLL_ONLY | VehicleFlag.LIMIT_MOTOR_UP); break; case Vehicle.TYPE_CAR: @@ -323,9 +503,10 @@ namespace OpenSim.Region.Physics.OdePlugin // m_bankingMix = 1; // m_bankingTimescale = 1; // m_referenceFrame = Quaternion.Identity; - m_flags &= ~(VehicleFlag.HOVER_WATER_ONLY | VehicleFlag.HOVER_TERRAIN_ONLY | VehicleFlag.HOVER_GLOBAL_HEIGHT); - m_flags |= (VehicleFlag.NO_DEFLECTION_UP | VehicleFlag.LIMIT_ROLL_ONLY | VehicleFlag.HOVER_UP_ONLY | + m_Hoverflags &= ~(VehicleFlag.HOVER_WATER_ONLY | VehicleFlag.HOVER_TERRAIN_ONLY | VehicleFlag.HOVER_GLOBAL_HEIGHT); + m_flags |= (VehicleFlag.NO_DEFLECTION_UP | VehicleFlag.LIMIT_ROLL_ONLY | VehicleFlag.LIMIT_MOTOR_UP); + m_Hoverflags |= (VehicleFlag.HOVER_UP_ONLY); break; case Vehicle.TYPE_BOAT: m_linearFrictionTimescale = new Vector3(10, 3, 2); @@ -350,10 +531,12 @@ namespace OpenSim.Region.Physics.OdePlugin // m_bankingMix = 0.8f; // m_bankingTimescale = 1; // m_referenceFrame = Quaternion.Identity; - m_flags &= ~(VehicleFlag.HOVER_TERRAIN_ONLY | VehicleFlag.LIMIT_ROLL_ONLY | + m_Hoverflags &= ~(VehicleFlag.HOVER_TERRAIN_ONLY | VehicleFlag.HOVER_GLOBAL_HEIGHT | VehicleFlag.HOVER_UP_ONLY); - m_flags |= (VehicleFlag.NO_DEFLECTION_UP | VehicleFlag.HOVER_WATER_ONLY | + m_flags &= ~(VehicleFlag.LIMIT_ROLL_ONLY); + m_flags |= (VehicleFlag.NO_DEFLECTION_UP | VehicleFlag.LIMIT_MOTOR_UP); + m_Hoverflags |= (VehicleFlag.HOVER_WATER_ONLY); break; case Vehicle.TYPE_AIRPLANE: m_linearFrictionTimescale = new Vector3(200, 10, 5); @@ -378,8 +561,9 @@ namespace OpenSim.Region.Physics.OdePlugin // m_bankingMix = 0.7f; // m_bankingTimescale = 2; // m_referenceFrame = Quaternion.Identity; - m_flags &= ~(VehicleFlag.NO_DEFLECTION_UP | VehicleFlag.HOVER_WATER_ONLY | VehicleFlag.HOVER_TERRAIN_ONLY | - VehicleFlag.HOVER_GLOBAL_HEIGHT | VehicleFlag.HOVER_UP_ONLY | VehicleFlag.LIMIT_MOTOR_UP); + m_Hoverflags &= ~(VehicleFlag.HOVER_WATER_ONLY | VehicleFlag.HOVER_TERRAIN_ONLY | + VehicleFlag.HOVER_GLOBAL_HEIGHT | VehicleFlag.HOVER_UP_ONLY); + m_flags &= ~(VehicleFlag.NO_DEFLECTION_UP | VehicleFlag.LIMIT_MOTOR_UP); m_flags |= (VehicleFlag.LIMIT_ROLL_ONLY); break; case Vehicle.TYPE_BALLOON: @@ -405,9 +589,11 @@ namespace OpenSim.Region.Physics.OdePlugin // m_bankingMix = 0.7f; // m_bankingTimescale = 5; // m_referenceFrame = Quaternion.Identity; - m_flags &= ~(VehicleFlag.NO_DEFLECTION_UP | VehicleFlag.HOVER_WATER_ONLY | VehicleFlag.HOVER_TERRAIN_ONLY | - VehicleFlag.HOVER_UP_ONLY | VehicleFlag.LIMIT_MOTOR_UP); - m_flags |= (VehicleFlag.LIMIT_ROLL_ONLY | VehicleFlag.HOVER_GLOBAL_HEIGHT); + m_Hoverflags &= ~(VehicleFlag.HOVER_WATER_ONLY | VehicleFlag.HOVER_TERRAIN_ONLY | + VehicleFlag.HOVER_UP_ONLY); + m_flags &= ~(VehicleFlag.NO_DEFLECTION_UP | VehicleFlag.LIMIT_MOTOR_UP); + m_flags |= (VehicleFlag.LIMIT_ROLL_ONLY); + m_Hoverflags |= (VehicleFlag.HOVER_GLOBAL_HEIGHT); break; } @@ -431,6 +617,7 @@ namespace OpenSim.Region.Physics.OdePlugin MoveLinear(pTimestep, pParentScene); MoveAngular(pTimestep); + LimitRotation(pTimestep); }// end Step private void MoveLinear(float pTimestep, OdeScene _pParentScene) @@ -477,61 +664,152 @@ namespace OpenSim.Region.Physics.OdePlugin // .Z velocity and gravity. Therefore only 0g will used script-requested // .Z velocity. >0g (m_VehicleBuoyancy < 1) will used modified gravity only. Vector3 grav = Vector3.Zero; - if (m_VehicleBuoyancy < 1.0f) + // There is some gravity, make a gravity force vector + // that is applied after object velocity. + d.Mass objMass; + d.BodyGetMass(Body, out objMass); + // m_VehicleBuoyancy: -1=2g; 0=1g; 1=0g; + grav.Z = _pParentScene.gravityz * objMass.mass * (1f - m_VehicleBuoyancy); + // Preserve the current Z velocity + d.Vector3 vel_now = d.BodyGetLinearVel(Body); + m_dir.Z = vel_now.Z; // Preserve the accumulated falling velocity + + d.Vector3 pos = d.BodyGetPosition(Body); + Vector3 accel = new Vector3(-(m_dir.X - m_lastLinearVelocityVector.X / 0.1f), -(m_dir.Y - m_lastLinearVelocityVector.Y / 0.1f), m_dir.Z - m_lastLinearVelocityVector.Z / 0.1f); + Vector3 posChange = new Vector3(); + posChange.X = pos.X - m_lastPositionVector.X; + posChange.Y = pos.Y - m_lastPositionVector.Y; + posChange.Z = pos.Z - m_lastPositionVector.Z; + double Zchange = Math.Abs(posChange.Z); + if (m_BlockingEndPoint != Vector3.Zero) { - // There is some gravity, make a gravity force vector - // that is applied after object velocity. - d.Mass objMass; - d.BodyGetMass(Body, out objMass); - // m_VehicleBuoyancy: -1=2g; 0=1g; 1=0g; - grav.Z = _pParentScene.gravityz * objMass.mass * (1f - m_VehicleBuoyancy); - // Preserve the current Z velocity - d.Vector3 vel_now = d.BodyGetLinearVel(Body); - m_dir.Z = vel_now.Z; // Preserve the accumulated falling velocity - } // else its 1.0, no gravity. + if (pos.X >= (m_BlockingEndPoint.X - (float)1)) + { + pos.X -= posChange.X + 1; + d.BodySetPosition(Body, pos.X, pos.Y, pos.Z); + } + if (pos.Y >= (m_BlockingEndPoint.Y - (float)1)) + { + pos.Y -= posChange.Y + 1; + d.BodySetPosition(Body, pos.X, pos.Y, pos.Z); + } + if (pos.Z >= (m_BlockingEndPoint.Z - (float)1)) + { + pos.Z -= posChange.Z + 1; + d.BodySetPosition(Body, pos.X, pos.Y, pos.Z); + } + if (pos.X <= 0) + { + pos.X += posChange.X + 1; + d.BodySetPosition(Body, pos.X, pos.Y, pos.Z); + } + if (pos.Y <= 0) + { + pos.Y += posChange.Y + 1; + d.BodySetPosition(Body, pos.X, pos.Y, pos.Z); + } + } + if (pos.Z < _pParentScene.GetTerrainHeightAtXY(pos.X, pos.Y)) + { + pos.Z = _pParentScene.GetTerrainHeightAtXY(pos.X, pos.Y) + 2; + d.BodySetPosition(Body, pos.X, pos.Y, pos.Z); + } // Check if hovering - if ((m_flags & (VehicleFlag.HOVER_WATER_ONLY | VehicleFlag.HOVER_TERRAIN_ONLY | VehicleFlag.HOVER_GLOBAL_HEIGHT)) != 0) + if ((m_Hoverflags & (VehicleFlag.HOVER_WATER_ONLY | VehicleFlag.HOVER_TERRAIN_ONLY | VehicleFlag.HOVER_GLOBAL_HEIGHT)) != 0) { // We should hover, get the target height - d.Vector3 pos = d.BodyGetPosition(Body); - if ((m_flags & VehicleFlag.HOVER_WATER_ONLY) == VehicleFlag.HOVER_WATER_ONLY) + if ((m_Hoverflags & VehicleFlag.HOVER_WATER_ONLY) != 0) { m_VhoverTargetHeight = _pParentScene.GetWaterLevel() + m_VhoverHeight; } - else if ((m_flags & VehicleFlag.HOVER_TERRAIN_ONLY) == VehicleFlag.HOVER_TERRAIN_ONLY) + if ((m_Hoverflags & VehicleFlag.HOVER_TERRAIN_ONLY) != 0) { m_VhoverTargetHeight = _pParentScene.GetTerrainHeightAtXY(pos.X, pos.Y) + m_VhoverHeight; } - else if ((m_flags & VehicleFlag.HOVER_GLOBAL_HEIGHT) == VehicleFlag.HOVER_GLOBAL_HEIGHT) + if ((m_Hoverflags & VehicleFlag.HOVER_GLOBAL_HEIGHT) != 0) { m_VhoverTargetHeight = m_VhoverHeight; } - if ((m_flags & VehicleFlag.HOVER_UP_ONLY) == VehicleFlag.HOVER_UP_ONLY) + if ((m_Hoverflags & VehicleFlag.HOVER_UP_ONLY) != 0) { // If body is aready heigher, use its height as target height if (pos.Z > m_VhoverTargetHeight) m_VhoverTargetHeight = pos.Z; } + if ((m_Hoverflags & VehicleFlag.LOCK_HOVER_HEIGHT) != 0) + { + if ((pos.Z - m_VhoverTargetHeight) > .2 || (pos.Z - m_VhoverTargetHeight) < -.2) + { + d.BodySetPosition(Body, pos.X, pos.Y, m_VhoverTargetHeight); + } + } + else + { + float herr0 = pos.Z - m_VhoverTargetHeight; + // Replace Vertical speed with correction figure if significant + if (Math.Abs(herr0) > 0.01f) + { + m_dir.Z = -((herr0 * pTimestep * 50.0f) / m_VhoverTimescale); + //KF: m_VhoverEfficiency is not yet implemented + } + else + { + m_dir.Z = 0f; + } + } // m_VhoverEfficiency = 0f; // 0=boucy, 1=Crit.damped // m_VhoverTimescale = 0f; // time to acheive height // pTimestep is time since last frame,in secs - float herr0 = pos.Z - m_VhoverTargetHeight; - // Replace Vertical speed with correction figure if significant - if (Math.Abs(herr0) > 0.01f) - { - d.Mass objMass; - d.BodyGetMass(Body, out objMass); - m_dir.Z = - ((herr0 * pTimestep * 50.0f) / m_VhoverTimescale); - //KF: m_VhoverEfficiency is not yet implemented - } - else - { - m_dir.Z = 0f; - } } + if ((m_flags & (VehicleFlag.LIMIT_MOTOR_UP)) != 0) + { + //Start Experimental Values + if (Zchange > .3) + { + grav.Z = (float)(grav.Z * 3); + } + if (Zchange > .15) + { + grav.Z = (float)(grav.Z * 2); + } + if (Zchange > .75) + { + grav.Z = (float)(grav.Z * 1.5); + } + if (Zchange > .05) + { + grav.Z = (float)(grav.Z * 1.25); + } + if (Zchange > .025) + { + grav.Z = (float)(grav.Z * 1.125); + } + float terraintemp = _pParentScene.GetTerrainHeightAtXY(pos.X, pos.Y); + float postemp = (pos.Z - terraintemp); + if (postemp > 2.5f) + { + grav.Z = (float)(grav.Z * 1.037125); + } + //End Experimental Values + } + if ((m_flags & (VehicleFlag.NO_X)) != 0) + { + m_dir.X = 0; + } + if ((m_flags & (VehicleFlag.NO_Y)) != 0) + { + m_dir.Y = 0; + } + if ((m_flags & (VehicleFlag.NO_Z)) != 0) + { + m_dir.Z = 0; + } + + m_lastPositionVector = d.BodyGetPosition(Body); + // Apply velocity d.BodySetLinearVel(Body, m_dir.X, m_dir.Y, m_dir.Z); // apply gravity force @@ -629,6 +907,12 @@ namespace OpenSim.Region.Physics.OdePlugin // Sum velocities m_lastAngularVelocity = m_angularMotorVelocity + vertattr; // + bank + deflection + + if ((m_flags & (VehicleFlag.NO_DEFLECTION_UP)) != 0) + { + m_lastAngularVelocity.X = 0; + m_lastAngularVelocity.Y = 0; + } if (!m_lastAngularVelocity.ApproxEquals(Vector3.Zero, 0.01f)) { @@ -647,5 +931,44 @@ namespace OpenSim.Region.Physics.OdePlugin d.BodySetAngularVel (Body, m_lastAngularVelocity.X, m_lastAngularVelocity.Y, m_lastAngularVelocity.Z); } //end MoveAngular + internal void LimitRotation(float timestep) + { + d.Quaternion rot = d.BodyGetQuaternion(Body); + Quaternion rotq = new Quaternion(rot.X, rot.Y, rot.Z, rot.W); // rotq = rotation of object + d.Quaternion m_rot = new d.Quaternion(); + bool changed = false; + m_rot.X = rotq.X; + m_rot.Y = rotq.Y; + m_rot.Z = rotq.Z; + m_rot.W = rotq.W; + if (m_RollreferenceFrame != Quaternion.Identity) + { + if (rotq.X >= m_RollreferenceFrame.X) + { + m_rot.X = rotq.X - (m_RollreferenceFrame.X / 2); + } + if (rotq.Y >= m_RollreferenceFrame.Y) + { + m_rot.Y = rotq.Y - (m_RollreferenceFrame.Y / 2); + } + if (rotq.X <= -m_RollreferenceFrame.X) + { + m_rot.X = rotq.X + (m_RollreferenceFrame.X / 2); + } + if (rotq.Y <= -m_RollreferenceFrame.Y) + { + m_rot.Y = rotq.Y + (m_RollreferenceFrame.Y / 2); + } + changed = true; + } + if ((m_flags & VehicleFlag.LOCK_ROTATION) != 0) + { + m_rot.X = 0; + m_rot.Y = 0; + changed = true; + } + if (changed) + d.BodySetQuaternion(Body, ref m_rot); + } } } diff --git a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs index 44b2727afe..03736d157b 100644 --- a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs +++ b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs @@ -2355,6 +2355,11 @@ Console.WriteLine(" JointCreateFixed"); m_vehicle.ProcessRotationVehicleParam((Vehicle) param, rotation); } + public override void VehicleFlags(int param, bool remove) + { + m_vehicle.ProcessVehicleFlags(param, remove); + } + public override void SetVolumeDetect(int param) { lock (_parent_scene.OdeLock) diff --git a/OpenSim/Region/Physics/POSPlugin/POSCharacter.cs b/OpenSim/Region/Physics/POSPlugin/POSCharacter.cs index 566b4e7313..a70179b729 100644 --- a/OpenSim/Region/Physics/POSPlugin/POSCharacter.cs +++ b/OpenSim/Region/Physics/POSPlugin/POSCharacter.cs @@ -182,6 +182,8 @@ namespace OpenSim.Region.Physics.POSPlugin } + public override void VehicleFlags(int param, bool remove) { } + public override void SetVolumeDetect(int param) { diff --git a/OpenSim/Region/Physics/POSPlugin/POSPrim.cs b/OpenSim/Region/Physics/POSPlugin/POSPrim.cs index 7447f76e1d..91ec3df6f9 100644 --- a/OpenSim/Region/Physics/POSPlugin/POSPrim.cs +++ b/OpenSim/Region/Physics/POSPlugin/POSPrim.cs @@ -139,6 +139,8 @@ namespace OpenSim.Region.Physics.POSPlugin } + public override void VehicleFlags(int param, bool remove) { } + public override void SetVolumeDetect(int param) { diff --git a/OpenSim/Region/Physics/PhysXPlugin/PhysXPlugin.cs b/OpenSim/Region/Physics/PhysXPlugin/PhysXPlugin.cs index 24eb6b1d20..dd2c68617b 100644 --- a/OpenSim/Region/Physics/PhysXPlugin/PhysXPlugin.cs +++ b/OpenSim/Region/Physics/PhysXPlugin/PhysXPlugin.cs @@ -371,6 +371,8 @@ namespace OpenSim.Region.Physics.PhysXPlugin } + public override void VehicleFlags(int param, bool remove) { } + public override void SetVolumeDetect(int param) { @@ -775,6 +777,8 @@ namespace OpenSim.Region.Physics.PhysXPlugin } + public override void VehicleFlags(int param, bool remove) { } + public override void SetVolumeDetect(int param) { diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index a1db77ee73..aa876ec89c 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -1181,7 +1181,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api if ((status & ScriptBaseClass.STATUS_BLOCK_GRAB) == ScriptBaseClass.STATUS_BLOCK_GRAB) { - NotImplemented("llSetStatus - STATUS_BLOCK_GRAB"); + if (value != 0) + m_host.SetBlockGrab(true); + else + m_host.SetBlockGrab(false); } if ((status & ScriptBaseClass.STATUS_DIE_AT_EDGE) == ScriptBaseClass.STATUS_DIE_AT_EDGE) @@ -1194,12 +1197,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api if ((status & ScriptBaseClass.STATUS_RETURN_AT_EDGE) == ScriptBaseClass.STATUS_RETURN_AT_EDGE) { - NotImplemented("llSetStatus - STATUS_RETURN_AT_EDGE"); + if (value != 0) + m_host.SetReturnAtEdge(true); + else + m_host.SetReturnAtEdge(false); } if ((status & ScriptBaseClass.STATUS_SANDBOX) == ScriptBaseClass.STATUS_SANDBOX) { - NotImplemented("llSetStatus - STATUS_SANDBOX"); + if (value != 0) + m_host.SetStatusSandbox(true); + else + m_host.SetStatusSandbox(false); } if (statusrotationaxis != 0) @@ -1236,8 +1245,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return 0; case ScriptBaseClass.STATUS_BLOCK_GRAB: - NotImplemented("llGetStatus - STATUS_BLOCK_GRAB"); - return 0; + if (m_host.GetBlockGrab()) + return 1; + else + return 0; case ScriptBaseClass.STATUS_DIE_AT_EDGE: if (m_host.GetDieAtEdge()) @@ -1246,24 +1257,34 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return 0; case ScriptBaseClass.STATUS_RETURN_AT_EDGE: - NotImplemented("llGetStatus - STATUS_RETURN_AT_EDGE"); - return 0; + if (m_host.GetReturnAtEdge()) + return 1; + else + return 0; case ScriptBaseClass.STATUS_ROTATE_X: - NotImplemented("llGetStatus - STATUS_ROTATE_X"); - return 0; + if (m_host.GetAxisRotation(2) == 2) + return 1; + else + return 0; case ScriptBaseClass.STATUS_ROTATE_Y: - NotImplemented("llGetStatus - STATUS_ROTATE_Y"); - return 0; + if (m_host.GetAxisRotation(4) == 4) + return 1; + else + return 0; case ScriptBaseClass.STATUS_ROTATE_Z: - NotImplemented("llGetStatus - STATUS_ROTATE_Z"); - return 0; + if (m_host.GetAxisRotation(8) == 8) + return 1; + else + return 0; case ScriptBaseClass.STATUS_SANDBOX: - NotImplemented("llGetStatus - STATUS_SANDBOX"); - return 0; + if (m_host.GetStatusSandbox()) + return 1; + else + return 0; } return 0; } @@ -2201,7 +2222,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api m_host.AddScriptLPS(1); // send the sound, once, to all clients in range - m_host.SendSound(KeyOrName(sound).ToString(), volume, false, 0); + m_host.SendSound(KeyOrName(sound).ToString(), volume, false, 0, 0, false, false); } // Xantor 20080528 we should do this differently. @@ -2231,42 +2252,98 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void llLoopSoundMaster(string sound, double volume) { m_host.AddScriptLPS(1); - NotImplemented("llLoopSoundMaster"); + m_host.ParentGroup.LoopSoundMasterPrim = m_host; + lock (m_host.ParentGroup.LoopSoundSlavePrims) + { + foreach (SceneObjectPart prim in m_host.ParentGroup.LoopSoundSlavePrims) + { + if (prim.Sound != UUID.Zero) + llStopSound(); + + prim.Sound = KeyOrName(sound); + prim.SoundGain = volume; + prim.SoundFlags = 1; // looping + prim.SoundRadius = 20; // Magic number, 20 seems reasonable. Make configurable? + + prim.ScheduleFullUpdate(); + prim.SendFullUpdateToAllClients(); + } + } + if (m_host.Sound != UUID.Zero) + llStopSound(); + + m_host.Sound = KeyOrName(sound); + m_host.SoundGain = volume; + m_host.SoundFlags = 1; // looping + m_host.SoundRadius = 20; // Magic number, 20 seems reasonable. Make configurable? + + m_host.ScheduleFullUpdate(); + m_host.SendFullUpdateToAllClients(); } public void llLoopSoundSlave(string sound, double volume) { m_host.AddScriptLPS(1); - NotImplemented("llLoopSoundSlave"); + lock (m_host.ParentGroup.LoopSoundSlavePrims) + { + m_host.ParentGroup.LoopSoundSlavePrims.Add(m_host); + } } public void llPlaySoundSlave(string sound, double volume) { m_host.AddScriptLPS(1); - NotImplemented("llPlaySoundSlave"); + + // send the sound, once, to all clients in range + m_host.SendSound(KeyOrName(sound).ToString(), volume, false, 0, 0, true, false); } public void llTriggerSound(string sound, double volume) { m_host.AddScriptLPS(1); // send the sound, once, to all clients in range - m_host.SendSound(KeyOrName(sound).ToString(), volume, true, 0); + m_host.SendSound(KeyOrName(sound).ToString(), volume, true, 0, 0, false, false); } // Xantor 20080528: Clear prim data of sound instead public void llStopSound() { m_host.AddScriptLPS(1); - - m_host.Sound = UUID.Zero; - m_host.SoundGain = 0; - m_host.SoundFlags = 0; - m_host.SoundRadius = 0; - - m_host.ScheduleFullUpdate(); - m_host.SendFullUpdateToAllClients(); - - // m_host.SendSound(UUID.Zero.ToString(), 1.0, false, 2); + if (m_host.ParentGroup.LoopSoundSlavePrims.Contains(m_host)) + { + if (m_host.ParentGroup.LoopSoundMasterPrim == m_host) + { + foreach (SceneObjectPart part in m_host.ParentGroup.LoopSoundSlavePrims) + { + part.Sound = UUID.Zero; + part.SoundGain = 0; + part.SoundFlags = 0; + part.SoundRadius = 0; + part.ScheduleFullUpdate(); + part.SendFullUpdateToAllClients(); + } + m_host.ParentGroup.LoopSoundMasterPrim = null; + m_host.ParentGroup.LoopSoundSlavePrims.Clear(); + } + else + { + m_host.Sound = UUID.Zero; + m_host.SoundGain = 0; + m_host.SoundFlags = 0; + m_host.SoundRadius = 0; + m_host.ScheduleFullUpdate(); + m_host.SendFullUpdateToAllClients(); + } + } + else + { + m_host.Sound = UUID.Zero; + m_host.SoundGain = 0; + m_host.SoundFlags = 0; + m_host.SoundRadius = 0; + m_host.ScheduleFullUpdate(); + m_host.SendFullUpdateToAllClients(); + } } public void llPreloadSound(string sound) @@ -2660,8 +2737,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void llLookAt(LSL_Vector target, double strength, double damping) { - // partial implementation, rotates objects correctly but does not apply strength or damping attributes - m_host.AddScriptLPS(1); // Determine where we are looking from LSL_Vector from = llGetPos(); @@ -2681,9 +2756,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api // the angles of rotation in radians into rotation value LSL_Types.Quaternion rot = llEuler2Rot(angle); - + Quaternion rotation = new Quaternion((float)rot.x, (float)rot.y, (float)rot.z, (float)rot.s); + m_host.startLookAt(rotation, (float)damping, (float)strength); // Orient the object to the angle calculated - llSetRot(rot); + //llSetRot(rot); } public void llStopLookAt() @@ -3045,8 +3121,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void llRotLookAt(LSL_Rotation target, double strength, double damping) { m_host.AddScriptLPS(1); -// NotImplemented("llRotLookAt"); - m_host.RotLookAt(Rot2Quaternion(target), (float)strength, (float)damping); + Quaternion rot = new Quaternion((float)target.x, (float)target.y, (float)target.z, (float)target.s); + m_host.RotLookAt(rot, (float)strength, (float)damping); } public LSL_Integer llStringLength(string str) @@ -3144,13 +3220,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void llPointAt(LSL_Vector pos) { m_host.AddScriptLPS(1); - NotImplemented("llPointAt"); + ScenePresence Owner = World.GetScenePresence(m_host.UUID); + LSL_Rotation rot = llEuler2Rot(pos); + Owner.PreviousRotation = Owner.Rotation; + Owner.Rotation = (new Quaternion((float)rot.x,(float)rot.y,(float)rot.z,(float)rot.s)); } public void llStopPointAt() { m_host.AddScriptLPS(1); - NotImplemented("llStopPointAt"); + ScenePresence Owner = m_host.ParentGroup.Scene.GetScenePresence(m_host.OwnerID); + Owner.Rotation = Owner.PreviousRotation; } public void llTargetOmega(LSL_Vector axis, double spinrate, double gain) @@ -3946,8 +4026,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void llCollisionSound(string impact_sound, double impact_volume) { m_host.AddScriptLPS(1); - //NotImplemented("llCollisionSound"); - // TODO: Parameter check logic required. UUID soundId = UUID.Zero; if (!UUID.TryParse(impact_sound, out soundId)) @@ -4535,8 +4613,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public LSL_Vector llGetCenterOfMass() { m_host.AddScriptLPS(1); - NotImplemented("llGetCenterOfMass"); - return new LSL_Vector(); + Vector3 center = m_host.GetGeometricCenter(); + return new LSL_Vector(center.X,center.Y,center.Z); } public LSL_List llListSort(LSL_List src, int stride, int ascending) @@ -5269,8 +5347,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api flags |= ScriptBaseClass.AGENT_SITTING; } - //NotImplemented("llGetAgentInfo"); - return flags; } @@ -5353,7 +5429,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api LSL_Vector bottom_south_west) { m_host.AddScriptLPS(1); - NotImplemented("llTriggerSoundLimited"); + float radius1 = (float)llVecDist(llGetPos(), top_north_east); + float radius2 = (float)llVecDist(llGetPos(), bottom_south_west); + float radius = Math.Abs(radius1 - radius2); + m_host.SendSound(KeyOrName(sound).ToString(), volume, true, 0, radius, false, false); } public void llEjectFromLand(string pest) @@ -5892,7 +5971,26 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void llGroundRepel(double height, int water, double tau) { m_host.AddScriptLPS(1); - NotImplemented("llGroundRepel"); + if (m_host.PhysActor != null) + { + float ground = (float)llGround(new LSL_Types.Vector3(0, 0, 0)); + float waterLevel = (float)llWater(new LSL_Types.Vector3(0, 0, 0)); + PIDHoverType hoverType = PIDHoverType.Ground; + if (water != 0) + { + hoverType = PIDHoverType.GroundAndWater; + if (ground < waterLevel) + height += waterLevel; + else + height += ground; + } + else + { + height += ground; + } + + m_host.SetHoverHeight((float)height, hoverType, (float)tau); + } } protected UUID GetTaskInventoryItem(string name) @@ -6021,13 +6119,25 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void llSetVehicleFlags(int flags) { m_host.AddScriptLPS(1); - NotImplemented("llSetVehicleFlags"); + if (m_host.ParentGroup != null) + { + if (!m_host.ParentGroup.IsDeleted) + { + m_host.ParentGroup.RootPart.SetVehicleFlags(flags, false); + } + } } public void llRemoveVehicleFlags(int flags) { m_host.AddScriptLPS(1); - NotImplemented("llRemoveVehicleFlags"); + if (m_host.ParentGroup != null) + { + if (!m_host.ParentGroup.IsDeleted) + { + m_host.ParentGroup.RootPart.SetVehicleFlags(flags, true); + } + } } public void llSitTarget(LSL_Vector offset, LSL_Rotation rot) @@ -7049,7 +7159,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void llRemoteDataSetRegion() { m_host.AddScriptLPS(1); - NotImplemented("llRemoteDataSetRegion"); + Deprecated("llRemoteDataSetRegion"); } public LSL_Float llLog10(double val) @@ -8081,7 +8191,39 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void llSetInventoryPermMask(string item, int mask, int value) { m_host.AddScriptLPS(1); - NotImplemented("llSetInventoryPermMask"); + if (m_ScriptEngine.Config.GetBoolean("AllowGodFunctions", false)) + { + if (World.Permissions.CanRunConsoleCommand(m_host.OwnerID)) + { + lock (m_host.TaskInventory) + { + foreach (KeyValuePair inv in m_host.TaskInventory) + { + if (inv.Value.Name == item) + { + switch (mask) + { + case 0: + inv.Value.BasePermissions = (uint)value; + break; + case 1: + inv.Value.CurrentPermissions = (uint)value; + break; + case 2: + inv.Value.GroupPermissions = (uint)value; + break; + case 3: + inv.Value.EveryonePermissions = (uint)value; + break; + case 4: + inv.Value.NextPermissions = (uint)value; + break; + } + } + } + } + } + } } public LSL_String llGetInventoryCreator(string item) @@ -8515,6 +8657,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api // we send to all landData.MediaID = new UUID(texture); landData.MediaAutoScale = autoAlign ? (byte)1 : (byte)0; + landData.MediaSize[0] = width; + landData.MediaSize[1] = height; + landData.MediaType = mediaType; // do that one last, it will cause a ParcelPropertiesUpdate landObject.SetMediaUrl(url); @@ -8574,11 +8719,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api m_host.AddScriptLPS(1); LSL_List list = new LSL_List(); //TO DO: make the implementation for the missing commands - //PARCEL_MEDIA_COMMAND_TEXTURE key uuid Use this to get or set the parcel's media texture. - //PARCEL_MEDIA_COMMAND_URL string url Used to get or set the parcel's media url. - //PARCEL_MEDIA_COMMAND_TYPE string mime_type Use this to get or set the parcel media MIME type (e.g. "text/html"). (1.19.1 RC0 or later) - //PARCEL_MEDIA_COMMAND_SIZE integer x, integer y Use this to get or set the parcel media pixel resolution. (1.19.1 RC0 or later) - //PARCEL_MEDIA_COMMAND_DESC string desc Use this to get or set the parcel media description. (1.19.1 RC0 or later) //PARCEL_MEDIA_COMMAND_LOOP_SET float loop Use this to get or set the parcel's media loop duration. (1.19.1 RC0 or later) for (int i = 0; i < aList.Data.Length; i++) { @@ -8596,6 +8736,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api case ParcelMediaCommandEnum.Texture: list.Add(new LSL_String(World.GetLandData(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y).MediaID.ToString())); break; + case ParcelMediaCommandEnum.Type: + list.Add(new LSL_String(World.GetLandData(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y).MediaType)); + break; + case ParcelMediaCommandEnum.Size: + list.Add(new LSL_String(World.GetLandData(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y).MediaSize[0])); + list.Add(new LSL_String(World.GetLandData(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y).MediaSize[1])); + break; default: ParcelMediaCommandEnum mediaCommandEnum = ParcelMediaCommandEnum.Url; NotImplemented("llParcelMediaQuery parameter do not supported yet: " + Enum.Parse(mediaCommandEnum.GetType() , aList.Data[i].ToString()).ToString()); diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs index 13b855f3b7..7cf82b275e 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs @@ -160,6 +160,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase public const int VEHICLE_BANKING_MIX = 39; public const int VEHICLE_BANKING_TIMESCALE = 40; public const int VEHICLE_REFERENCE_FRAME = 44; + public const int VEHICLE_RANGE_BLOCK = 45; + public const int VEHICLE_ROLL_FRAME = 46; public const int VEHICLE_FLAG_NO_DEFLECTION_UP = 1; public const int VEHICLE_FLAG_LIMIT_ROLL_ONLY = 2; public const int VEHICLE_FLAG_HOVER_WATER_ONLY = 4; @@ -170,6 +172,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase public const int VEHICLE_FLAG_MOUSELOOK_STEER = 128; public const int VEHICLE_FLAG_MOUSELOOK_BANK = 256; public const int VEHICLE_FLAG_CAMERA_DECOUPLED = 512; + public const int VEHICLE_FLAG_NO_X = 1024; + public const int VEHICLE_FLAG_NO_Y = 2048; + public const int VEHICLE_FLAG_NO_Z = 4096; + public const int VEHICLE_FLAG_LOCK_HOVER_HEIGHT = 8192; + public const int VEHICLE_FLAG_NO_DEFLECTION = 16392; + public const int VEHICLE_FLAG_LOCK_ROTATION = 32784; public const int INVENTORY_ALL = -1; public const int INVENTORY_NONE = -1; diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs index c552b92a26..98e77c0b92 100644 --- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs @@ -841,7 +841,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine ObjectRemoved handlerObjectRemoved = OnObjectRemoved; if (handlerObjectRemoved != null) { - SceneObjectPart part = m_Scene.GetSceneObjectPart(localID); + SceneObjectPart part = m_Scene.GetSceneObjectPart(localID); handlerObjectRemoved(part.UUID); } diff --git a/OpenSim/Server/Handlers/Inventory/XInventoryInConnector.cs b/OpenSim/Server/Handlers/Inventory/XInventoryInConnector.cs index c7d5ff1d3a..03d4d7a97a 100644 --- a/OpenSim/Server/Handlers/Inventory/XInventoryInConnector.cs +++ b/OpenSim/Server/Handlers/Inventory/XInventoryInConnector.cs @@ -197,7 +197,7 @@ namespace OpenSim.Server.Handlers.Asset if (!request.ContainsKey("PRINCIPAL")) return FailureResult(); - if(m_InventoryService.CreateUserInventory(new UUID(request["PRINCIPAL"].ToString()))) + if (m_InventoryService.CreateUserInventory(new UUID(request["PRINCIPAL"].ToString()))) result["RESULT"] = "True"; else result["RESULT"] = "False"; diff --git a/OpenSim/Services/AssetService/AssetService.cs b/OpenSim/Services/AssetService/AssetService.cs index a91b632baf..b9723a84b3 100644 --- a/OpenSim/Services/AssetService/AssetService.cs +++ b/OpenSim/Services/AssetService/AssetService.cs @@ -81,12 +81,12 @@ namespace OpenSim.Services.AssetService } public AssetBase Get(string id) - { + { UUID assetID; if (!UUID.TryParse(id, out assetID)) { - m_log.WarnFormat("[ASSET SERVICE]: Could not parse requested sset id {0}", id); + m_log.WarnFormat("[ASSET SERVICE]: Could not parse requested sset id {0}", id); return null; } diff --git a/OpenSim/Services/Connectors/Asset/AssetServiceConnector.cs b/OpenSim/Services/Connectors/Asset/AssetServiceConnector.cs index 6d442b75a1..8e311d70d8 100644 --- a/OpenSim/Services/Connectors/Asset/AssetServiceConnector.cs +++ b/OpenSim/Services/Connectors/Asset/AssetServiceConnector.cs @@ -93,7 +93,7 @@ namespace OpenSim.Services.Connectors } public AssetBase Get(string id) - { + { string uri = m_ServerURI + "/assets/" + id; AssetBase asset = null; diff --git a/OpenSim/Tests/Common/Mock/TestClient.cs b/OpenSim/Tests/Common/Mock/TestClient.cs index b5eaf43950..7dab6a12c7 100644 --- a/OpenSim/Tests/Common/Mock/TestClient.cs +++ b/OpenSim/Tests/Common/Mock/TestClient.cs @@ -206,6 +206,8 @@ namespace OpenSim.Tests.Common.Mock public event ObjectBuy OnObjectBuy; public event BuyObjectInventory OnBuyObjectInventory; public event AgentSit OnUndo; + public event AgentSit OnRedo; + public event LandUndo OnLandUndo; public event ForceReleaseControls OnForceReleaseControls;