aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim
diff options
context:
space:
mode:
authorMelanie Thielker2008-10-18 05:51:36 +0000
committerMelanie Thielker2008-10-18 05:51:36 +0000
commitefe3f3eb2a0a31b1da474974c7d8193c2b28e13f (patch)
treedf1d30ad2f9230ea4e8fbfd1e6368d539600c785 /OpenSim
parent* Fix an over compensation for bounciness on flat Primitive (diff)
downloadopensim-SC_OLD-efe3f3eb2a0a31b1da474974c7d8193c2b28e13f.zip
opensim-SC_OLD-efe3f3eb2a0a31b1da474974c7d8193c2b28e13f.tar.gz
opensim-SC_OLD-efe3f3eb2a0a31b1da474974c7d8193c2b28e13f.tar.bz2
opensim-SC_OLD-efe3f3eb2a0a31b1da474974c7d8193c2b28e13f.tar.xz
Megapatch. :) Fix skull attachment editing. Streamline Object terse updates.
Add rezzing time to objects. Add Object return and traffic fields to land database. Add plumbing for auto return. Implement auto return. Contains a migration. May contain nuts.
Diffstat (limited to 'OpenSim')
-rw-r--r--OpenSim/Data/MySQL/MySQLRegionData.cs6
-rw-r--r--OpenSim/Data/MySQL/Resources/020_RegionStore.sql7
-rw-r--r--OpenSim/Data/SQLite/Resources/013_RegionStore.sql6
-rw-r--r--OpenSim/Data/SQLite/SQLiteRegionData.cs7
-rw-r--r--OpenSim/Framework/Communications/Cache/CachedUserInfo.cs2
-rw-r--r--OpenSim/Framework/IClientAPI.cs8
-rw-r--r--OpenSim/Framework/LandData.cs22
-rw-r--r--OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs46
-rw-r--r--OpenSim/Region/Environment/Interfaces/ILandChannel.cs1
-rw-r--r--OpenSim/Region/Environment/Modules/World/Land/LandChannel.cs9
-rw-r--r--OpenSim/Region/Environment/Modules/World/Land/LandManagementModule.cs15
-rw-r--r--OpenSim/Region/Environment/Modules/World/NPC/NPCAvatar.cs9
-rw-r--r--OpenSim/Region/Environment/Scenes/AsyncSceneObjectGroupDeleter.cs17
-rw-r--r--OpenSim/Region/Environment/Scenes/ReturnInfo.cs38
-rw-r--r--OpenSim/Region/Environment/Scenes/Scene.Inventory.cs202
-rw-r--r--OpenSim/Region/Environment/Scenes/Scene.cs49
-rw-r--r--OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs72
-rw-r--r--OpenSim/Region/Environment/Scenes/SceneObjectPart.cs118
-rw-r--r--OpenSim/Region/Environment/Scenes/ScenePresence.cs2
-rw-r--r--OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs9
20 files changed, 419 insertions, 226 deletions
diff --git a/OpenSim/Data/MySQL/MySQLRegionData.cs b/OpenSim/Data/MySQL/MySQLRegionData.cs
index ae048fe..ab7e92d 100644
--- a/OpenSim/Data/MySQL/MySQLRegionData.cs
+++ b/OpenSim/Data/MySQL/MySQLRegionData.cs
@@ -994,6 +994,8 @@ namespace OpenSim.Data.MySQL
994 createCol(land, "UserLookAtY", typeof (Double)); 994 createCol(land, "UserLookAtY", typeof (Double));
995 createCol(land, "UserLookAtZ", typeof (Double)); 995 createCol(land, "UserLookAtZ", typeof (Double));
996 createCol(land, "AuthBuyerID", typeof (String)); 996 createCol(land, "AuthBuyerID", typeof (String));
997 createCol(land, "OtherCleanTime", typeof(Int32));
998 createCol(land, "Dwell", typeof(Int32));
997 999
998 land.PrimaryKey = new DataColumn[] {land.Columns["UUID"]}; 1000 land.PrimaryKey = new DataColumn[] {land.Columns["UUID"]};
999 1001
@@ -1357,6 +1359,8 @@ namespace OpenSim.Data.MySQL
1357 1359
1358 UUID.TryParse((string)row["AuthBuyerID"], out authedbuyer); 1360 UUID.TryParse((string)row["AuthBuyerID"], out authedbuyer);
1359 UUID.TryParse((string)row["SnapshotUUID"], out snapshotID); 1361 UUID.TryParse((string)row["SnapshotUUID"], out snapshotID);
1362 newData.OtherCleanTime = Convert.ToInt32(row["OtherCleanTime"]);
1363 newData.Dwell = Convert.ToInt32(row["Dwell"]);
1360 1364
1361 newData.AuthBuyerID = authedbuyer; 1365 newData.AuthBuyerID = authedbuyer;
1362 newData.SnapshotID = snapshotID; 1366 newData.SnapshotID = snapshotID;
@@ -1661,6 +1665,8 @@ namespace OpenSim.Data.MySQL
1661 row["UserLookAtY"] = land.UserLookAt.Y; 1665 row["UserLookAtY"] = land.UserLookAt.Y;
1662 row["UserLookAtZ"] = land.UserLookAt.Z; 1666 row["UserLookAtZ"] = land.UserLookAt.Z;
1663 row["AuthBuyerID"] = land.AuthBuyerID; 1667 row["AuthBuyerID"] = land.AuthBuyerID;
1668 row["OtherCleanTime"] = land.OtherCleanTime;
1669 row["Dwell"] = land.Dwell;
1664 } 1670 }
1665 1671
1666 /// <summary> 1672 /// <summary>
diff --git a/OpenSim/Data/MySQL/Resources/020_RegionStore.sql b/OpenSim/Data/MySQL/Resources/020_RegionStore.sql
new file mode 100644
index 0000000..814ef48
--- /dev/null
+++ b/OpenSim/Data/MySQL/Resources/020_RegionStore.sql
@@ -0,0 +1,7 @@
1begin;
2
3ALTER TABLE land ADD COLUMN OtherCleanTime integer NOT NULL default 0;
4ALTER TABLE land ADD COLUMN Dwell integer NOT NULL default 0;
5
6commit;
7
diff --git a/OpenSim/Data/SQLite/Resources/013_RegionStore.sql b/OpenSim/Data/SQLite/Resources/013_RegionStore.sql
new file mode 100644
index 0000000..11529cd
--- /dev/null
+++ b/OpenSim/Data/SQLite/Resources/013_RegionStore.sql
@@ -0,0 +1,6 @@
1BEGIN;
2
3ALTER TABLE land ADD COLUMN OtherCleanTime INTEGER NOT NULL default 0;
4ALTER TABLE land ADD COLUMN Dwell INTEGER NOT NULL default 0;
5
6COMMIT;
diff --git a/OpenSim/Data/SQLite/SQLiteRegionData.cs b/OpenSim/Data/SQLite/SQLiteRegionData.cs
index c87d2e3..812367d 100644
--- a/OpenSim/Data/SQLite/SQLiteRegionData.cs
+++ b/OpenSim/Data/SQLite/SQLiteRegionData.cs
@@ -992,6 +992,8 @@ namespace OpenSim.Data.SQLite
992 createCol(land, "UserLookAtY", typeof (Double)); 992 createCol(land, "UserLookAtY", typeof (Double));
993 createCol(land, "UserLookAtZ", typeof (Double)); 993 createCol(land, "UserLookAtZ", typeof (Double));
994 createCol(land, "AuthbuyerID", typeof(String)); 994 createCol(land, "AuthbuyerID", typeof(String));
995 createCol(land, "OtherCleanTime", typeof(Int32));
996 createCol(land, "Dwell", typeof(Int32));
995 997
996 land.PrimaryKey = new DataColumn[] {land.Columns["UUID"]}; 998 land.PrimaryKey = new DataColumn[] {land.Columns["UUID"]};
997 999
@@ -1315,6 +1317,9 @@ namespace OpenSim.Data.SQLite
1315 1317
1316 UUID.TryParse((string)row["AuthbuyerID"], out authBuyerID); 1318 UUID.TryParse((string)row["AuthbuyerID"], out authBuyerID);
1317 1319
1320 newData.OtherCleanTime = Convert.ToInt32(row["OtherCleanTime"]);
1321 newData.Dwell = Convert.ToInt32(row["Dwell"]);
1322
1318 return newData; 1323 return newData;
1319 } 1324 }
1320 1325
@@ -1611,6 +1616,8 @@ namespace OpenSim.Data.SQLite
1611 row["UserLookAtY"] = land.UserLookAt.Y; 1616 row["UserLookAtY"] = land.UserLookAt.Y;
1612 row["UserLookAtZ"] = land.UserLookAt.Z; 1617 row["UserLookAtZ"] = land.UserLookAt.Z;
1613 row["AuthbuyerID"] = Util.ToRawUuidString(land.AuthBuyerID); 1618 row["AuthbuyerID"] = Util.ToRawUuidString(land.AuthBuyerID);
1619 row["OtherCleanTime"] = land.OtherCleanTime;
1620 row["Dwell"] = land.Dwell;
1614 } 1621 }
1615 1622
1616 /// <summary> 1623 /// <summary>
diff --git a/OpenSim/Framework/Communications/Cache/CachedUserInfo.cs b/OpenSim/Framework/Communications/Cache/CachedUserInfo.cs
index 6371105..d242cb3 100644
--- a/OpenSim/Framework/Communications/Cache/CachedUserInfo.cs
+++ b/OpenSim/Framework/Communications/Cache/CachedUserInfo.cs
@@ -715,7 +715,7 @@ namespace OpenSim.Framework.Communications.Cache
715 } 715 }
716 } 716 }
717 717
718 private InventoryFolderImpl FindFolderForType(int type) 718 public InventoryFolderImpl FindFolderForType(int type)
719 { 719 {
720 if (RootFolder == null) 720 if (RootFolder == null)
721 return null; 721 return null;
diff --git a/OpenSim/Framework/IClientAPI.cs b/OpenSim/Framework/IClientAPI.cs
index db6025d..0bb790c 100644
--- a/OpenSim/Framework/IClientAPI.cs
+++ b/OpenSim/Framework/IClientAPI.cs
@@ -95,6 +95,7 @@ namespace OpenSim.Framework
95 95
96 // really don't want to be passing packets in these events, so this is very temporary. 96 // really don't want to be passing packets in these events, so this is very temporary.
97 public delegate void GenericCall4(Packet packet, IClientAPI remoteClient); 97 public delegate void GenericCall4(Packet packet, IClientAPI remoteClient);
98 public delegate void DeRezObject(IClientAPI remoteClient, uint localID, UUID groupID, byte destination, UUID destinationID);
98 99
99 public delegate void GenericCall5(IClientAPI remoteClient, bool status); 100 public delegate void GenericCall5(IClientAPI remoteClient, bool status);
100 101
@@ -319,6 +320,7 @@ namespace OpenSim.Framework
319 public delegate void DirPopularQuery(IClientAPI remoteClient, UUID queryID, uint queryFlags); 320 public delegate void DirPopularQuery(IClientAPI remoteClient, UUID queryID, uint queryFlags);
320 public delegate void DirClassifiedQuery(IClientAPI remoteClient, UUID queryID, string queryText, uint queryFlags, uint category, int queryStart); 321 public delegate void DirClassifiedQuery(IClientAPI remoteClient, UUID queryID, string queryText, uint queryFlags, uint category, int queryStart);
321 public delegate void EventInfoRequest(IClientAPI remoteClient, uint eventID); 322 public delegate void EventInfoRequest(IClientAPI remoteClient, uint eventID);
323 public delegate void ParcelSetOtherCleanTime(IClientAPI remoteClient, int localID, int otherCleanTime);
322 324
323 public delegate void MapItemRequest(IClientAPI remoteClient, uint flags, uint EstateID, bool godlike, uint itemtype, ulong regionhandle); 325 public delegate void MapItemRequest(IClientAPI remoteClient, uint flags, uint EstateID, bool godlike, uint itemtype, ulong regionhandle);
324 326
@@ -468,7 +470,7 @@ namespace OpenSim.Framework
468 event RequestAvatarProperties OnRequestAvatarProperties; 470 event RequestAvatarProperties OnRequestAvatarProperties;
469 event SetAlwaysRun OnSetAlwaysRun; 471 event SetAlwaysRun OnSetAlwaysRun;
470 event TeleportLandmarkRequest OnTeleportLandmarkRequest; 472 event TeleportLandmarkRequest OnTeleportLandmarkRequest;
471 event GenericCall4 OnDeRezObject; 473 event DeRezObject OnDeRezObject;
472 event Action<IClientAPI> OnRegionHandShakeReply; 474 event Action<IClientAPI> OnRegionHandShakeReply;
473 event GenericCall2 OnRequestWearables; 475 event GenericCall2 OnRequestWearables;
474 event GenericCall2 OnCompleteMovementToRegion; 476 event GenericCall2 OnCompleteMovementToRegion;
@@ -619,6 +621,7 @@ namespace OpenSim.Framework
619 event DirPopularQuery OnDirPopularQuery; 621 event DirPopularQuery OnDirPopularQuery;
620 event DirClassifiedQuery OnDirClassifiedQuery; 622 event DirClassifiedQuery OnDirClassifiedQuery;
621 event EventInfoRequest OnEventInfoRequest; 623 event EventInfoRequest OnEventInfoRequest;
624 event ParcelSetOtherCleanTime OnParcelSetOtherCleanTime;
622 625
623 event MapItemRequest OnMapItemRequest; 626 event MapItemRequest OnMapItemRequest;
624 627
@@ -700,9 +703,6 @@ namespace OpenSim.Framework
700 void SendPrimTerseUpdate(ulong regionHandle, ushort timeDilation, uint localID, Vector3 position, 703 void SendPrimTerseUpdate(ulong regionHandle, ushort timeDilation, uint localID, Vector3 position,
701 Quaternion rotation, Vector3 velocity, Vector3 rotationalvelocity, byte state, UUID AssetId); 704 Quaternion rotation, Vector3 velocity, Vector3 rotationalvelocity, byte state, UUID AssetId);
702 705
703 void SendPrimTerseUpdate(ulong regionHandle, ushort timeDilation, uint localID, Vector3 position,
704 Quaternion rotation, Vector3 velocity, Vector3 rotationalvelocity);
705
706 void SendInventoryFolderDetails(UUID ownerID, UUID folderID, List<InventoryItemBase> items, 706 void SendInventoryFolderDetails(UUID ownerID, UUID folderID, List<InventoryItemBase> items,
707 List<InventoryFolderBase> folders, bool fetchFolders, 707 List<InventoryFolderBase> folders, bool fetchFolders,
708 bool fetchItems); 708 bool fetchItems);
diff --git a/OpenSim/Framework/LandData.cs b/OpenSim/Framework/LandData.cs
index 4e66721..7d29d10 100644
--- a/OpenSim/Framework/LandData.cs
+++ b/OpenSim/Framework/LandData.cs
@@ -77,6 +77,8 @@ namespace OpenSim.Framework
77 private UUID _snapshotID = UUID.Zero; 77 private UUID _snapshotID = UUID.Zero;
78 private Vector3 _userLocation = new Vector3(); 78 private Vector3 _userLocation = new Vector3();
79 private Vector3 _userLookAt = new Vector3(); 79 private Vector3 _userLookAt = new Vector3();
80 private int _dwell = 0;
81 private int _otherCleanTime = 0;
80 82
81 public Vector3 AABBMax { 83 public Vector3 AABBMax {
82 get { 84 get {
@@ -402,6 +404,24 @@ namespace OpenSim.Framework
402 } 404 }
403 } 405 }
404 406
407 public int Dwell {
408 get {
409 return _dwell;
410 }
411 set {
412 _dwell = value;
413 }
414 }
415
416 public int OtherCleanTime {
417 get {
418 return _otherCleanTime;
419 }
420 set {
421 _otherCleanTime = value;
422 }
423 }
424
405 public LandData() 425 public LandData()
406 { 426 {
407 _globalID = UUID.Random(); 427 _globalID = UUID.Random();
@@ -444,6 +464,8 @@ namespace OpenSim.Framework
444 landData._snapshotID = _snapshotID; 464 landData._snapshotID = _snapshotID;
445 landData._userLocation = _userLocation; 465 landData._userLocation = _userLocation;
446 landData._userLookAt = _userLookAt; 466 landData._userLookAt = _userLookAt;
467 landData._otherCleanTime = _otherCleanTime;
468 landData._dwell = _dwell;
447 469
448 landData._parcelAccessList.Clear(); 470 landData._parcelAccessList.Clear();
449 foreach (ParcelManager.ParcelAccessEntry entry in _parcelAccessList) 471 foreach (ParcelManager.ParcelAccessEntry entry in _parcelAccessList)
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
index 2d6508a..412f969 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
@@ -132,7 +132,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
132 private FriendActionDelegate handlerApproveFriendRequest = null; //OnApproveFriendRequest; 132 private FriendActionDelegate handlerApproveFriendRequest = null; //OnApproveFriendRequest;
133 private FriendshipTermination handlerTerminateFriendship = null; //OnTerminateFriendship; 133 private FriendshipTermination handlerTerminateFriendship = null; //OnTerminateFriendship;
134 private RezObject handlerRezObject = null; //OnRezObject; 134 private RezObject handlerRezObject = null; //OnRezObject;
135 private GenericCall4 handlerDeRezObject = null; //OnDeRezObject; 135 private DeRezObject handlerDeRezObject = null; //OnDeRezObject;
136 private ModifyTerrain handlerModifyTerrain = null; 136 private ModifyTerrain handlerModifyTerrain = null;
137 private BakeTerrain handlerBakeTerrain = null; 137 private BakeTerrain handlerBakeTerrain = null;
138 private EstateChangeInfo handlerEstateChangeInfo = null; 138 private EstateChangeInfo handlerEstateChangeInfo = null;
@@ -269,6 +269,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
269 private DirLandQuery handlerDirLandQuery = null; 269 private DirLandQuery handlerDirLandQuery = null;
270 private DirPopularQuery handlerDirPopularQuery = null; 270 private DirPopularQuery handlerDirPopularQuery = null;
271 private DirClassifiedQuery handlerDirClassifiedQuery = null; 271 private DirClassifiedQuery handlerDirClassifiedQuery = null;
272 private ParcelSetOtherCleanTime handlerParcelSetOtherCleanTime = null;
272 273
273 private MapItemRequest handlerMapItemRequest = null; 274 private MapItemRequest handlerMapItemRequest = null;
274 275
@@ -851,7 +852,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
851 public event ChatMessage OnChatFromClient; 852 public event ChatMessage OnChatFromClient;
852 public event TextureRequest OnRequestTexture; 853 public event TextureRequest OnRequestTexture;
853 public event RezObject OnRezObject; 854 public event RezObject OnRezObject;
854 public event GenericCall4 OnDeRezObject; 855 public event DeRezObject OnDeRezObject;
855 public event ModifyTerrain OnModifyTerrain; 856 public event ModifyTerrain OnModifyTerrain;
856 public event Action<IClientAPI> OnRegionHandShakeReply; 857 public event Action<IClientAPI> OnRegionHandShakeReply;
857 public event GenericCall2 OnRequestWearables; 858 public event GenericCall2 OnRequestWearables;
@@ -1004,6 +1005,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
1004 public event DirPopularQuery OnDirPopularQuery; 1005 public event DirPopularQuery OnDirPopularQuery;
1005 public event DirClassifiedQuery OnDirClassifiedQuery; 1006 public event DirClassifiedQuery OnDirClassifiedQuery;
1006 public event EventInfoRequest OnEventInfoRequest; 1007 public event EventInfoRequest OnEventInfoRequest;
1008 public event ParcelSetOtherCleanTime OnParcelSetOtherCleanTime;
1007 1009
1008 public event MapItemRequest OnMapItemRequest; 1010 public event MapItemRequest OnMapItemRequest;
1009 1011
@@ -2560,22 +2562,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
2560 OutPacket(terse, ThrottleOutPacketType.Task | ThrottleOutPacketType.LowPriority); 2562 OutPacket(terse, ThrottleOutPacketType.Task | ThrottleOutPacketType.LowPriority);
2561 } 2563 }
2562 2564
2563 public void SendPrimTerseUpdate(ulong regionHandle, ushort timeDilation, uint localID, Vector3 position,
2564 Quaternion rotation, Vector3 velocity, Vector3 rotationalvelocity)
2565 {
2566 if (rotation.X == rotation.Y && rotation.Y == rotation.Z && rotation.Z == rotation.W && rotation.W == 0)
2567 rotation = Quaternion.Identity;
2568 ImprovedTerseObjectUpdatePacket terse = (ImprovedTerseObjectUpdatePacket)PacketPool.Instance.GetPacket(PacketType.ImprovedTerseObjectUpdate);
2569 // TODO: don't create new blocks if recycling an old packet
2570 terse.RegionData.RegionHandle = regionHandle;
2571 terse.RegionData.TimeDilation = timeDilation;
2572 terse.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[1];
2573 terse.ObjectData[0] = CreatePrimImprovedBlock(localID, position, rotation, velocity, rotationalvelocity, 0);
2574 terse.Header.Reliable = false;
2575 terse.Header.Zerocoded = true;
2576 OutPacket(terse, ThrottleOutPacketType.Task | ThrottleOutPacketType.LowPriority);
2577 }
2578
2579 public void SendAssetUploadCompleteMessage(sbyte AssetType, bool Success, UUID AssetFullID) 2565 public void SendAssetUploadCompleteMessage(sbyte AssetType, bool Success, UUID AssetFullID)
2580 { 2566 {
2581 AssetUploadCompletePacket newPack = new AssetUploadCompletePacket(); 2567 AssetUploadCompletePacket newPack = new AssetUploadCompletePacket();
@@ -2922,7 +2908,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
2922 updatePacket.ParcelData.AABBMin = landData.AABBMin; 2908 updatePacket.ParcelData.AABBMin = landData.AABBMin;
2923 updatePacket.ParcelData.Area = landData.Area; 2909 updatePacket.ParcelData.Area = landData.Area;
2924 updatePacket.ParcelData.AuctionID = landData.AuctionID; 2910 updatePacket.ParcelData.AuctionID = landData.AuctionID;
2925 updatePacket.ParcelData.AuthBuyerID = landData.AuthBuyerID; //unemplemented 2911 updatePacket.ParcelData.AuthBuyerID = landData.AuthBuyerID;
2926 2912
2927 updatePacket.ParcelData.Bitmap = landData.Bitmap; 2913 updatePacket.ParcelData.Bitmap = landData.Bitmap;
2928 2914
@@ -2950,7 +2936,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
2950 updatePacket.ParcelData.MediaURL = LLUtil.StringToPacketBytes(landData.MediaURL); 2936 updatePacket.ParcelData.MediaURL = LLUtil.StringToPacketBytes(landData.MediaURL);
2951 updatePacket.ParcelData.MusicURL = LLUtil.StringToPacketBytes(landData.MusicURL); 2937 updatePacket.ParcelData.MusicURL = LLUtil.StringToPacketBytes(landData.MusicURL);
2952 updatePacket.ParcelData.Name = Utils.StringToBytes(landData.Name); 2938 updatePacket.ParcelData.Name = Utils.StringToBytes(landData.Name);
2953 updatePacket.ParcelData.OtherCleanTime = 0; //unemplemented 2939 updatePacket.ParcelData.OtherCleanTime = landData.OtherCleanTime;
2954 updatePacket.ParcelData.OtherCount = 0; //unemplemented 2940 updatePacket.ParcelData.OtherCount = 0; //unemplemented
2955 updatePacket.ParcelData.OtherPrims = landData.OtherPrims; 2941 updatePacket.ParcelData.OtherPrims = landData.OtherPrims;
2956 updatePacket.ParcelData.OwnerID = landData.OwnerID; 2942 updatePacket.ParcelData.OwnerID = landData.OwnerID;
@@ -4190,10 +4176,18 @@ namespace OpenSim.Region.ClientStack.LindenUDP
4190 } 4176 }
4191 break; 4177 break;
4192 case PacketType.DeRezObject: 4178 case PacketType.DeRezObject:
4179 DeRezObjectPacket DeRezPacket = (DeRezObjectPacket) Pack;
4193 handlerDeRezObject = OnDeRezObject; 4180 handlerDeRezObject = OnDeRezObject;
4194 if (handlerDeRezObject != null) 4181 if (handlerDeRezObject != null)
4195 { 4182 {
4196 handlerDeRezObject(Pack, this); 4183 foreach (DeRezObjectPacket.ObjectDataBlock data in
4184 DeRezPacket.ObjectData)
4185 {
4186 handlerDeRezObject(this, data.ObjectLocalID,
4187 DeRezPacket.AgentBlock.GroupID,
4188 DeRezPacket.AgentBlock.Destination,
4189 DeRezPacket.AgentBlock.DestinationID);
4190 }
4197 } 4191 }
4198 break; 4192 break;
4199 case PacketType.ModifyLand: 4193 case PacketType.ModifyLand:
@@ -6443,6 +6437,16 @@ namespace OpenSim.Region.ClientStack.LindenUDP
6443 } 6437 }
6444 break; 6438 break;
6445 6439
6440 case PacketType.ParcelSetOtherCleanTime:
6441 ParcelSetOtherCleanTimePacket parcelSetOtherCleanTimePacket = (ParcelSetOtherCleanTimePacket)Pack;
6442 handlerParcelSetOtherCleanTime = OnParcelSetOtherCleanTime;
6443 if (handlerParcelSetOtherCleanTime != null)
6444 {
6445 handlerParcelSetOtherCleanTime(this,
6446 parcelSetOtherCleanTimePacket.ParcelData.LocalID,
6447 parcelSetOtherCleanTimePacket.ParcelData.OtherCleanTime);
6448 }
6449 break;
6446 default: 6450 default:
6447 m_log.Warn("[CLIENT]: unhandled packet " + Pack.ToString()); 6451 m_log.Warn("[CLIENT]: unhandled packet " + Pack.ToString());
6448 break; 6452 break;
diff --git a/OpenSim/Region/Environment/Interfaces/ILandChannel.cs b/OpenSim/Region/Environment/Interfaces/ILandChannel.cs
index 98998f7..7da4d3c 100644
--- a/OpenSim/Region/Environment/Interfaces/ILandChannel.cs
+++ b/OpenSim/Region/Environment/Interfaces/ILandChannel.cs
@@ -45,5 +45,6 @@ namespace OpenSim.Region.Environment.Interfaces
45 void ReturnObjectsInParcel(int localID, uint returnType, UUID[] agentIDs, UUID[] taskIDs, IClientAPI remoteClient); 45 void ReturnObjectsInParcel(int localID, uint returnType, UUID[] agentIDs, UUID[] taskIDs, IClientAPI remoteClient);
46 void setParcelObjectMaxOverride(overrideParcelMaxPrimCountDelegate overrideDel); 46 void setParcelObjectMaxOverride(overrideParcelMaxPrimCountDelegate overrideDel);
47 void setSimulatorObjectMaxOverride(overrideSimulatorMaxPrimCountDelegate overrideDel); 47 void setSimulatorObjectMaxOverride(overrideSimulatorMaxPrimCountDelegate overrideDel);
48 void SetParcelOtherCleanTime(IClientAPI remoteClient, int localID, int otherCleanTime);
48 } 49 }
49} 50}
diff --git a/OpenSim/Region/Environment/Modules/World/Land/LandChannel.cs b/OpenSim/Region/Environment/Modules/World/Land/LandChannel.cs
index 8747bd4..892d1ae 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
175 m_landManagementModule.setSimulatorObjectMaxOverride(overrideDel); 175 m_landManagementModule.setSimulatorObjectMaxOverride(overrideDel);
176 } 176 }
177 } 177 }
178
179 public void SetParcelOtherCleanTime(IClientAPI remoteClient, int localID, int otherCleanTime)
180 {
181 if (m_landManagementModule != null)
182 {
183 m_landManagementModule.setParcelOtherCleanTime(remoteClient, localID, otherCleanTime);
184 }
185 }
186
178 #endregion 187 #endregion
179 188
180 } 189 }
diff --git a/OpenSim/Region/Environment/Modules/World/Land/LandManagementModule.cs b/OpenSim/Region/Environment/Modules/World/Land/LandManagementModule.cs
index 0ecfdd3..d595185 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
1233 else 1233 else
1234 m_log.Debug("[LAND] got no parcelinfo; not sending"); 1234 m_log.Debug("[LAND] got no parcelinfo; not sending");
1235 } 1235 }
1236
1237 public void setParcelOtherCleanTime(IClientAPI remoteClient, int localID,int otherCleanTime)
1238 {
1239 if (!landList.ContainsKey(localID))
1240 return;
1241
1242 ILandObject landObject = landList[localID];
1243
1244 if (!m_scene.ExternalChecks.ExternalChecksCanEditParcel(remoteClient.AgentId, landObject))
1245 return;
1246
1247 landObject.landData.OtherCleanTime = otherCleanTime;
1248
1249 UpdateLandObject(localID, landObject.landData);
1250 }
1236 } 1251 }
1237} 1252}
diff --git a/OpenSim/Region/Environment/Modules/World/NPC/NPCAvatar.cs b/OpenSim/Region/Environment/Modules/World/NPC/NPCAvatar.cs
index e5e6a79..52a2792 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
184 public event RequestAvatarProperties OnRequestAvatarProperties; 184 public event RequestAvatarProperties OnRequestAvatarProperties;
185 public event SetAlwaysRun OnSetAlwaysRun; 185 public event SetAlwaysRun OnSetAlwaysRun;
186 186
187 public event GenericCall4 OnDeRezObject; 187 public event DeRezObject OnDeRezObject;
188 public event Action<IClientAPI> OnRegionHandShakeReply; 188 public event Action<IClientAPI> OnRegionHandShakeReply;
189 public event GenericCall2 OnRequestWearables; 189 public event GenericCall2 OnRequestWearables;
190 public event GenericCall2 OnCompleteMovementToRegion; 190 public event GenericCall2 OnCompleteMovementToRegion;
@@ -330,6 +330,7 @@ namespace OpenSim.Region.Environment.Modules.World.NPC
330 public event DirPopularQuery OnDirPopularQuery; 330 public event DirPopularQuery OnDirPopularQuery;
331 public event DirClassifiedQuery OnDirClassifiedQuery; 331 public event DirClassifiedQuery OnDirClassifiedQuery;
332 public event EventInfoRequest OnEventInfoRequest; 332 public event EventInfoRequest OnEventInfoRequest;
333 public event ParcelSetOtherCleanTime OnParcelSetOtherCleanTime;
333 334
334 public event MapItemRequest OnMapItemRequest; 335 public event MapItemRequest OnMapItemRequest;
335 336
@@ -587,12 +588,6 @@ namespace OpenSim.Region.Environment.Modules.World.NPC
587 { 588 {
588 } 589 }
589 590
590 public virtual void SendPrimTerseUpdate(ulong regionHandle, ushort timeDilation, uint localID,
591 Vector3 position, Quaternion rotation, Vector3 velocity,
592 Vector3 rotationalvelocity)
593 {
594 }
595
596 public virtual void SendInventoryFolderDetails(UUID ownerID, UUID folderID, 591 public virtual void SendInventoryFolderDetails(UUID ownerID, UUID folderID,
597 List<InventoryItemBase> items, 592 List<InventoryItemBase> items,
598 List<InventoryFolderBase> folders, 593 List<InventoryFolderBase> folders,
diff --git a/OpenSim/Region/Environment/Scenes/AsyncSceneObjectGroupDeleter.cs b/OpenSim/Region/Environment/Scenes/AsyncSceneObjectGroupDeleter.cs
index 21fa71b..bd81a6d 100644
--- a/OpenSim/Region/Environment/Scenes/AsyncSceneObjectGroupDeleter.cs
+++ b/OpenSim/Region/Environment/Scenes/AsyncSceneObjectGroupDeleter.cs
@@ -38,8 +38,7 @@ namespace OpenSim.Region.Environment.Scenes
38{ 38{
39 class DeleteToInventoryHolder 39 class DeleteToInventoryHolder
40 { 40 {
41 public DeRezObjectPacket DeRezPacket; 41 public int destination;
42 public EntityBase selectedEnt;
43 public IClientAPI remoteClient; 42 public IClientAPI remoteClient;
44 public SceneObjectGroup objectGroup; 43 public SceneObjectGroup objectGroup;
45 public UUID folderID; 44 public UUID folderID;
@@ -70,20 +69,19 @@ namespace OpenSim.Region.Environment.Scenes
70 /// <summary> 69 /// <summary>
71 /// Delete the given object from the scene 70 /// Delete the given object from the scene
72 /// </summary> 71 /// </summary>
73 public void DeleteToInventory( 72 public void DeleteToInventory(int destination, UUID folderID,
74 DeRezObjectPacket DeRezPacket, UUID folderID, SceneObjectGroup objectGroup, IClientAPI remoteClient, 73 SceneObjectGroup objectGroup, IClientAPI remoteClient,
75 EntityBase selectedEnt, bool permissionToDelete) 74 bool permissionToDelete)
76 { 75 {
77 m_inventoryTicker.Stop(); 76 m_inventoryTicker.Stop();
78 77
79 lock (m_inventoryDeletes) 78 lock (m_inventoryDeletes)
80 { 79 {
81 DeleteToInventoryHolder dtis = new DeleteToInventoryHolder(); 80 DeleteToInventoryHolder dtis = new DeleteToInventoryHolder();
82 dtis.DeRezPacket = DeRezPacket; 81 dtis.destination = destination;
83 dtis.folderID = folderID; 82 dtis.folderID = folderID;
84 dtis.objectGroup = objectGroup; 83 dtis.objectGroup = objectGroup;
85 dtis.remoteClient = remoteClient; 84 dtis.remoteClient = remoteClient;
86 dtis.selectedEnt = selectedEnt;
87 dtis.permissionToDelete = permissionToDelete; 85 dtis.permissionToDelete = permissionToDelete;
88 86
89 m_inventoryDeletes.Enqueue(dtis); 87 m_inventoryDeletes.Enqueue(dtis);
@@ -121,8 +119,9 @@ namespace OpenSim.Region.Environment.Scenes
121 "[SCENE]: Sending deleted object to user's inventory, {0} item(s) remaining.", left); 119 "[SCENE]: Sending deleted object to user's inventory, {0} item(s) remaining.", left);
122 120
123 x = m_inventoryDeletes.Dequeue(); 121 x = m_inventoryDeletes.Dequeue();
124 m_scene.DeleteToInventory( 122 m_scene.DeleteToInventory(x.destination,
125 x.DeRezPacket, x.selectedEnt, x.remoteClient, x.objectGroup, x.folderID, x.permissionToDelete); 123 x.folderID, x.objectGroup, x.remoteClient,
124 x.permissionToDelete);
126 125
127 return true; 126 return true;
128 } 127 }
diff --git a/OpenSim/Region/Environment/Scenes/ReturnInfo.cs b/OpenSim/Region/Environment/Scenes/ReturnInfo.cs
new file mode 100644
index 0000000..68c563d
--- /dev/null
+++ b/OpenSim/Region/Environment/Scenes/ReturnInfo.cs
@@ -0,0 +1,38 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSim Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using OpenMetaverse;
29
30namespace OpenSim.Region.Environment.Scenes
31{
32 public struct ReturnInfo
33 {
34 public int count;
35 public Vector3 location;
36 public string objectName;
37 }
38}
diff --git a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs
index 226f39a..b91eb83 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
1517 /// </summary> 1517 /// </summary>
1518 /// <param name="packet"></param> 1518 /// <param name="packet"></param>
1519 /// <param name="remoteClient"></param> 1519 /// <param name="remoteClient"></param>
1520 public virtual void DeRezObject(Packet packet, IClientAPI remoteClient) 1520 public virtual void DeRezObject(IClientAPI remoteClient, uint localID,
1521 UUID groupID, byte destination, UUID destinationID)
1521 { 1522 {
1522 DeRezObjectPacket DeRezPacket = (DeRezObjectPacket) packet; 1523 SceneObjectPart part = GetSceneObjectPart(localID);
1524 if (part == null)
1525 return;
1523 1526
1524 UUID folderID = UUID.Zero; 1527 if (part.ParentGroup == null || part.ParentGroup.RootPart == null)
1528 return;
1525 1529
1526 foreach (DeRezObjectPacket.ObjectDataBlock Data in DeRezPacket.ObjectData) 1530 // Can't delete child prims
1527 { 1531 if (part != part.ParentGroup.RootPart)
1528// m_log.DebugFormat( 1532 return;
1529// "[AGENT INVENTORY]: Received request to derez {0} into folder {1}", 1533
1530// Data.ObjectLocalID, DeRezPacket.AgentBlock.DestinationID); 1534 SceneObjectGroup grp = part.ParentGroup;
1535
1536 bool permissionToTake = false;
1537 bool permissionToDelete = false;
1531 1538
1532 EntityBase selectedEnt = null; 1539 if (destination == 1) // Take Copy
1533 //m_log.Info("[CLIENT]: LocalID:" + Data.ObjectLocalID.ToString()); 1540 {
1541 permissionToTake =
1542 ExternalChecks.ExternalChecksCanTakeCopyObject(
1543 grp.UUID,
1544 remoteClient.AgentId);
1545 }
1546 else if (destination == 5) // God take copy
1547 {
1548 permissionToTake =
1549 ExternalChecks.ExternalChecksCanBeGodLike(
1550 remoteClient.AgentId);
1551 }
1552 else if (destination == 4) // Take
1553 {
1554 permissionToTake =
1555 ExternalChecks.ExternalChecksCanTakeObject(
1556 grp.UUID,
1557 remoteClient.AgentId);
1534 1558
1535 List<EntityBase> EntityList = GetEntities(); 1559 //If they can take, they can delete!
1560 permissionToDelete = permissionToTake;
1561 }
1536 1562
1537 foreach (EntityBase ent in EntityList) 1563 else if (destination == 6) //Delete
1564 {
1565 permissionToTake =
1566 ExternalChecks.ExternalChecksCanDeleteObject(
1567 grp.UUID,
1568 remoteClient.AgentId);
1569 permissionToDelete =
1570 ExternalChecks.ExternalChecksCanDeleteObject(
1571 grp.UUID,
1572 remoteClient.AgentId);
1573 }
1574 else if (destination == 9) //Return
1575 {
1576 if (remoteClient != null)
1538 { 1577 {
1539 if (ent.LocalId == Data.ObjectLocalID) 1578 permissionToTake =
1540 { 1579 ExternalChecks.ExternalChecksCanDeleteObject(
1541 selectedEnt = ent; 1580 grp.UUID,
1542 break; 1581 remoteClient.AgentId);
1543 } 1582 permissionToDelete =
1583 ExternalChecks.ExternalChecksCanDeleteObject(
1584 grp.UUID,
1585 remoteClient.AgentId);
1544 } 1586 }
1545 if (selectedEnt != null) 1587 else // Auto return passes through here with null agent
1546 { 1588 {
1547 bool permissionToTake = false; 1589 permissionToTake = true;
1548 bool permissionToDelete = false; 1590 permissionToDelete = true;
1549 if (DeRezPacket.AgentBlock.Destination == 1)// Take Copy
1550 {
1551 permissionToTake = ExternalChecks.ExternalChecksCanTakeCopyObject(((SceneObjectGroup)selectedEnt).UUID, remoteClient.AgentId);
1552 permissionToDelete = false; //Just taking copy!
1553
1554 }
1555 else if (DeRezPacket.AgentBlock.Destination == 5) //God take copy
1556 {
1557 permissionToTake = ExternalChecks.ExternalChecksCanBeGodLike(remoteClient.AgentId);
1558 permissionToDelete = false; //Just taking copy!
1559
1560 }
1561 else if (DeRezPacket.AgentBlock.Destination == 4) //Take
1562 {
1563 // Take
1564 permissionToTake = ExternalChecks.ExternalChecksCanTakeObject(((SceneObjectGroup)selectedEnt).UUID, remoteClient.AgentId);
1565 permissionToDelete = permissionToTake; //If they can take, they can delete!
1566 }
1567
1568 else if (DeRezPacket.AgentBlock.Destination == 6) //Delete
1569 {
1570 permissionToTake = ExternalChecks.ExternalChecksCanDeleteObject(((SceneObjectGroup)selectedEnt).UUID, remoteClient.AgentId);
1571 permissionToDelete = ExternalChecks.ExternalChecksCanDeleteObject(((SceneObjectGroup)selectedEnt).UUID, remoteClient.AgentId);
1572 }
1573 else if (DeRezPacket.AgentBlock.Destination == 9) //Return
1574 {
1575 permissionToTake = ExternalChecks.ExternalChecksCanDeleteObject(((SceneObjectGroup)selectedEnt).UUID, remoteClient.AgentId);
1576 permissionToDelete = ExternalChecks.ExternalChecksCanDeleteObject(((SceneObjectGroup)selectedEnt).UUID, remoteClient.AgentId);
1577 }
1578
1579 SceneObjectGroup objectGroup = (SceneObjectGroup)selectedEnt;
1580
1581 if (permissionToTake)
1582 {
1583 m_asyncSceneObjectDeleter.DeleteToInventory(
1584 DeRezPacket, folderID, objectGroup, remoteClient, selectedEnt, permissionToDelete);
1585 }
1586 else if (permissionToDelete)
1587 {
1588 DeleteSceneObject(objectGroup);
1589 }
1590 } 1591 }
1591 } 1592 }
1593
1594 if (permissionToTake)
1595 {
1596 m_asyncSceneObjectDeleter.DeleteToInventory(
1597 destination, destinationID, grp, remoteClient,
1598 permissionToDelete);
1599 }
1600 else if (permissionToDelete)
1601 {
1602 DeleteSceneObject(grp);
1603 }
1592 } 1604 }
1593 1605
1594 /// <summary> 1606 /// <summary>
@@ -1600,51 +1612,50 @@ namespace OpenSim.Region.Environment.Scenes
1600 /// <param name="objectGroup"></param> 1612 /// <param name="objectGroup"></param>
1601 /// <param name="folderID"></param> 1613 /// <param name="folderID"></param>
1602 /// <param name="permissionToDelete"></param> 1614 /// <param name="permissionToDelete"></param>
1603 public void DeleteToInventory(DeRezObjectPacket DeRezPacket, EntityBase selectedEnt, IClientAPI remoteClient, 1615 public void DeleteToInventory(int destination, UUID folderID,
1604 SceneObjectGroup objectGroup, UUID folderID, bool permissionToDelete) 1616 SceneObjectGroup objectGroup, IClientAPI remoteClient,
1617 bool permissionToDelete)
1605 { 1618 {
1606 string sceneObjectXml = objectGroup.ToXmlString(); 1619 string sceneObjectXml = objectGroup.ToXmlString();
1607 1620
1608 CachedUserInfo userInfo = 1621 CachedUserInfo userInfo =
1609 CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId); 1622 CommsManager.UserProfileCacheService.GetUserDetails(
1610 if (userInfo != null) 1623 remoteClient.AgentId);
1611 {
1612// string searchFolder = "";
1613 1624
1614// if (DeRezPacket.AgentBlock.Destination == 6) 1625 if (remoteClient == null)
1615// searchFolder = "Trash"; 1626 {
1616// else if (DeRezPacket.AgentBlock.Destination == 9) 1627 userInfo = CommsManager.UserProfileCacheService.GetUserDetails(
1617// searchFolder = "Lost And Found"; 1628 objectGroup.RootPart.OwnerID);
1629 }
1630 else
1631 {
1632 userInfo = CommsManager.UserProfileCacheService.GetUserDetails(
1633 remoteClient.AgentId);
1634 }
1618 1635
1619 // If we're deleting someone else's item, it goes back to their deleted items folder 1636 if (userInfo != null)
1620 // If we're returning someone's item, it goes back to the owner's Lost And Found folder. 1637 {
1638 // If we're deleting someone else's item, it goes back to
1639 // their deleted items folder
1640 // If we're returning someone's item, it goes back to the
1641 // owner's Lost And Found folder.
1621 1642
1622 if (DeRezPacket.AgentBlock.DestinationID == UUID.Zero || (DeRezPacket.AgentBlock.Destination == 6 && objectGroup.OwnerID != remoteClient.AgentId)) 1643 if (folderID == UUID.Zero || (destination == 6 &&
1644 objectGroup.OwnerID != remoteClient.AgentId))
1623 { 1645 {
1624 List<InventoryFolderBase> subrootfolders = userInfo.RootFolder.RequestListOfFolders(); 1646 InventoryFolderBase folder =
1625 foreach (InventoryFolderBase flder in subrootfolders) 1647 userInfo.FindFolderForType(
1626 { 1648 (int)AssetType.LostAndFoundFolder);
1627 if (flder.Name == "Lost And Found")
1628 {
1629 folderID = flder.ID;
1630 break;
1631 }
1632 }
1633 1649
1634 if (folderID == UUID.Zero) 1650 if (folder != null)
1635 { 1651 folderID = folder.ID;
1652 else
1636 folderID = userInfo.RootFolder.ID; 1653 folderID = userInfo.RootFolder.ID;
1637 }
1638 //currently following code not used (or don't know of any case of destination being zero
1639 }
1640 else
1641 {
1642 folderID = DeRezPacket.AgentBlock.DestinationID;
1643 } 1654 }
1644 1655
1645 AssetBase asset = CreateAsset( 1656 AssetBase asset = CreateAsset(
1646 ((SceneObjectGroup) selectedEnt).GetPartName(selectedEnt.LocalId), 1657 objectGroup.GetPartName(objectGroup.RootPart.LocalId),
1647 ((SceneObjectGroup) selectedEnt).GetPartDescription(selectedEnt.LocalId), 1658 objectGroup.GetPartDescription(objectGroup.RootPart.LocalId),
1648 (sbyte)AssetType.Object, 1659 (sbyte)AssetType.Object,
1649 Utils.StringToBytes(sceneObjectXml)); 1660 Utils.StringToBytes(sceneObjectXml));
1650 AssetCache.AddAsset(asset); 1661 AssetCache.AddAsset(asset);
@@ -1652,7 +1663,8 @@ namespace OpenSim.Region.Environment.Scenes
1652 InventoryItemBase item = new InventoryItemBase(); 1663 InventoryItemBase item = new InventoryItemBase();
1653 item.Creator = objectGroup.RootPart.CreatorID; 1664 item.Creator = objectGroup.RootPart.CreatorID;
1654 1665
1655 if (DeRezPacket.AgentBlock.Destination == 1 || DeRezPacket.AgentBlock.Destination == 4)// Take / Copy 1666 if (destination == 1 ||
1667 destination == 4)// Take / Copy
1656 item.Owner = remoteClient.AgentId; 1668 item.Owner = remoteClient.AgentId;
1657 else // Delete / Return 1669 else // Delete / Return
1658 item.Owner = objectGroup.OwnerID; 1670 item.Owner = objectGroup.OwnerID;
@@ -1720,7 +1732,7 @@ namespace OpenSim.Region.Environment.Scenes
1720 { 1732 {
1721 if (!grp.HasGroupChanged) 1733 if (!grp.HasGroupChanged)
1722 { 1734 {
1723 m_log.InfoFormat("[ATTACHMENT] Detaching {0} which is unchanged", grp.UUID.ToString()); 1735 m_log.InfoFormat("[ATTACHMENT] Save request for {0} which is unchanged", grp.UUID.ToString());
1724 return; 1736 return;
1725 } 1737 }
1726 m_log.InfoFormat("[ATTACHMENT] Updating asset for attachment {0}, attachpoint {1}", grp.UUID.ToString(), grp.GetAttachmentPoint()); 1738 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 299d0da..139281d 100644
--- a/OpenSim/Region/Environment/Scenes/Scene.cs
+++ b/OpenSim/Region/Environment/Scenes/Scene.cs
@@ -96,6 +96,8 @@ namespace OpenSim.Region.Environment.Scenes
96 private int m_incrementsof15seconds = 0; 96 private int m_incrementsof15seconds = 0;
97 private volatile bool m_backingup = false; 97 private volatile bool m_backingup = false;
98 98
99 private Dictionary<UUID, ReturnInfo> m_returns = new Dictionary<UUID, ReturnInfo>();
100
99 protected string m_simulatorVersion = "OpenSimulator Server"; 101 protected string m_simulatorVersion = "OpenSimulator Server";
100 102
101 protected ModuleLoader m_moduleLoader; 103 protected ModuleLoader m_moduleLoader;
@@ -929,8 +931,54 @@ namespace OpenSim.Region.Environment.Scenes
929 /// <returns></returns> 931 /// <returns></returns>
930 public void Backup() 932 public void Backup()
931 { 933 {
934 m_returns.Clear();
935
932 EventManager.TriggerOnBackup(m_storageManager.DataStore); 936 EventManager.TriggerOnBackup(m_storageManager.DataStore);
933 m_backingup = false; 937 m_backingup = false;
938
939 foreach (KeyValuePair<UUID, ReturnInfo> ret in m_returns)
940 {
941 UUID transaction = UUID.Random();
942
943 GridInstantMessage msg = new GridInstantMessage();
944 msg.fromAgentID = new Guid(UUID.Zero.ToString()); // From server
945 msg.fromAgentSession = new Guid(transaction.ToString());
946 msg.toAgentID = new Guid(ret.Key.ToString());
947 msg.imSessionID = new Guid(transaction.ToString());
948 msg.timestamp = (uint)Util.UnixTimeSinceEpoch();
949 msg.fromAgentName = "Server";
950 msg.dialog = (byte)19; // Object msg
951 msg.fromGroup = false;
952 msg.offline = (byte)1;
953 msg.ParentEstateID = RegionInfo.EstateSettings.ParentEstateID;
954 msg.Position = Vector3.Zero;
955 msg.RegionID = RegionInfo.RegionID.Guid;
956 msg.binaryBucket = new byte[0];
957 if (ret.Value.count > 1)
958 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);
959 else
960 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);
961
962 TriggerGridInstantMessage(msg, InstantMessageReceiver.IMModule);
963 }
964 }
965
966 public void AddReturn(UUID agentID, string objectName, Vector3 location)
967 {
968 if (m_returns.ContainsKey(agentID))
969 {
970 ReturnInfo info = m_returns[agentID];
971 info.count++;
972 m_returns[agentID] = info;
973 }
974 else
975 {
976 ReturnInfo info = new ReturnInfo();
977 info.count = 1;
978 info.objectName = objectName;
979 info.location = location;
980 m_returns[agentID] = info;
981 }
934 } 982 }
935 983
936 #endregion 984 #endregion
@@ -2254,6 +2302,7 @@ namespace OpenSim.Region.Environment.Scenes
2254 client.OnUndo += m_innerScene.HandleUndo; 2302 client.OnUndo += m_innerScene.HandleUndo;
2255 client.OnObjectGroupRequest += m_innerScene.HandleObjectGroupUpdate; 2303 client.OnObjectGroupRequest += m_innerScene.HandleObjectGroupUpdate;
2256 client.OnParcelReturnObjectsRequest += LandChannel.ReturnObjectsInParcel; 2304 client.OnParcelReturnObjectsRequest += LandChannel.ReturnObjectsInParcel;
2305 client.OnParcelSetOtherCleanTime += LandChannel.SetParcelOtherCleanTime;
2257 client.OnObjectSaleInfo += ObjectSaleInfo; 2306 client.OnObjectSaleInfo += ObjectSaleInfo;
2258 client.OnScriptReset += ProcessScriptReset; 2307 client.OnScriptReset += ProcessScriptReset;
2259 client.OnGetScriptRunning += GetScriptRunning; 2308 client.OnGetScriptRunning += GetScriptRunning;
diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs
index 8c5afab..60cf061 100644
--- a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs
@@ -99,6 +99,8 @@ namespace OpenSim.Region.Environment.Scenes
99 private Vector3 lastPhysGroupPos; 99 private Vector3 lastPhysGroupPos;
100 private Quaternion lastPhysGroupRot; 100 private Quaternion lastPhysGroupRot;
101 101
102 private bool m_isBackedUp = false;
103
102 /// <summary> 104 /// <summary>
103 /// The constituent parts of this group 105 /// The constituent parts of this group
104 /// </summary> 106 /// </summary>
@@ -120,7 +122,11 @@ namespace OpenSim.Region.Environment.Scenes
120 /// </summary> 122 /// </summary>
121 public override string Name 123 public override string Name
122 { 124 {
123 get { return RootPart.Name; } 125 get {
126 if (RootPart == null)
127 return "";
128 return RootPart.Name;
129 }
124 set { RootPart.Name = value; } 130 set { RootPart.Name = value; }
125 } 131 }
126 132
@@ -544,7 +550,9 @@ namespace OpenSim.Region.Environment.Scenes
544 //m_log.DebugFormat( 550 //m_log.DebugFormat(
545 // "[SCENE OBJECT GROUP]: Attaching object {0} {1} to scene presistence sweep", Name, UUID); 551 // "[SCENE OBJECT GROUP]: Attaching object {0} {1} to scene presistence sweep", Name, UUID);
546 552
547 m_scene.EventManager.OnBackup += ProcessBackup; 553 if (!m_isBackedUp)
554 m_scene.EventManager.OnBackup += ProcessBackup;
555 m_isBackedUp = true;
548 } 556 }
549 } 557 }
550 558
@@ -786,6 +794,7 @@ namespace OpenSim.Region.Environment.Scenes
786 SetAttachmentPoint((byte)0); 794 SetAttachmentPoint((byte)0);
787 m_rootPart.ApplyPhysics(m_rootPart.GetEffectiveObjectFlags(), m_scene.m_physicalPrim); 795 m_rootPart.ApplyPhysics(m_rootPart.GetEffectiveObjectFlags(), m_scene.m_physicalPrim);
788 HasGroupChanged = true; 796 HasGroupChanged = true;
797 RootPart.Rezzed = DateTime.Now;
789 AttachToBackup(); 798 AttachToBackup();
790 m_scene.EventManager.TriggerParcelPrimCountTainted(); 799 m_scene.EventManager.TriggerParcelPrimCountTainted();
791 m_rootPart.ScheduleFullUpdate(); 800 m_rootPart.ScheduleFullUpdate();
@@ -1000,6 +1009,8 @@ namespace OpenSim.Region.Environment.Scenes
1000 // that they don't happen, otherwise the deleted objects will reappear 1009 // that they don't happen, otherwise the deleted objects will reappear
1001 m_isDeleted = true; 1010 m_isDeleted = true;
1002 1011
1012 DetachFromBackup();
1013
1003 foreach (SceneObjectPart part in m_parts.Values) 1014 foreach (SceneObjectPart part in m_parts.Values)
1004 { 1015 {
1005 List<ScenePresence> avatars = Scene.GetScenePresences(); 1016 List<ScenePresence> avatars = Scene.GetScenePresences();
@@ -1149,6 +1160,28 @@ namespace OpenSim.Region.Environment.Scenes
1149 // any exception propogate upwards. 1160 // any exception propogate upwards.
1150 try 1161 try
1151 { 1162 {
1163 ILandObject parcel = m_scene.LandChannel.GetLandObject(
1164 m_rootPart.GroupPosition.X, m_rootPart.GroupPosition.Y);
1165
1166 if (parcel.landData.OtherCleanTime != 0)
1167 {
1168 if (parcel.landData.OwnerID != OwnerID &&
1169 (parcel.landData.GroupID != GroupID ||
1170 parcel.landData.GroupID == UUID.Zero))
1171 {
1172 if ((DateTime.Now - RootPart.Rezzed).TotalMinutes >
1173 parcel.landData.OtherCleanTime)
1174 {
1175 m_log.InfoFormat("[SCENE] Returning object {0} due to parcel auto return", RootPart.UUID.ToString());
1176 m_scene.AddReturn(OwnerID, Name, AbsolutePosition);
1177 m_scene.DeRezObject(null, RootPart.LocalId,
1178 RootPart.GroupID, 9, UUID.Zero);
1179
1180 return;
1181 }
1182 }
1183 }
1184
1152 if (HasGroupChanged) 1185 if (HasGroupChanged)
1153 { 1186 {
1154 // don't backup while it's selected or you're asking for changes mid stream. 1187 // don't backup while it's selected or you're asking for changes mid stream.
@@ -1226,35 +1259,6 @@ namespace OpenSim.Region.Environment.Scenes
1226 } 1259 }
1227 } 1260 }
1228 1261
1229 /// <summary>
1230 /// Send a terse update to the client for the given part
1231 /// </summary>
1232 /// <param name="remoteClient"></param>
1233 /// <param name="part"></param>
1234 internal void SendPartTerseUpdate(IClientAPI remoteClient, SceneObjectPart part)
1235 {
1236 SceneObjectPart rootPart = m_rootPart;
1237
1238 // TODO: that could by caused by some race condition with attachments on sim-crossing
1239 if (rootPart == null) return;
1240
1241 if (rootPart.UUID == part.UUID)
1242 {
1243 if (rootPart.IsAttachment)
1244 {
1245 part.SendTerseUpdateToClient(remoteClient, rootPart.AttachedPos);
1246 }
1247 else
1248 {
1249 part.SendTerseUpdateToClient(remoteClient, AbsolutePosition);
1250 }
1251 }
1252 else
1253 {
1254 part.SendTerseUpdateToClient(remoteClient);
1255 }
1256 }
1257
1258 #endregion 1262 #endregion
1259 1263
1260 #region Copying 1264 #region Copying
@@ -1920,6 +1924,8 @@ namespace OpenSim.Region.Environment.Scenes
1920 if (sendEvents) 1924 if (sendEvents)
1921 linkPart.TriggerScriptChangedEvent(Changed.LINK); 1925 linkPart.TriggerScriptChangedEvent(Changed.LINK);
1922 1926
1927 linkPart.Rezzed = RootPart.Rezzed;
1928
1923 HasGroupChanged = true; 1929 HasGroupChanged = true;
1924 ScheduleGroupForFullUpdate(); 1930 ScheduleGroupForFullUpdate();
1925 } 1931 }
@@ -1937,7 +1943,9 @@ namespace OpenSim.Region.Environment.Scenes
1937 /// <param name="objectGroup"></param> 1943 /// <param name="objectGroup"></param>
1938 public void DetachFromBackup() 1944 public void DetachFromBackup()
1939 { 1945 {
1940 m_scene.EventManager.OnBackup -= ProcessBackup; 1946 if (m_isBackedUp)
1947 m_scene.EventManager.OnBackup -= ProcessBackup;
1948 m_isBackedUp = false;
1941 } 1949 }
1942 1950
1943 private void LinkNonRootPart(SceneObjectPart part, Vector3 oldGroupPosition, Quaternion oldGroupRotation) 1951 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 bf6025e..6c76d54 100644
--- a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs
@@ -212,6 +212,7 @@ namespace OpenSim.Region.Environment.Scenes
212 // It's not necessary to persist this 212 // It's not necessary to persist this
213 m_TextureAnimation = new byte[0]; 213 m_TextureAnimation = new byte[0];
214 m_particleSystem = new byte[0]; 214 m_particleSystem = new byte[0];
215 Rezzed = DateTime.Now;
215 } 216 }
216 217
217 public SceneObjectPart(ulong regionHandle, SceneObjectGroup parent, UUID ownerID, uint localID, 218 public SceneObjectPart(ulong regionHandle, SceneObjectGroup parent, UUID ownerID, uint localID,
@@ -237,6 +238,7 @@ namespace OpenSim.Region.Environment.Scenes
237 m_regionHandle = regionHandle; 238 m_regionHandle = regionHandle;
238 m_parentGroup = parent; 239 m_parentGroup = parent;
239 240
241 Rezzed = DateTime.Now;
240 _creationDate = (Int32) (DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds; 242 _creationDate = (Int32) (DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds;
241 _ownerID = ownerID; 243 _ownerID = ownerID;
242 _creatorID = _ownerID; 244 _creatorID = _ownerID;
@@ -311,6 +313,8 @@ namespace OpenSim.Region.Environment.Scenes
311 RotationOffset = rotation; 313 RotationOffset = rotation;
312 ObjectFlags = flags; 314 ObjectFlags = flags;
313 315
316 Rezzed = DateTime.Now;
317
314 m_TextureAnimation = new byte[0]; 318 m_TextureAnimation = new byte[0];
315 m_particleSystem = new byte[0]; 319 m_particleSystem = new byte[0];
316 // Since we don't store script state, this is only a 'temporary' objectflag now 320 // Since we don't store script state, this is only a 'temporary' objectflag now
@@ -339,6 +343,7 @@ namespace OpenSim.Region.Environment.Scenes
339 */ 343 */
340 344
341 //System.Console.WriteLine("SceneObjectPart Deserialize END"); 345 //System.Console.WriteLine("SceneObjectPart Deserialize END");
346 Rezzed = DateTime.Now;
342 } 347 }
343 348
344 #endregion Constructors 349 #endregion Constructors
@@ -362,6 +367,7 @@ namespace OpenSim.Region.Environment.Scenes
362 private uint _nextOwnerMask = (uint)PermissionMask.All; 367 private uint _nextOwnerMask = (uint)PermissionMask.All;
363 private PrimFlags _flags = 0; 368 private PrimFlags _flags = 0;
364 private DateTime m_expires; 369 private DateTime m_expires;
370 private DateTime m_rezzed;
365 371
366 public UUID CreatorID { 372 public UUID CreatorID {
367 get 373 get
@@ -459,6 +465,13 @@ namespace OpenSim.Region.Environment.Scenes
459 set { m_expires = value; } 465 set { m_expires = value; }
460 } 466 }
461 467
468 [XmlIgnore]
469 public DateTime Rezzed
470 {
471 get { return m_rezzed; }
472 set { m_rezzed = value; }
473 }
474
462 /// <summary> 475 /// <summary>
463 /// The position of the entire group that this prim belongs to. 476 /// The position of the entire group that this prim belongs to.
464 /// </summary> 477 /// </summary>
@@ -1270,6 +1283,7 @@ if (m_shape != null) {
1270 dupe._objectSaleType = _objectSaleType; 1283 dupe._objectSaleType = _objectSaleType;
1271 dupe._salePrice = _salePrice; 1284 dupe._salePrice = _salePrice;
1272 dupe._category = _category; 1285 dupe._category = _category;
1286 dupe.m_rezzed = m_rezzed;
1273 1287
1274 dupe.TaskInventory = (TaskInventoryDictionary)dupe.TaskInventory.Clone(); 1288 dupe.TaskInventory = (TaskInventoryDictionary)dupe.TaskInventory.Clone();
1275 1289
@@ -2226,10 +2240,10 @@ if (m_shape != null) {
2226 /// Send a terse update to the client. 2240 /// Send a terse update to the client.
2227 /// </summary> 2241 /// </summary>
2228 /// <param name="remoteClient"></param> 2242 /// <param name="remoteClient"></param>
2229 public void SendTerseUpdate(IClientAPI remoteClient) 2243// public void SendTerseUpdate(IClientAPI remoteClient)
2230 { 2244// {
2231 m_parentGroup.SendPartTerseUpdate(remoteClient, this); 2245// SendTerseUpdateToClient(remoteClient);
2232 } 2246// }
2233 2247
2234 /// <summary> 2248 /// <summary>
2235 /// 2249 ///
@@ -2239,54 +2253,14 @@ if (m_shape != null) {
2239 List<ScenePresence> avatars = m_parentGroup.Scene.GetScenePresences(); 2253 List<ScenePresence> avatars = m_parentGroup.Scene.GetScenePresences();
2240 for (int i = 0; i < avatars.Count; i++) 2254 for (int i = 0; i < avatars.Count; i++)
2241 { 2255 {
2242 m_parentGroup.SendPartTerseUpdate(avatars[i].ControllingClient, this); 2256 SendTerseUpdateToClient(avatars[i].ControllingClient);
2243 }
2244 }
2245
2246 public void SendTerseUpdateToClient(IClientAPI remoteClient)
2247 {
2248 Vector3 lPos;
2249 lPos = OffsetPosition;
2250 Quaternion mRot = RotationOffset;
2251 // TODO: I have no idea why we are making this check. This should be sorted out
2252 if ((ObjectFlags & (uint) PrimFlags.Physics) == 0)
2253 {
2254 remoteClient.SendPrimTerseUpdate(m_regionHandle, (ushort)(m_parentGroup.GetTimeDilation() * (float)ushort.MaxValue), LocalId, lPos, mRot, Velocity, RotationalVelocity, Shape.State, FromAssetID);
2255 }
2256 else
2257 {
2258 remoteClient.SendPrimTerseUpdate(m_regionHandle, (ushort)(m_parentGroup.GetTimeDilation() * (float)ushort.MaxValue), LocalId, lPos, mRot, Velocity,
2259 RotationalVelocity);
2260 //System.Console.WriteLine("LID: " + LocalID + " RVel:" + RotationalVelocity.ToString() + " TD: " + ((ushort)(m_parentGroup.Scene.TimeDilation * 500000f)).ToString() + ":" + m_parentGroup.Scene.TimeDilation.ToString());
2261 } 2257 }
2262 } 2258 }
2263 2259
2264 public void SendTerseUpdateToClient(IClientAPI remoteClient, Vector3 lPos) 2260// public void SendTerseUpdateToClient(IClientAPI remoteClient, Vector3 lPos)
2265 { 2261// {
2266 Quaternion mRot = RotationOffset; 2262// SendTerseUpdateToClient(remoteclient);
2267 //bool isattachment = IsAttachment; 2263// }
2268 //if (LocalId != ParentGroup.RootPart.LocalId)
2269 //isattachment = ParentGroup.RootPart.IsAttachment;
2270
2271 if (IsAttachment)
2272 {
2273 //m_log.Debug(AttachmentPoint.ToString());
2274 remoteClient.SendPrimTerseUpdate(m_regionHandle, (ushort)(m_parentGroup.GetTimeDilation() * (float)ushort.MaxValue), LocalId, lPos, mRot, Velocity, RotationalVelocity, (byte)((AttachmentPoint % 16) * 16 + (AttachmentPoint / 16)),FromAssetID);
2275 }
2276 else
2277 {
2278 if ((ObjectFlags & (uint)PrimFlags.Physics) == 0)
2279 {
2280 remoteClient.SendPrimTerseUpdate(m_regionHandle, (ushort)(m_parentGroup.GetTimeDilation() * (float)ushort.MaxValue), LocalId, lPos, mRot, Velocity, RotationalVelocity, Shape.State, FromAssetID);
2281 }
2282 else
2283 {
2284 remoteClient.SendPrimTerseUpdate(m_regionHandle, (ushort)(m_parentGroup.GetTimeDilation() * (float)ushort.MaxValue), LocalId, lPos, mRot, Velocity,
2285 RotationalVelocity);
2286 //System.Console.WriteLine("LID: " + LocalID + "RVel:" + RotationalVelocity.ToString() + " TD: " + ((ushort)(m_parentGroup.Scene.TimeDilation * 500000f)).ToString() + ":" + m_parentGroup.Scene.TimeDilation.ToString());
2287 }
2288 }
2289 }
2290 2264
2291 public void SetAttachmentPoint(uint AttachmentPoint) 2265 public void SetAttachmentPoint(uint AttachmentPoint)
2292 { 2266 {
@@ -3257,6 +3231,15 @@ if (m_shape != null) {
3257 PhysActor.Shape = m_shape; 3231 PhysActor.Shape = m_shape;
3258 } 3232 }
3259 3233
3234 // This is what makes vehicle trailers work
3235 // A script in a child prim re-issues
3236 // llSetPrimitiveParams(PRIM_TYPE) every few seconds. That
3237 // prevents autoreturn. This is not well known. It also works
3238 // in SL.
3239 //
3240 if (ParentGroup.RootPart != this)
3241 ParentGroup.RootPart.Rezzed = DateTime.Now;
3242
3260 ParentGroup.HasGroupChanged = true; 3243 ParentGroup.HasGroupChanged = true;
3261 ScheduleFullUpdate(); 3244 ScheduleFullUpdate();
3262 } 3245 }
@@ -3427,5 +3410,42 @@ if (m_shape != null) {
3427 } 3410 }
3428 3411
3429 #endregion Public Methods 3412 #endregion Public Methods
3413
3414 private byte GetAttachPointEncoded()
3415 {
3416 return (byte)((AttachmentPoint % 16) * 16 + (AttachmentPoint / 16));
3417 }
3418
3419 public void SendTerseUpdateToClient(IClientAPI remoteClient)
3420 {
3421 if (ParentGroup == null || ParentGroup.RootPart == null)
3422 return;
3423
3424 Vector3 lPos = OffsetPosition;
3425
3426 byte state = Shape.State;
3427 if (IsAttachment)
3428 {
3429 if (ParentGroup.RootPart != this)
3430 return;
3431
3432 lPos = ParentGroup.RootPart.AttachedPos;
3433 state = GetAttachPointEncoded();
3434 }
3435 else
3436 {
3437 if (ParentGroup.RootPart == this)
3438 lPos = AbsolutePosition;
3439 }
3440
3441 remoteClient.SendPrimTerseUpdate(m_regionHandle,
3442 (ushort)(m_parentGroup.GetTimeDilation() *
3443 (float)ushort.MaxValue), LocalId, lPos,
3444 RotationOffset, Velocity,
3445 RotationalVelocity, state, FromAssetID);
3446 }
3430 } 3447 }
3431} 3448}
3449
3450
3451
diff --git a/OpenSim/Region/Environment/Scenes/ScenePresence.cs b/OpenSim/Region/Environment/Scenes/ScenePresence.cs
index 0fe2bdb..4517d11 100644
--- a/OpenSim/Region/Environment/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Environment/Scenes/ScenePresence.cs
@@ -640,7 +640,7 @@ namespace OpenSim.Region.Environment.Scenes
640// "[SCENE PRESENCE]: Tersely updating prim {0}, {1} - part timestamp {2}", 640// "[SCENE PRESENCE]: Tersely updating prim {0}, {1} - part timestamp {2}",
641// part.Name, part.UUID, part.TimeStampTerse); 641// part.Name, part.UUID, part.TimeStampTerse);
642 642
643 part.SendTerseUpdate(ControllingClient); 643 part.SendTerseUpdateToClient(ControllingClient);
644 644
645 update.LastTerseUpdateTime = part.TimeStampTerse; 645 update.LastTerseUpdateTime = part.TimeStampTerse;
646 updateCount++; 646 updateCount++;
diff --git a/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs b/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs
index cc49072..af60323 100644
--- a/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs
+++ b/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs
@@ -79,7 +79,7 @@ namespace OpenSim.Region.Examples.SimpleModule
79 public event RequestAvatarProperties OnRequestAvatarProperties; 79 public event RequestAvatarProperties OnRequestAvatarProperties;
80 public event SetAlwaysRun OnSetAlwaysRun; 80 public event SetAlwaysRun OnSetAlwaysRun;
81 81
82 public event GenericCall4 OnDeRezObject; 82 public event DeRezObject OnDeRezObject;
83 public event Action<IClientAPI> OnRegionHandShakeReply; 83 public event Action<IClientAPI> OnRegionHandShakeReply;
84 public event GenericCall2 OnRequestWearables; 84 public event GenericCall2 OnRequestWearables;
85 public event GenericCall2 OnCompleteMovementToRegion; 85 public event GenericCall2 OnCompleteMovementToRegion;
@@ -225,6 +225,7 @@ namespace OpenSim.Region.Examples.SimpleModule
225 public event DirPopularQuery OnDirPopularQuery; 225 public event DirPopularQuery OnDirPopularQuery;
226 public event DirClassifiedQuery OnDirClassifiedQuery; 226 public event DirClassifiedQuery OnDirClassifiedQuery;
227 public event EventInfoRequest OnEventInfoRequest; 227 public event EventInfoRequest OnEventInfoRequest;
228 public event ParcelSetOtherCleanTime OnParcelSetOtherCleanTime;
228 229
229 public event MapItemRequest OnMapItemRequest; 230 public event MapItemRequest OnMapItemRequest;
230 231
@@ -499,12 +500,6 @@ namespace OpenSim.Region.Examples.SimpleModule
499 { 500 {
500 } 501 }
501 502
502 public virtual void SendPrimTerseUpdate(ulong regionHandle, ushort timeDilation, uint localID,
503 Vector3 position, Quaternion rotation, Vector3 velocity,
504 Vector3 rotationalvelocity)
505 {
506 }
507
508 public virtual void SendInventoryFolderDetails(UUID ownerID, UUID folderID, 503 public virtual void SendInventoryFolderDetails(UUID ownerID, UUID folderID,
509 List<InventoryItemBase> items, 504 List<InventoryItemBase> items,
510 List<InventoryFolderBase> folders, 505 List<InventoryFolderBase> folders,