diff --git a/OpenSim/Data/MySQL/MySQLRegionData.cs b/OpenSim/Data/MySQL/MySQLRegionData.cs index ae048feb48..ab7e92d426 100644 --- a/OpenSim/Data/MySQL/MySQLRegionData.cs +++ b/OpenSim/Data/MySQL/MySQLRegionData.cs @@ -994,6 +994,8 @@ namespace OpenSim.Data.MySQL createCol(land, "UserLookAtY", typeof (Double)); createCol(land, "UserLookAtZ", typeof (Double)); createCol(land, "AuthBuyerID", typeof (String)); + createCol(land, "OtherCleanTime", typeof(Int32)); + createCol(land, "Dwell", typeof(Int32)); land.PrimaryKey = new DataColumn[] {land.Columns["UUID"]}; @@ -1357,6 +1359,8 @@ namespace OpenSim.Data.MySQL UUID.TryParse((string)row["AuthBuyerID"], out authedbuyer); UUID.TryParse((string)row["SnapshotUUID"], out snapshotID); + newData.OtherCleanTime = Convert.ToInt32(row["OtherCleanTime"]); + newData.Dwell = Convert.ToInt32(row["Dwell"]); newData.AuthBuyerID = authedbuyer; newData.SnapshotID = snapshotID; @@ -1661,6 +1665,8 @@ namespace OpenSim.Data.MySQL row["UserLookAtY"] = land.UserLookAt.Y; row["UserLookAtZ"] = land.UserLookAt.Z; row["AuthBuyerID"] = land.AuthBuyerID; + row["OtherCleanTime"] = land.OtherCleanTime; + row["Dwell"] = land.Dwell; } /// diff --git a/OpenSim/Data/MySQL/Resources/020_RegionStore.sql b/OpenSim/Data/MySQL/Resources/020_RegionStore.sql new file mode 100644 index 0000000000..814ef48bb6 --- /dev/null +++ b/OpenSim/Data/MySQL/Resources/020_RegionStore.sql @@ -0,0 +1,7 @@ +begin; + +ALTER TABLE land ADD COLUMN OtherCleanTime integer NOT NULL default 0; +ALTER TABLE land ADD COLUMN Dwell integer NOT NULL default 0; + +commit; + diff --git a/OpenSim/Data/SQLite/Resources/013_RegionStore.sql b/OpenSim/Data/SQLite/Resources/013_RegionStore.sql new file mode 100644 index 0000000000..11529cd3f1 --- /dev/null +++ b/OpenSim/Data/SQLite/Resources/013_RegionStore.sql @@ -0,0 +1,6 @@ +BEGIN; + +ALTER TABLE land ADD COLUMN OtherCleanTime INTEGER NOT NULL default 0; +ALTER TABLE land ADD COLUMN Dwell INTEGER NOT NULL default 0; + +COMMIT; diff --git a/OpenSim/Data/SQLite/SQLiteRegionData.cs b/OpenSim/Data/SQLite/SQLiteRegionData.cs index c87d2e33d1..812367d4cc 100644 --- a/OpenSim/Data/SQLite/SQLiteRegionData.cs +++ b/OpenSim/Data/SQLite/SQLiteRegionData.cs @@ -992,6 +992,8 @@ namespace OpenSim.Data.SQLite createCol(land, "UserLookAtY", typeof (Double)); createCol(land, "UserLookAtZ", typeof (Double)); createCol(land, "AuthbuyerID", typeof(String)); + createCol(land, "OtherCleanTime", typeof(Int32)); + createCol(land, "Dwell", typeof(Int32)); land.PrimaryKey = new DataColumn[] {land.Columns["UUID"]}; @@ -1315,6 +1317,9 @@ namespace OpenSim.Data.SQLite UUID.TryParse((string)row["AuthbuyerID"], out authBuyerID); + newData.OtherCleanTime = Convert.ToInt32(row["OtherCleanTime"]); + newData.Dwell = Convert.ToInt32(row["Dwell"]); + return newData; } @@ -1611,6 +1616,8 @@ namespace OpenSim.Data.SQLite row["UserLookAtY"] = land.UserLookAt.Y; row["UserLookAtZ"] = land.UserLookAt.Z; row["AuthbuyerID"] = Util.ToRawUuidString(land.AuthBuyerID); + row["OtherCleanTime"] = land.OtherCleanTime; + row["Dwell"] = land.Dwell; } /// diff --git a/OpenSim/Framework/Communications/Cache/CachedUserInfo.cs b/OpenSim/Framework/Communications/Cache/CachedUserInfo.cs index 637110537e..d242cb3c2d 100644 --- a/OpenSim/Framework/Communications/Cache/CachedUserInfo.cs +++ b/OpenSim/Framework/Communications/Cache/CachedUserInfo.cs @@ -715,7 +715,7 @@ namespace OpenSim.Framework.Communications.Cache } } - private InventoryFolderImpl FindFolderForType(int type) + public InventoryFolderImpl FindFolderForType(int type) { if (RootFolder == null) return null; diff --git a/OpenSim/Framework/IClientAPI.cs b/OpenSim/Framework/IClientAPI.cs index db6025d843..0bb790c99a 100644 --- a/OpenSim/Framework/IClientAPI.cs +++ b/OpenSim/Framework/IClientAPI.cs @@ -95,6 +95,7 @@ namespace OpenSim.Framework // really don't want to be passing packets in these events, so this is very temporary. public delegate void GenericCall4(Packet packet, IClientAPI remoteClient); + public delegate void DeRezObject(IClientAPI remoteClient, uint localID, UUID groupID, byte destination, UUID destinationID); public delegate void GenericCall5(IClientAPI remoteClient, bool status); @@ -319,6 +320,7 @@ namespace OpenSim.Framework public delegate void DirPopularQuery(IClientAPI remoteClient, UUID queryID, uint queryFlags); public delegate void DirClassifiedQuery(IClientAPI remoteClient, UUID queryID, string queryText, uint queryFlags, uint category, int queryStart); public delegate void EventInfoRequest(IClientAPI remoteClient, uint eventID); + public delegate void ParcelSetOtherCleanTime(IClientAPI remoteClient, int localID, int otherCleanTime); public delegate void MapItemRequest(IClientAPI remoteClient, uint flags, uint EstateID, bool godlike, uint itemtype, ulong regionhandle); @@ -468,7 +470,7 @@ namespace OpenSim.Framework event RequestAvatarProperties OnRequestAvatarProperties; event SetAlwaysRun OnSetAlwaysRun; event TeleportLandmarkRequest OnTeleportLandmarkRequest; - event GenericCall4 OnDeRezObject; + event DeRezObject OnDeRezObject; event Action OnRegionHandShakeReply; event GenericCall2 OnRequestWearables; event GenericCall2 OnCompleteMovementToRegion; @@ -619,6 +621,7 @@ namespace OpenSim.Framework event DirPopularQuery OnDirPopularQuery; event DirClassifiedQuery OnDirClassifiedQuery; event EventInfoRequest OnEventInfoRequest; + event ParcelSetOtherCleanTime OnParcelSetOtherCleanTime; event MapItemRequest OnMapItemRequest; @@ -700,9 +703,6 @@ namespace OpenSim.Framework void SendPrimTerseUpdate(ulong regionHandle, ushort timeDilation, uint localID, Vector3 position, Quaternion rotation, Vector3 velocity, Vector3 rotationalvelocity, byte state, UUID AssetId); - void SendPrimTerseUpdate(ulong regionHandle, ushort timeDilation, uint localID, Vector3 position, - Quaternion rotation, Vector3 velocity, Vector3 rotationalvelocity); - void SendInventoryFolderDetails(UUID ownerID, UUID folderID, List items, List folders, bool fetchFolders, bool fetchItems); diff --git a/OpenSim/Framework/LandData.cs b/OpenSim/Framework/LandData.cs index 4e66721941..7d29d10753 100644 --- a/OpenSim/Framework/LandData.cs +++ b/OpenSim/Framework/LandData.cs @@ -77,6 +77,8 @@ namespace OpenSim.Framework private UUID _snapshotID = UUID.Zero; private Vector3 _userLocation = new Vector3(); private Vector3 _userLookAt = new Vector3(); + private int _dwell = 0; + private int _otherCleanTime = 0; public Vector3 AABBMax { get { @@ -402,6 +404,24 @@ namespace OpenSim.Framework } } + public int Dwell { + get { + return _dwell; + } + set { + _dwell = value; + } + } + + public int OtherCleanTime { + get { + return _otherCleanTime; + } + set { + _otherCleanTime = value; + } + } + public LandData() { _globalID = UUID.Random(); @@ -444,6 +464,8 @@ namespace OpenSim.Framework landData._snapshotID = _snapshotID; landData._userLocation = _userLocation; landData._userLookAt = _userLookAt; + landData._otherCleanTime = _otherCleanTime; + landData._dwell = _dwell; landData._parcelAccessList.Clear(); foreach (ParcelManager.ParcelAccessEntry entry in _parcelAccessList) diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs index 2d6508a3c0..412f969a15 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs @@ -132,7 +132,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP private FriendActionDelegate handlerApproveFriendRequest = null; //OnApproveFriendRequest; private FriendshipTermination handlerTerminateFriendship = null; //OnTerminateFriendship; private RezObject handlerRezObject = null; //OnRezObject; - private GenericCall4 handlerDeRezObject = null; //OnDeRezObject; + private DeRezObject handlerDeRezObject = null; //OnDeRezObject; private ModifyTerrain handlerModifyTerrain = null; private BakeTerrain handlerBakeTerrain = null; private EstateChangeInfo handlerEstateChangeInfo = null; @@ -269,6 +269,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP private DirLandQuery handlerDirLandQuery = null; private DirPopularQuery handlerDirPopularQuery = null; private DirClassifiedQuery handlerDirClassifiedQuery = null; + private ParcelSetOtherCleanTime handlerParcelSetOtherCleanTime = null; private MapItemRequest handlerMapItemRequest = null; @@ -851,7 +852,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP public event ChatMessage OnChatFromClient; public event TextureRequest OnRequestTexture; public event RezObject OnRezObject; - public event GenericCall4 OnDeRezObject; + public event DeRezObject OnDeRezObject; public event ModifyTerrain OnModifyTerrain; public event Action OnRegionHandShakeReply; public event GenericCall2 OnRequestWearables; @@ -1004,6 +1005,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP public event DirPopularQuery OnDirPopularQuery; public event DirClassifiedQuery OnDirClassifiedQuery; public event EventInfoRequest OnEventInfoRequest; + public event ParcelSetOtherCleanTime OnParcelSetOtherCleanTime; public event MapItemRequest OnMapItemRequest; @@ -2560,22 +2562,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP OutPacket(terse, ThrottleOutPacketType.Task | ThrottleOutPacketType.LowPriority); } - public void SendPrimTerseUpdate(ulong regionHandle, ushort timeDilation, uint localID, Vector3 position, - Quaternion rotation, Vector3 velocity, Vector3 rotationalvelocity) - { - if (rotation.X == rotation.Y && rotation.Y == rotation.Z && rotation.Z == rotation.W && rotation.W == 0) - rotation = Quaternion.Identity; - ImprovedTerseObjectUpdatePacket terse = (ImprovedTerseObjectUpdatePacket)PacketPool.Instance.GetPacket(PacketType.ImprovedTerseObjectUpdate); - // TODO: don't create new blocks if recycling an old packet - terse.RegionData.RegionHandle = regionHandle; - terse.RegionData.TimeDilation = timeDilation; - terse.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[1]; - terse.ObjectData[0] = CreatePrimImprovedBlock(localID, position, rotation, velocity, rotationalvelocity, 0); - terse.Header.Reliable = false; - terse.Header.Zerocoded = true; - OutPacket(terse, ThrottleOutPacketType.Task | ThrottleOutPacketType.LowPriority); - } - public void SendAssetUploadCompleteMessage(sbyte AssetType, bool Success, UUID AssetFullID) { AssetUploadCompletePacket newPack = new AssetUploadCompletePacket(); @@ -2922,7 +2908,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP updatePacket.ParcelData.AABBMin = landData.AABBMin; updatePacket.ParcelData.Area = landData.Area; updatePacket.ParcelData.AuctionID = landData.AuctionID; - updatePacket.ParcelData.AuthBuyerID = landData.AuthBuyerID; //unemplemented + updatePacket.ParcelData.AuthBuyerID = landData.AuthBuyerID; updatePacket.ParcelData.Bitmap = landData.Bitmap; @@ -2950,7 +2936,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP updatePacket.ParcelData.MediaURL = LLUtil.StringToPacketBytes(landData.MediaURL); updatePacket.ParcelData.MusicURL = LLUtil.StringToPacketBytes(landData.MusicURL); updatePacket.ParcelData.Name = Utils.StringToBytes(landData.Name); - updatePacket.ParcelData.OtherCleanTime = 0; //unemplemented + updatePacket.ParcelData.OtherCleanTime = landData.OtherCleanTime; updatePacket.ParcelData.OtherCount = 0; //unemplemented updatePacket.ParcelData.OtherPrims = landData.OtherPrims; updatePacket.ParcelData.OwnerID = landData.OwnerID; @@ -4190,10 +4176,18 @@ namespace OpenSim.Region.ClientStack.LindenUDP } break; case PacketType.DeRezObject: + DeRezObjectPacket DeRezPacket = (DeRezObjectPacket) Pack; handlerDeRezObject = OnDeRezObject; if (handlerDeRezObject != null) { - handlerDeRezObject(Pack, this); + foreach (DeRezObjectPacket.ObjectDataBlock data in + DeRezPacket.ObjectData) + { + handlerDeRezObject(this, data.ObjectLocalID, + DeRezPacket.AgentBlock.GroupID, + DeRezPacket.AgentBlock.Destination, + DeRezPacket.AgentBlock.DestinationID); + } } break; case PacketType.ModifyLand: @@ -6443,6 +6437,16 @@ namespace OpenSim.Region.ClientStack.LindenUDP } break; + case PacketType.ParcelSetOtherCleanTime: + ParcelSetOtherCleanTimePacket parcelSetOtherCleanTimePacket = (ParcelSetOtherCleanTimePacket)Pack; + handlerParcelSetOtherCleanTime = OnParcelSetOtherCleanTime; + if (handlerParcelSetOtherCleanTime != null) + { + handlerParcelSetOtherCleanTime(this, + parcelSetOtherCleanTimePacket.ParcelData.LocalID, + parcelSetOtherCleanTimePacket.ParcelData.OtherCleanTime); + } + break; default: m_log.Warn("[CLIENT]: unhandled packet " + Pack.ToString()); break; diff --git a/OpenSim/Region/Environment/Interfaces/ILandChannel.cs b/OpenSim/Region/Environment/Interfaces/ILandChannel.cs index 98998f717b..7da4d3cff7 100644 --- a/OpenSim/Region/Environment/Interfaces/ILandChannel.cs +++ b/OpenSim/Region/Environment/Interfaces/ILandChannel.cs @@ -45,5 +45,6 @@ namespace OpenSim.Region.Environment.Interfaces void ReturnObjectsInParcel(int localID, uint returnType, UUID[] agentIDs, UUID[] taskIDs, IClientAPI remoteClient); void setParcelObjectMaxOverride(overrideParcelMaxPrimCountDelegate overrideDel); void setSimulatorObjectMaxOverride(overrideSimulatorMaxPrimCountDelegate overrideDel); + void SetParcelOtherCleanTime(IClientAPI remoteClient, int localID, int otherCleanTime); } } diff --git a/OpenSim/Region/Environment/Modules/World/Land/LandChannel.cs b/OpenSim/Region/Environment/Modules/World/Land/LandChannel.cs index 8747bd4cde..892d1aea2c 100644 --- a/OpenSim/Region/Environment/Modules/World/Land/LandChannel.cs +++ b/OpenSim/Region/Environment/Modules/World/Land/LandChannel.cs @@ -175,6 +175,15 @@ namespace OpenSim.Region.Environment.Modules.World.Land m_landManagementModule.setSimulatorObjectMaxOverride(overrideDel); } } + + public void SetParcelOtherCleanTime(IClientAPI remoteClient, int localID, int otherCleanTime) + { + if (m_landManagementModule != null) + { + m_landManagementModule.setParcelOtherCleanTime(remoteClient, localID, otherCleanTime); + } + } + #endregion } diff --git a/OpenSim/Region/Environment/Modules/World/Land/LandManagementModule.cs b/OpenSim/Region/Environment/Modules/World/Land/LandManagementModule.cs index 0ecfdd3a6c..d595185096 100644 --- a/OpenSim/Region/Environment/Modules/World/Land/LandManagementModule.cs +++ b/OpenSim/Region/Environment/Modules/World/Land/LandManagementModule.cs @@ -1233,5 +1233,20 @@ namespace OpenSim.Region.Environment.Modules.World.Land else m_log.Debug("[LAND] got no parcelinfo; not sending"); } + + public void setParcelOtherCleanTime(IClientAPI remoteClient, int localID,int otherCleanTime) + { + if (!landList.ContainsKey(localID)) + return; + + ILandObject landObject = landList[localID]; + + if (!m_scene.ExternalChecks.ExternalChecksCanEditParcel(remoteClient.AgentId, landObject)) + return; + + landObject.landData.OtherCleanTime = otherCleanTime; + + UpdateLandObject(localID, landObject.landData); + } } } diff --git a/OpenSim/Region/Environment/Modules/World/NPC/NPCAvatar.cs b/OpenSim/Region/Environment/Modules/World/NPC/NPCAvatar.cs index e5e6a794af..52a2792334 100644 --- a/OpenSim/Region/Environment/Modules/World/NPC/NPCAvatar.cs +++ b/OpenSim/Region/Environment/Modules/World/NPC/NPCAvatar.cs @@ -184,7 +184,7 @@ namespace OpenSim.Region.Environment.Modules.World.NPC public event RequestAvatarProperties OnRequestAvatarProperties; public event SetAlwaysRun OnSetAlwaysRun; - public event GenericCall4 OnDeRezObject; + public event DeRezObject OnDeRezObject; public event Action OnRegionHandShakeReply; public event GenericCall2 OnRequestWearables; public event GenericCall2 OnCompleteMovementToRegion; @@ -330,6 +330,7 @@ namespace OpenSim.Region.Environment.Modules.World.NPC public event DirPopularQuery OnDirPopularQuery; public event DirClassifiedQuery OnDirClassifiedQuery; public event EventInfoRequest OnEventInfoRequest; + public event ParcelSetOtherCleanTime OnParcelSetOtherCleanTime; public event MapItemRequest OnMapItemRequest; @@ -587,12 +588,6 @@ namespace OpenSim.Region.Environment.Modules.World.NPC { } - public virtual void SendPrimTerseUpdate(ulong regionHandle, ushort timeDilation, uint localID, - Vector3 position, Quaternion rotation, Vector3 velocity, - Vector3 rotationalvelocity) - { - } - public virtual void SendInventoryFolderDetails(UUID ownerID, UUID folderID, List items, List folders, diff --git a/OpenSim/Region/Environment/Scenes/AsyncSceneObjectGroupDeleter.cs b/OpenSim/Region/Environment/Scenes/AsyncSceneObjectGroupDeleter.cs index 21fa71bf1d..bd81a6df7f 100644 --- a/OpenSim/Region/Environment/Scenes/AsyncSceneObjectGroupDeleter.cs +++ b/OpenSim/Region/Environment/Scenes/AsyncSceneObjectGroupDeleter.cs @@ -38,8 +38,7 @@ namespace OpenSim.Region.Environment.Scenes { class DeleteToInventoryHolder { - public DeRezObjectPacket DeRezPacket; - public EntityBase selectedEnt; + public int destination; public IClientAPI remoteClient; public SceneObjectGroup objectGroup; public UUID folderID; @@ -70,20 +69,19 @@ namespace OpenSim.Region.Environment.Scenes /// /// Delete the given object from the scene /// - public void DeleteToInventory( - DeRezObjectPacket DeRezPacket, UUID folderID, SceneObjectGroup objectGroup, IClientAPI remoteClient, - EntityBase selectedEnt, bool permissionToDelete) + public void DeleteToInventory(int destination, UUID folderID, + SceneObjectGroup objectGroup, IClientAPI remoteClient, + bool permissionToDelete) { m_inventoryTicker.Stop(); lock (m_inventoryDeletes) { DeleteToInventoryHolder dtis = new DeleteToInventoryHolder(); - dtis.DeRezPacket = DeRezPacket; + dtis.destination = destination; dtis.folderID = folderID; dtis.objectGroup = objectGroup; dtis.remoteClient = remoteClient; - dtis.selectedEnt = selectedEnt; dtis.permissionToDelete = permissionToDelete; m_inventoryDeletes.Enqueue(dtis); @@ -121,8 +119,9 @@ namespace OpenSim.Region.Environment.Scenes "[SCENE]: Sending deleted object to user's inventory, {0} item(s) remaining.", left); x = m_inventoryDeletes.Dequeue(); - m_scene.DeleteToInventory( - x.DeRezPacket, x.selectedEnt, x.remoteClient, x.objectGroup, x.folderID, x.permissionToDelete); + m_scene.DeleteToInventory(x.destination, + x.folderID, x.objectGroup, x.remoteClient, + x.permissionToDelete); return true; } diff --git a/OpenSim/Region/Environment/Scenes/ReturnInfo.cs b/OpenSim/Region/Environment/Scenes/ReturnInfo.cs new file mode 100644 index 0000000000..68c563d42c --- /dev/null +++ b/OpenSim/Region/Environment/Scenes/ReturnInfo.cs @@ -0,0 +1,38 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSim Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using OpenMetaverse; + +namespace OpenSim.Region.Environment.Scenes +{ + public struct ReturnInfo + { + public int count; + public Vector3 location; + public string objectName; + } +} diff --git a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs index 226f39ae47..b91eb838a2 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs @@ -1517,78 +1517,90 @@ namespace OpenSim.Region.Environment.Scenes /// /// /// - public virtual void DeRezObject(Packet packet, IClientAPI remoteClient) + public virtual void DeRezObject(IClientAPI remoteClient, uint localID, + UUID groupID, byte destination, UUID destinationID) { - DeRezObjectPacket DeRezPacket = (DeRezObjectPacket) packet; + SceneObjectPart part = GetSceneObjectPart(localID); + if (part == null) + return; - UUID folderID = UUID.Zero; + if (part.ParentGroup == null || part.ParentGroup.RootPart == null) + return; - foreach (DeRezObjectPacket.ObjectDataBlock Data in DeRezPacket.ObjectData) + // Can't delete child prims + if (part != part.ParentGroup.RootPart) + return; + + SceneObjectGroup grp = part.ParentGroup; + + bool permissionToTake = false; + bool permissionToDelete = false; + + if (destination == 1) // Take Copy { -// m_log.DebugFormat( -// "[AGENT INVENTORY]: Received request to derez {0} into folder {1}", -// Data.ObjectLocalID, DeRezPacket.AgentBlock.DestinationID); + permissionToTake = + ExternalChecks.ExternalChecksCanTakeCopyObject( + grp.UUID, + remoteClient.AgentId); + } + else if (destination == 5) // God take copy + { + permissionToTake = + ExternalChecks.ExternalChecksCanBeGodLike( + remoteClient.AgentId); + } + else if (destination == 4) // Take + { + permissionToTake = + ExternalChecks.ExternalChecksCanTakeObject( + grp.UUID, + remoteClient.AgentId); - EntityBase selectedEnt = null; - //m_log.Info("[CLIENT]: LocalID:" + Data.ObjectLocalID.ToString()); + //If they can take, they can delete! + permissionToDelete = permissionToTake; + } - List EntityList = GetEntities(); - - foreach (EntityBase ent in EntityList) + else if (destination == 6) //Delete + { + permissionToTake = + ExternalChecks.ExternalChecksCanDeleteObject( + grp.UUID, + remoteClient.AgentId); + permissionToDelete = + ExternalChecks.ExternalChecksCanDeleteObject( + grp.UUID, + remoteClient.AgentId); + } + else if (destination == 9) //Return + { + if (remoteClient != null) { - if (ent.LocalId == Data.ObjectLocalID) - { - selectedEnt = ent; - break; - } + permissionToTake = + ExternalChecks.ExternalChecksCanDeleteObject( + grp.UUID, + remoteClient.AgentId); + permissionToDelete = + ExternalChecks.ExternalChecksCanDeleteObject( + grp.UUID, + remoteClient.AgentId); } - if (selectedEnt != null) + else // Auto return passes through here with null agent { - bool permissionToTake = false; - bool permissionToDelete = false; - if (DeRezPacket.AgentBlock.Destination == 1)// Take Copy - { - permissionToTake = ExternalChecks.ExternalChecksCanTakeCopyObject(((SceneObjectGroup)selectedEnt).UUID, remoteClient.AgentId); - permissionToDelete = false; //Just taking copy! - - } - else if (DeRezPacket.AgentBlock.Destination == 5) //God take copy - { - permissionToTake = ExternalChecks.ExternalChecksCanBeGodLike(remoteClient.AgentId); - permissionToDelete = false; //Just taking copy! - - } - else if (DeRezPacket.AgentBlock.Destination == 4) //Take - { - // Take - permissionToTake = ExternalChecks.ExternalChecksCanTakeObject(((SceneObjectGroup)selectedEnt).UUID, remoteClient.AgentId); - permissionToDelete = permissionToTake; //If they can take, they can delete! - } - - else if (DeRezPacket.AgentBlock.Destination == 6) //Delete - { - permissionToTake = ExternalChecks.ExternalChecksCanDeleteObject(((SceneObjectGroup)selectedEnt).UUID, remoteClient.AgentId); - permissionToDelete = ExternalChecks.ExternalChecksCanDeleteObject(((SceneObjectGroup)selectedEnt).UUID, remoteClient.AgentId); - } - else if (DeRezPacket.AgentBlock.Destination == 9) //Return - { - permissionToTake = ExternalChecks.ExternalChecksCanDeleteObject(((SceneObjectGroup)selectedEnt).UUID, remoteClient.AgentId); - permissionToDelete = ExternalChecks.ExternalChecksCanDeleteObject(((SceneObjectGroup)selectedEnt).UUID, remoteClient.AgentId); - } - - SceneObjectGroup objectGroup = (SceneObjectGroup)selectedEnt; - - if (permissionToTake) - { - m_asyncSceneObjectDeleter.DeleteToInventory( - DeRezPacket, folderID, objectGroup, remoteClient, selectedEnt, permissionToDelete); - } - else if (permissionToDelete) - { - DeleteSceneObject(objectGroup); - } + permissionToTake = true; + permissionToDelete = true; } } + + if (permissionToTake) + { + m_asyncSceneObjectDeleter.DeleteToInventory( + destination, destinationID, grp, remoteClient, + permissionToDelete); + } + else if (permissionToDelete) + { + DeleteSceneObject(grp); + } } /// @@ -1600,51 +1612,50 @@ namespace OpenSim.Region.Environment.Scenes /// /// /// - public void DeleteToInventory(DeRezObjectPacket DeRezPacket, EntityBase selectedEnt, IClientAPI remoteClient, - SceneObjectGroup objectGroup, UUID folderID, bool permissionToDelete) + public void DeleteToInventory(int destination, UUID folderID, + SceneObjectGroup objectGroup, IClientAPI remoteClient, + bool permissionToDelete) { string sceneObjectXml = objectGroup.ToXmlString(); CachedUserInfo userInfo = - CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId); + CommsManager.UserProfileCacheService.GetUserDetails( + remoteClient.AgentId); + + if (remoteClient == null) + { + userInfo = CommsManager.UserProfileCacheService.GetUserDetails( + objectGroup.RootPart.OwnerID); + } + else + { + userInfo = CommsManager.UserProfileCacheService.GetUserDetails( + remoteClient.AgentId); + } + if (userInfo != null) { -// string searchFolder = ""; + // If we're deleting someone else's item, it goes back to + // their deleted items folder + // If we're returning someone's item, it goes back to the + // owner's Lost And Found folder. -// if (DeRezPacket.AgentBlock.Destination == 6) -// searchFolder = "Trash"; -// else if (DeRezPacket.AgentBlock.Destination == 9) -// searchFolder = "Lost And Found"; - - // If we're deleting someone else's item, it goes back to their deleted items folder - // If we're returning someone's item, it goes back to the owner's Lost And Found folder. - - if (DeRezPacket.AgentBlock.DestinationID == UUID.Zero || (DeRezPacket.AgentBlock.Destination == 6 && objectGroup.OwnerID != remoteClient.AgentId)) + if (folderID == UUID.Zero || (destination == 6 && + objectGroup.OwnerID != remoteClient.AgentId)) { - List subrootfolders = userInfo.RootFolder.RequestListOfFolders(); - foreach (InventoryFolderBase flder in subrootfolders) - { - if (flder.Name == "Lost And Found") - { - folderID = flder.ID; - break; - } - } + InventoryFolderBase folder = + userInfo.FindFolderForType( + (int)AssetType.LostAndFoundFolder); - if (folderID == UUID.Zero) - { + if (folder != null) + folderID = folder.ID; + else folderID = userInfo.RootFolder.ID; - } - //currently following code not used (or don't know of any case of destination being zero - } - else - { - folderID = DeRezPacket.AgentBlock.DestinationID; } AssetBase asset = CreateAsset( - ((SceneObjectGroup) selectedEnt).GetPartName(selectedEnt.LocalId), - ((SceneObjectGroup) selectedEnt).GetPartDescription(selectedEnt.LocalId), + objectGroup.GetPartName(objectGroup.RootPart.LocalId), + objectGroup.GetPartDescription(objectGroup.RootPart.LocalId), (sbyte)AssetType.Object, Utils.StringToBytes(sceneObjectXml)); AssetCache.AddAsset(asset); @@ -1652,7 +1663,8 @@ namespace OpenSim.Region.Environment.Scenes InventoryItemBase item = new InventoryItemBase(); item.Creator = objectGroup.RootPart.CreatorID; - if (DeRezPacket.AgentBlock.Destination == 1 || DeRezPacket.AgentBlock.Destination == 4)// Take / Copy + if (destination == 1 || + destination == 4)// Take / Copy item.Owner = remoteClient.AgentId; else // Delete / Return item.Owner = objectGroup.OwnerID; @@ -1720,7 +1732,7 @@ namespace OpenSim.Region.Environment.Scenes { if (!grp.HasGroupChanged) { - m_log.InfoFormat("[ATTACHMENT] Detaching {0} which is unchanged", grp.UUID.ToString()); + m_log.InfoFormat("[ATTACHMENT] Save request for {0} which is unchanged", grp.UUID.ToString()); return; } m_log.InfoFormat("[ATTACHMENT] Updating asset for attachment {0}, attachpoint {1}", grp.UUID.ToString(), grp.GetAttachmentPoint()); diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs index 299d0da1ae..139281d565 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.cs @@ -96,6 +96,8 @@ namespace OpenSim.Region.Environment.Scenes private int m_incrementsof15seconds = 0; private volatile bool m_backingup = false; + private Dictionary m_returns = new Dictionary(); + protected string m_simulatorVersion = "OpenSimulator Server"; protected ModuleLoader m_moduleLoader; @@ -929,8 +931,54 @@ namespace OpenSim.Region.Environment.Scenes /// public void Backup() { + m_returns.Clear(); + EventManager.TriggerOnBackup(m_storageManager.DataStore); m_backingup = false; + + foreach (KeyValuePair ret in m_returns) + { + UUID transaction = UUID.Random(); + + GridInstantMessage msg = new GridInstantMessage(); + msg.fromAgentID = new Guid(UUID.Zero.ToString()); // From server + msg.fromAgentSession = new Guid(transaction.ToString()); + msg.toAgentID = new Guid(ret.Key.ToString()); + msg.imSessionID = new Guid(transaction.ToString()); + msg.timestamp = (uint)Util.UnixTimeSinceEpoch(); + msg.fromAgentName = "Server"; + msg.dialog = (byte)19; // Object msg + msg.fromGroup = false; + msg.offline = (byte)1; + msg.ParentEstateID = RegionInfo.EstateSettings.ParentEstateID; + msg.Position = Vector3.Zero; + msg.RegionID = RegionInfo.RegionID.Guid; + msg.binaryBucket = new byte[0]; + if (ret.Value.count > 1) + msg.message = string.Format("Your {0} objects were returned from {1} in region {2} due to parcel auto return", ret.Value.count, ret.Value.location.ToString(), RegionInfo.RegionName); + else + msg.message = string.Format("Your object {0} was returned from {1} in region {2} due to parcel auto return", ret.Value.objectName, ret.Value.location.ToString(), RegionInfo.RegionName); + + TriggerGridInstantMessage(msg, InstantMessageReceiver.IMModule); + } + } + + public void AddReturn(UUID agentID, string objectName, Vector3 location) + { + if (m_returns.ContainsKey(agentID)) + { + ReturnInfo info = m_returns[agentID]; + info.count++; + m_returns[agentID] = info; + } + else + { + ReturnInfo info = new ReturnInfo(); + info.count = 1; + info.objectName = objectName; + info.location = location; + m_returns[agentID] = info; + } } #endregion @@ -2254,6 +2302,7 @@ namespace OpenSim.Region.Environment.Scenes client.OnUndo += m_innerScene.HandleUndo; client.OnObjectGroupRequest += m_innerScene.HandleObjectGroupUpdate; client.OnParcelReturnObjectsRequest += LandChannel.ReturnObjectsInParcel; + client.OnParcelSetOtherCleanTime += LandChannel.SetParcelOtherCleanTime; client.OnObjectSaleInfo += ObjectSaleInfo; client.OnScriptReset += ProcessScriptReset; client.OnGetScriptRunning += GetScriptRunning; diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs index 8c5afab5ce..60cf061e16 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs @@ -99,6 +99,8 @@ namespace OpenSim.Region.Environment.Scenes private Vector3 lastPhysGroupPos; private Quaternion lastPhysGroupRot; + private bool m_isBackedUp = false; + /// /// The constituent parts of this group /// @@ -120,7 +122,11 @@ namespace OpenSim.Region.Environment.Scenes /// public override string Name { - get { return RootPart.Name; } + get { + if (RootPart == null) + return ""; + return RootPart.Name; + } set { RootPart.Name = value; } } @@ -544,7 +550,9 @@ namespace OpenSim.Region.Environment.Scenes //m_log.DebugFormat( // "[SCENE OBJECT GROUP]: Attaching object {0} {1} to scene presistence sweep", Name, UUID); - m_scene.EventManager.OnBackup += ProcessBackup; + if (!m_isBackedUp) + m_scene.EventManager.OnBackup += ProcessBackup; + m_isBackedUp = true; } } @@ -786,6 +794,7 @@ namespace OpenSim.Region.Environment.Scenes SetAttachmentPoint((byte)0); m_rootPart.ApplyPhysics(m_rootPart.GetEffectiveObjectFlags(), m_scene.m_physicalPrim); HasGroupChanged = true; + RootPart.Rezzed = DateTime.Now; AttachToBackup(); m_scene.EventManager.TriggerParcelPrimCountTainted(); m_rootPart.ScheduleFullUpdate(); @@ -1000,6 +1009,8 @@ namespace OpenSim.Region.Environment.Scenes // that they don't happen, otherwise the deleted objects will reappear m_isDeleted = true; + DetachFromBackup(); + foreach (SceneObjectPart part in m_parts.Values) { List avatars = Scene.GetScenePresences(); @@ -1149,6 +1160,28 @@ namespace OpenSim.Region.Environment.Scenes // any exception propogate upwards. try { + ILandObject parcel = m_scene.LandChannel.GetLandObject( + m_rootPart.GroupPosition.X, m_rootPart.GroupPosition.Y); + + if (parcel.landData.OtherCleanTime != 0) + { + if (parcel.landData.OwnerID != OwnerID && + (parcel.landData.GroupID != GroupID || + parcel.landData.GroupID == UUID.Zero)) + { + if ((DateTime.Now - RootPart.Rezzed).TotalMinutes > + parcel.landData.OtherCleanTime) + { + m_log.InfoFormat("[SCENE] Returning object {0} due to parcel auto return", RootPart.UUID.ToString()); + m_scene.AddReturn(OwnerID, Name, AbsolutePosition); + m_scene.DeRezObject(null, RootPart.LocalId, + RootPart.GroupID, 9, UUID.Zero); + + return; + } + } + } + if (HasGroupChanged) { // don't backup while it's selected or you're asking for changes mid stream. @@ -1226,35 +1259,6 @@ namespace OpenSim.Region.Environment.Scenes } } - /// - /// Send a terse update to the client for the given part - /// - /// - /// - internal void SendPartTerseUpdate(IClientAPI remoteClient, SceneObjectPart part) - { - SceneObjectPart rootPart = m_rootPart; - - // TODO: that could by caused by some race condition with attachments on sim-crossing - if (rootPart == null) return; - - if (rootPart.UUID == part.UUID) - { - if (rootPart.IsAttachment) - { - part.SendTerseUpdateToClient(remoteClient, rootPart.AttachedPos); - } - else - { - part.SendTerseUpdateToClient(remoteClient, AbsolutePosition); - } - } - else - { - part.SendTerseUpdateToClient(remoteClient); - } - } - #endregion #region Copying @@ -1920,6 +1924,8 @@ namespace OpenSim.Region.Environment.Scenes if (sendEvents) linkPart.TriggerScriptChangedEvent(Changed.LINK); + linkPart.Rezzed = RootPart.Rezzed; + HasGroupChanged = true; ScheduleGroupForFullUpdate(); } @@ -1937,7 +1943,9 @@ namespace OpenSim.Region.Environment.Scenes /// public void DetachFromBackup() { - m_scene.EventManager.OnBackup -= ProcessBackup; + if (m_isBackedUp) + m_scene.EventManager.OnBackup -= ProcessBackup; + m_isBackedUp = false; } private void LinkNonRootPart(SceneObjectPart part, Vector3 oldGroupPosition, Quaternion oldGroupRotation) diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs index bf6025ef28..6c76d54f85 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs @@ -212,6 +212,7 @@ namespace OpenSim.Region.Environment.Scenes // It's not necessary to persist this m_TextureAnimation = new byte[0]; m_particleSystem = new byte[0]; + Rezzed = DateTime.Now; } public SceneObjectPart(ulong regionHandle, SceneObjectGroup parent, UUID ownerID, uint localID, @@ -237,6 +238,7 @@ namespace OpenSim.Region.Environment.Scenes m_regionHandle = regionHandle; m_parentGroup = parent; + Rezzed = DateTime.Now; _creationDate = (Int32) (DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds; _ownerID = ownerID; _creatorID = _ownerID; @@ -311,6 +313,8 @@ namespace OpenSim.Region.Environment.Scenes RotationOffset = rotation; ObjectFlags = flags; + Rezzed = DateTime.Now; + m_TextureAnimation = new byte[0]; m_particleSystem = new byte[0]; // Since we don't store script state, this is only a 'temporary' objectflag now @@ -339,6 +343,7 @@ namespace OpenSim.Region.Environment.Scenes */ //System.Console.WriteLine("SceneObjectPart Deserialize END"); + Rezzed = DateTime.Now; } #endregion Constructors @@ -362,6 +367,7 @@ namespace OpenSim.Region.Environment.Scenes private uint _nextOwnerMask = (uint)PermissionMask.All; private PrimFlags _flags = 0; private DateTime m_expires; + private DateTime m_rezzed; public UUID CreatorID { get @@ -459,6 +465,13 @@ namespace OpenSim.Region.Environment.Scenes set { m_expires = value; } } + [XmlIgnore] + public DateTime Rezzed + { + get { return m_rezzed; } + set { m_rezzed = value; } + } + /// /// The position of the entire group that this prim belongs to. /// @@ -1270,6 +1283,7 @@ if (m_shape != null) { dupe._objectSaleType = _objectSaleType; dupe._salePrice = _salePrice; dupe._category = _category; + dupe.m_rezzed = m_rezzed; dupe.TaskInventory = (TaskInventoryDictionary)dupe.TaskInventory.Clone(); @@ -2226,10 +2240,10 @@ if (m_shape != null) { /// Send a terse update to the client. /// /// - public void SendTerseUpdate(IClientAPI remoteClient) - { - m_parentGroup.SendPartTerseUpdate(remoteClient, this); - } +// public void SendTerseUpdate(IClientAPI remoteClient) +// { +// SendTerseUpdateToClient(remoteClient); +// } /// /// @@ -2239,54 +2253,14 @@ if (m_shape != null) { List avatars = m_parentGroup.Scene.GetScenePresences(); for (int i = 0; i < avatars.Count; i++) { - m_parentGroup.SendPartTerseUpdate(avatars[i].ControllingClient, this); + SendTerseUpdateToClient(avatars[i].ControllingClient); } } - public void SendTerseUpdateToClient(IClientAPI remoteClient) - { - Vector3 lPos; - lPos = OffsetPosition; - Quaternion mRot = RotationOffset; - // TODO: I have no idea why we are making this check. This should be sorted out - if ((ObjectFlags & (uint) PrimFlags.Physics) == 0) - { - remoteClient.SendPrimTerseUpdate(m_regionHandle, (ushort)(m_parentGroup.GetTimeDilation() * (float)ushort.MaxValue), LocalId, lPos, mRot, Velocity, RotationalVelocity, Shape.State, FromAssetID); - } - else - { - remoteClient.SendPrimTerseUpdate(m_regionHandle, (ushort)(m_parentGroup.GetTimeDilation() * (float)ushort.MaxValue), LocalId, lPos, mRot, Velocity, - RotationalVelocity); - //System.Console.WriteLine("LID: " + LocalID + " RVel:" + RotationalVelocity.ToString() + " TD: " + ((ushort)(m_parentGroup.Scene.TimeDilation * 500000f)).ToString() + ":" + m_parentGroup.Scene.TimeDilation.ToString()); - } - } - - public void SendTerseUpdateToClient(IClientAPI remoteClient, Vector3 lPos) - { - Quaternion mRot = RotationOffset; - //bool isattachment = IsAttachment; - //if (LocalId != ParentGroup.RootPart.LocalId) - //isattachment = ParentGroup.RootPart.IsAttachment; - - if (IsAttachment) - { - //m_log.Debug(AttachmentPoint.ToString()); - remoteClient.SendPrimTerseUpdate(m_regionHandle, (ushort)(m_parentGroup.GetTimeDilation() * (float)ushort.MaxValue), LocalId, lPos, mRot, Velocity, RotationalVelocity, (byte)((AttachmentPoint % 16) * 16 + (AttachmentPoint / 16)),FromAssetID); - } - else - { - if ((ObjectFlags & (uint)PrimFlags.Physics) == 0) - { - remoteClient.SendPrimTerseUpdate(m_regionHandle, (ushort)(m_parentGroup.GetTimeDilation() * (float)ushort.MaxValue), LocalId, lPos, mRot, Velocity, RotationalVelocity, Shape.State, FromAssetID); - } - else - { - remoteClient.SendPrimTerseUpdate(m_regionHandle, (ushort)(m_parentGroup.GetTimeDilation() * (float)ushort.MaxValue), LocalId, lPos, mRot, Velocity, - RotationalVelocity); - //System.Console.WriteLine("LID: " + LocalID + "RVel:" + RotationalVelocity.ToString() + " TD: " + ((ushort)(m_parentGroup.Scene.TimeDilation * 500000f)).ToString() + ":" + m_parentGroup.Scene.TimeDilation.ToString()); - } - } - } +// public void SendTerseUpdateToClient(IClientAPI remoteClient, Vector3 lPos) +// { +// SendTerseUpdateToClient(remoteclient); +// } public void SetAttachmentPoint(uint AttachmentPoint) { @@ -3257,6 +3231,15 @@ if (m_shape != null) { PhysActor.Shape = m_shape; } + // This is what makes vehicle trailers work + // A script in a child prim re-issues + // llSetPrimitiveParams(PRIM_TYPE) every few seconds. That + // prevents autoreturn. This is not well known. It also works + // in SL. + // + if (ParentGroup.RootPart != this) + ParentGroup.RootPart.Rezzed = DateTime.Now; + ParentGroup.HasGroupChanged = true; ScheduleFullUpdate(); } @@ -3427,5 +3410,42 @@ if (m_shape != null) { } #endregion Public Methods + + private byte GetAttachPointEncoded() + { + return (byte)((AttachmentPoint % 16) * 16 + (AttachmentPoint / 16)); + } + + public void SendTerseUpdateToClient(IClientAPI remoteClient) + { + if (ParentGroup == null || ParentGroup.RootPart == null) + return; + + Vector3 lPos = OffsetPosition; + + byte state = Shape.State; + if (IsAttachment) + { + if (ParentGroup.RootPart != this) + return; + + lPos = ParentGroup.RootPart.AttachedPos; + state = GetAttachPointEncoded(); + } + else + { + if (ParentGroup.RootPart == this) + lPos = AbsolutePosition; + } + + remoteClient.SendPrimTerseUpdate(m_regionHandle, + (ushort)(m_parentGroup.GetTimeDilation() * + (float)ushort.MaxValue), LocalId, lPos, + RotationOffset, Velocity, + RotationalVelocity, state, FromAssetID); + } } } + + + diff --git a/OpenSim/Region/Environment/Scenes/ScenePresence.cs b/OpenSim/Region/Environment/Scenes/ScenePresence.cs index 0fe2bdb29c..4517d11270 100644 --- a/OpenSim/Region/Environment/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Environment/Scenes/ScenePresence.cs @@ -640,7 +640,7 @@ namespace OpenSim.Region.Environment.Scenes // "[SCENE PRESENCE]: Tersely updating prim {0}, {1} - part timestamp {2}", // part.Name, part.UUID, part.TimeStampTerse); - part.SendTerseUpdate(ControllingClient); + part.SendTerseUpdateToClient(ControllingClient); update.LastTerseUpdateTime = part.TimeStampTerse; updateCount++; diff --git a/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs b/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs index cc490728e6..af60323c8a 100644 --- a/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs +++ b/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs @@ -79,7 +79,7 @@ namespace OpenSim.Region.Examples.SimpleModule public event RequestAvatarProperties OnRequestAvatarProperties; public event SetAlwaysRun OnSetAlwaysRun; - public event GenericCall4 OnDeRezObject; + public event DeRezObject OnDeRezObject; public event Action OnRegionHandShakeReply; public event GenericCall2 OnRequestWearables; public event GenericCall2 OnCompleteMovementToRegion; @@ -225,6 +225,7 @@ namespace OpenSim.Region.Examples.SimpleModule public event DirPopularQuery OnDirPopularQuery; public event DirClassifiedQuery OnDirClassifiedQuery; public event EventInfoRequest OnEventInfoRequest; + public event ParcelSetOtherCleanTime OnParcelSetOtherCleanTime; public event MapItemRequest OnMapItemRequest; @@ -499,12 +500,6 @@ namespace OpenSim.Region.Examples.SimpleModule { } - public virtual void SendPrimTerseUpdate(ulong regionHandle, ushort timeDilation, uint localID, - Vector3 position, Quaternion rotation, Vector3 velocity, - Vector3 rotationalvelocity) - { - } - public virtual void SendInventoryFolderDetails(UUID ownerID, UUID folderID, List items, List folders,