aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region
diff options
context:
space:
mode:
authorJohn Hurliman2009-10-18 20:24:20 -0700
committerJohn Hurliman2009-10-18 20:24:20 -0700
commit233e16b99cc80190d41143ecdfe01308eb39932a (patch)
tree340a75427ec8fc9082a0f543021dbfebacdb3033 /OpenSim/Region
parent* Process the avatar terse update priority queue as soon as an update for our... (diff)
downloadopensim-SC_OLD-233e16b99cc80190d41143ecdfe01308eb39932a.zip
opensim-SC_OLD-233e16b99cc80190d41143ecdfe01308eb39932a.tar.gz
opensim-SC_OLD-233e16b99cc80190d41143ecdfe01308eb39932a.tar.bz2
opensim-SC_OLD-233e16b99cc80190d41143ecdfe01308eb39932a.tar.xz
* Rewrote the methods that build ObjectUpdate and ImprovedTerseObjectUpdate packets to fill in the data more accurately and avoid allocating memory that is immediately thrown away
* Changed the Send*Data structs in IClientAPI to use public readonly members instead of private members and getters * Made Parallel.ProcessorCount public * Started switching over packet building methods in LLClientView to use Util.StringToBytes[256/1024]() instead of Utils.StringToBytes() * More cleanup of the ScenePresences vs. ClientManager nightmare * ScenePresence.HandleAgentUpdate() will now time out and drop incoming AgentUpdate packets after three seconds. This fixes a deadlock on m_AgentUpdates that was blocking up the LLUDP server
Diffstat (limited to '')
-rw-r--r--OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs1015
-rw-r--r--OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs4
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.cs35
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectPart.cs6
-rw-r--r--OpenSim/Region/Framework/Scenes/ScenePresence.cs22
5 files changed, 398 insertions, 684 deletions
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
index 83a7184..1c463ea 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
@@ -342,7 +342,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
342 protected Thread m_clientThread; 342 protected Thread m_clientThread;
343 protected Vector3 m_startpos; 343 protected Vector3 m_startpos;
344 protected EndPoint m_userEndPoint; 344 protected EndPoint m_userEndPoint;
345 protected UUID m_activeGroupID = UUID.Zero; 345 protected UUID m_activeGroupID;
346 protected string m_activeGroupName = String.Empty; 346 protected string m_activeGroupName = String.Empty;
347 protected ulong m_activeGroupPowers; 347 protected ulong m_activeGroupPowers;
348 protected Dictionary<UUID,ulong> m_groupPowers = new Dictionary<UUID, ulong>(); 348 protected Dictionary<UUID,ulong> m_groupPowers = new Dictionary<UUID, ulong>();
@@ -422,7 +422,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
422 m_hyperAssets = m_scene.RequestModuleInterface<IHyperAssetService>(); 422 m_hyperAssets = m_scene.RequestModuleInterface<IHyperAssetService>();
423 m_GroupsModule = scene.RequestModuleInterface<IGroupsModule>(); 423 m_GroupsModule = scene.RequestModuleInterface<IGroupsModule>();
424 m_imageManager = new LLImageManager(this, m_assetService, Scene.RequestModuleInterface<IJ2KDecoder>()); 424 m_imageManager = new LLImageManager(this, m_assetService, Scene.RequestModuleInterface<IJ2KDecoder>());
425 m_channelVersion = Utils.StringToBytes(scene.GetSimulatorVersion()); 425 m_channelVersion = Util.StringToBytes256(scene.GetSimulatorVersion());
426 m_agentId = agentId; 426 m_agentId = agentId;
427 m_sessionId = sessionId; 427 m_sessionId = sessionId;
428 m_secureSessionId = sessionInfo.LoginInfo.SecureSession; 428 m_secureSessionId = sessionInfo.LoginInfo.SecureSession;
@@ -498,7 +498,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
498 kupack.UserInfo.SessionID = SessionId; 498 kupack.UserInfo.SessionID = SessionId;
499 kupack.TargetBlock.TargetIP = 0; 499 kupack.TargetBlock.TargetIP = 0;
500 kupack.TargetBlock.TargetPort = 0; 500 kupack.TargetBlock.TargetPort = 0;
501 kupack.UserInfo.Reason = Utils.StringToBytes(message); 501 kupack.UserInfo.Reason = Util.StringToBytes256(message);
502 OutPacket(kupack, ThrottleOutPacketType.Task); 502 OutPacket(kupack, ThrottleOutPacketType.Task);
503 // You must sleep here or users get no message! 503 // You must sleep here or users get no message!
504 Thread.Sleep(500); 504 Thread.Sleep(500);
@@ -643,7 +643,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
643 handshake.RegionInfo.WaterHeight = args.waterHeight; 643 handshake.RegionInfo.WaterHeight = args.waterHeight;
644 644
645 handshake.RegionInfo.RegionFlags = args.regionFlags; 645 handshake.RegionInfo.RegionFlags = args.regionFlags;
646 handshake.RegionInfo.SimName = Utils.StringToBytes(args.regionName); 646 handshake.RegionInfo.SimName = Util.StringToBytes256(args.regionName);
647 handshake.RegionInfo.SimOwner = args.SimOwner; 647 handshake.RegionInfo.SimOwner = args.SimOwner;
648 handshake.RegionInfo.TerrainBase0 = args.terrainBase0; 648 handshake.RegionInfo.TerrainBase0 = args.terrainBase0;
649 handshake.RegionInfo.TerrainBase1 = args.terrainBase1; 649 handshake.RegionInfo.TerrainBase1 = args.terrainBase1;
@@ -699,11 +699,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP
699 { 699 {
700 ChatFromSimulatorPacket reply = (ChatFromSimulatorPacket)PacketPool.Instance.GetPacket(PacketType.ChatFromSimulator); 700 ChatFromSimulatorPacket reply = (ChatFromSimulatorPacket)PacketPool.Instance.GetPacket(PacketType.ChatFromSimulator);
701 reply.ChatData.Audible = audible; 701 reply.ChatData.Audible = audible;
702 reply.ChatData.Message = Utils.StringToBytes(message); 702 reply.ChatData.Message = Util.StringToBytes1024(message);
703 reply.ChatData.ChatType = type; 703 reply.ChatData.ChatType = type;
704 reply.ChatData.SourceType = source; 704 reply.ChatData.SourceType = source;
705 reply.ChatData.Position = fromPos; 705 reply.ChatData.Position = fromPos;
706 reply.ChatData.FromName = Utils.StringToBytes(fromName); 706 reply.ChatData.FromName = Util.StringToBytes256(fromName);
707 reply.ChatData.OwnerID = fromAgentID; 707 reply.ChatData.OwnerID = fromAgentID;
708 reply.ChatData.SourceID = fromAgentID; 708 reply.ChatData.SourceID = fromAgentID;
709 709
@@ -724,7 +724,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
724 724
725 msg.AgentData.AgentID = new UUID(im.fromAgentID); 725 msg.AgentData.AgentID = new UUID(im.fromAgentID);
726 msg.AgentData.SessionID = UUID.Zero; 726 msg.AgentData.SessionID = UUID.Zero;
727 msg.MessageBlock.FromAgentName = Utils.StringToBytes(im.fromAgentName); 727 msg.MessageBlock.FromAgentName = Util.StringToBytes256(im.fromAgentName);
728 msg.MessageBlock.Dialog = im.dialog; 728 msg.MessageBlock.Dialog = im.dialog;
729 msg.MessageBlock.FromGroup = im.fromGroup; 729 msg.MessageBlock.FromGroup = im.fromGroup;
730 if (im.imSessionID == UUID.Zero.Guid) 730 if (im.imSessionID == UUID.Zero.Guid)
@@ -737,12 +737,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
737 msg.MessageBlock.RegionID = new UUID(im.RegionID); 737 msg.MessageBlock.RegionID = new UUID(im.RegionID);
738 msg.MessageBlock.Timestamp = im.timestamp; 738 msg.MessageBlock.Timestamp = im.timestamp;
739 msg.MessageBlock.ToAgentID = new UUID(im.toAgentID); 739 msg.MessageBlock.ToAgentID = new UUID(im.toAgentID);
740 // Cap the message length at 1099. There is a limit in ImprovedInstantMessagePacket 740 msg.MessageBlock.Message = Util.StringToBytes1024(im.message);
741 // the limit is 1100 but a 0 byte gets added to mark the end of the string
742 if (im.message != null && im.message.Length > 1099)
743 msg.MessageBlock.Message = Utils.StringToBytes(im.message.Substring(0, 1099));
744 else
745 msg.MessageBlock.Message = Utils.StringToBytes(im.message);
746 msg.MessageBlock.BinaryBucket = im.binaryBucket; 741 msg.MessageBlock.BinaryBucket = im.binaryBucket;
747 742
748 if (im.message.StartsWith("[grouptest]")) 743 if (im.message.StartsWith("[grouptest]"))
@@ -760,7 +755,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
760 eq.ChatterboxInvitation( 755 eq.ChatterboxInvitation(
761 new UUID("00000000-68f9-1111-024e-222222111123"), 756 new UUID("00000000-68f9-1111-024e-222222111123"),
762 "OpenSimulator Testing", new UUID(im.fromAgentID), im.message, new UUID(im.toAgentID), im.fromAgentName, im.dialog, 0, 757 "OpenSimulator Testing", new UUID(im.fromAgentID), im.message, new UUID(im.toAgentID), im.fromAgentName, im.dialog, 0,
763 false, 0, new Vector3(), 1, new UUID(im.imSessionID), im.fromGroup, Utils.StringToBytes("OpenSimulator Testing")); 758 false, 0, new Vector3(), 1, new UUID(im.imSessionID), im.fromGroup, Util.StringToBytes256("OpenSimulator Testing"));
764 759
765 eq.ChatterBoxSessionAgentListUpdates( 760 eq.ChatterBoxSessionAgentListUpdates(
766 new UUID("00000000-68f9-1111-024e-222222111123"), 761 new UUID("00000000-68f9-1111-024e-222222111123"),
@@ -777,13 +772,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP
777 public void SendGenericMessage(string method, List<string> message) 772 public void SendGenericMessage(string method, List<string> message)
778 { 773 {
779 GenericMessagePacket gmp = new GenericMessagePacket(); 774 GenericMessagePacket gmp = new GenericMessagePacket();
780 gmp.MethodData.Method = Utils.StringToBytes(method); 775 gmp.MethodData.Method = Util.StringToBytes256(method);
781 gmp.ParamList = new GenericMessagePacket.ParamListBlock[message.Count]; 776 gmp.ParamList = new GenericMessagePacket.ParamListBlock[message.Count];
782 int i = 0; 777 int i = 0;
783 foreach (string val in message) 778 foreach (string val in message)
784 { 779 {
785 gmp.ParamList[i] = new GenericMessagePacket.ParamListBlock(); 780 gmp.ParamList[i] = new GenericMessagePacket.ParamListBlock();
786 gmp.ParamList[i++].Parameter = Utils.StringToBytes(val); 781 gmp.ParamList[i++].Parameter = Util.StringToBytes256(val);
787 } 782 }
788 OutPacket(gmp, ThrottleOutPacketType.Task); 783 OutPacket(gmp, ThrottleOutPacketType.Task);
789 } 784 }
@@ -1047,7 +1042,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
1047 newSimPack.RegionData.SimIP += (uint)byteIP[1] << 8; 1042 newSimPack.RegionData.SimIP += (uint)byteIP[1] << 8;
1048 newSimPack.RegionData.SimIP += (uint)byteIP[0]; 1043 newSimPack.RegionData.SimIP += (uint)byteIP[0];
1049 newSimPack.RegionData.SimPort = (ushort)externalIPEndPoint.Port; 1044 newSimPack.RegionData.SimPort = (ushort)externalIPEndPoint.Port;
1050 newSimPack.RegionData.SeedCapability = Utils.StringToBytes(capsURL); 1045 newSimPack.RegionData.SeedCapability = Util.StringToBytes256(capsURL);
1051 1046
1052 // Hack to get this out immediately and skip throttles 1047 // Hack to get this out immediately and skip throttles
1053 OutPacket(newSimPack, ThrottleOutPacketType.Unknown); 1048 OutPacket(newSimPack, ThrottleOutPacketType.Unknown);
@@ -1125,7 +1120,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
1125 teleport.Info.RegionHandle = regionHandle; 1120 teleport.Info.RegionHandle = regionHandle;
1126 teleport.Info.SimAccess = simAccess; 1121 teleport.Info.SimAccess = simAccess;
1127 1122
1128 teleport.Info.SeedCapability = Utils.StringToBytes(capsURL); 1123 teleport.Info.SeedCapability = Util.StringToBytes256(capsURL);
1129 1124
1130 IPAddress oIP = newRegionEndPoint.Address; 1125 IPAddress oIP = newRegionEndPoint.Address;
1131 byte[] byteIP = oIP.GetAddressBytes(); 1126 byte[] byteIP = oIP.GetAddressBytes();
@@ -1150,7 +1145,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
1150 { 1145 {
1151 TeleportFailedPacket tpFailed = (TeleportFailedPacket)PacketPool.Instance.GetPacket(PacketType.TeleportFailed); 1146 TeleportFailedPacket tpFailed = (TeleportFailedPacket)PacketPool.Instance.GetPacket(PacketType.TeleportFailed);
1152 tpFailed.Info.AgentID = AgentId; 1147 tpFailed.Info.AgentID = AgentId;
1153 tpFailed.Info.Reason = Utils.StringToBytes(reason); 1148 tpFailed.Info.Reason = Util.StringToBytes256(reason);
1154 tpFailed.AlertInfo = new TeleportFailedPacket.AlertInfoBlock[0]; 1149 tpFailed.AlertInfo = new TeleportFailedPacket.AlertInfoBlock[0];
1155 1150
1156 // Hack to get this out immediately and skip throttles 1151 // Hack to get this out immediately and skip throttles
@@ -1882,11 +1877,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP
1882 AgentDataUpdatePacket sendAgentDataUpdate = (AgentDataUpdatePacket)PacketPool.Instance.GetPacket(PacketType.AgentDataUpdate); 1877 AgentDataUpdatePacket sendAgentDataUpdate = (AgentDataUpdatePacket)PacketPool.Instance.GetPacket(PacketType.AgentDataUpdate);
1883 sendAgentDataUpdate.AgentData.ActiveGroupID = activegroupid; 1878 sendAgentDataUpdate.AgentData.ActiveGroupID = activegroupid;
1884 sendAgentDataUpdate.AgentData.AgentID = agentid; 1879 sendAgentDataUpdate.AgentData.AgentID = agentid;
1885 sendAgentDataUpdate.AgentData.FirstName = Utils.StringToBytes(firstname); 1880 sendAgentDataUpdate.AgentData.FirstName = Util.StringToBytes256(firstname);
1886 sendAgentDataUpdate.AgentData.GroupName = Utils.StringToBytes(groupname); 1881 sendAgentDataUpdate.AgentData.GroupName = Util.StringToBytes256(groupname);
1887 sendAgentDataUpdate.AgentData.GroupPowers = grouppowers; 1882 sendAgentDataUpdate.AgentData.GroupPowers = grouppowers;
1888 sendAgentDataUpdate.AgentData.GroupTitle = Utils.StringToBytes(grouptitle); 1883 sendAgentDataUpdate.AgentData.GroupTitle = Util.StringToBytes256(grouptitle);
1889 sendAgentDataUpdate.AgentData.LastName = Utils.StringToBytes(lastname); 1884 sendAgentDataUpdate.AgentData.LastName = Util.StringToBytes256(lastname);
1890 OutPacket(sendAgentDataUpdate, ThrottleOutPacketType.Task); 1885 OutPacket(sendAgentDataUpdate, ThrottleOutPacketType.Task);
1891 } 1886 }
1892 1887
@@ -1899,7 +1894,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
1899 { 1894 {
1900 AlertMessagePacket alertPack = (AlertMessagePacket)PacketPool.Instance.GetPacket(PacketType.AlertMessage); 1895 AlertMessagePacket alertPack = (AlertMessagePacket)PacketPool.Instance.GetPacket(PacketType.AlertMessage);
1901 alertPack.AlertData = new AlertMessagePacket.AlertDataBlock(); 1896 alertPack.AlertData = new AlertMessagePacket.AlertDataBlock();
1902 alertPack.AlertData.Message = Utils.StringToBytes(message); 1897 alertPack.AlertData.Message = Util.StringToBytes256(message);
1903 alertPack.AlertInfo = new AlertMessagePacket.AlertInfoBlock[0]; 1898 alertPack.AlertInfo = new AlertMessagePacket.AlertInfoBlock[0];
1904 OutPacket(alertPack, ThrottleOutPacketType.Task); 1899 OutPacket(alertPack, ThrottleOutPacketType.Task);
1905 } 1900 }
@@ -1926,7 +1921,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
1926 { 1921 {
1927 AgentAlertMessagePacket alertPack = (AgentAlertMessagePacket)PacketPool.Instance.GetPacket(PacketType.AgentAlertMessage); 1922 AgentAlertMessagePacket alertPack = (AgentAlertMessagePacket)PacketPool.Instance.GetPacket(PacketType.AgentAlertMessage);
1928 alertPack.AgentData.AgentID = AgentId; 1923 alertPack.AgentData.AgentID = AgentId;
1929 alertPack.AlertData.Message = Utils.StringToBytes(message); 1924 alertPack.AlertData.Message = Util.StringToBytes256(message);
1930 alertPack.AlertData.Modal = modal; 1925 alertPack.AlertData.Modal = modal;
1931 1926
1932 return alertPack; 1927 return alertPack;
@@ -1936,12 +1931,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP
1936 string url) 1931 string url)
1937 { 1932 {
1938 LoadURLPacket loadURL = (LoadURLPacket)PacketPool.Instance.GetPacket(PacketType.LoadURL); 1933 LoadURLPacket loadURL = (LoadURLPacket)PacketPool.Instance.GetPacket(PacketType.LoadURL);
1939 loadURL.Data.ObjectName = Utils.StringToBytes(objectname); 1934 loadURL.Data.ObjectName = Util.StringToBytes256(objectname);
1940 loadURL.Data.ObjectID = objectID; 1935 loadURL.Data.ObjectID = objectID;
1941 loadURL.Data.OwnerID = ownerID; 1936 loadURL.Data.OwnerID = ownerID;
1942 loadURL.Data.OwnerIsGroup = groupOwned; 1937 loadURL.Data.OwnerIsGroup = groupOwned;
1943 loadURL.Data.Message = Utils.StringToBytes(message); 1938 loadURL.Data.Message = Util.StringToBytes256(message);
1944 loadURL.Data.URL = Utils.StringToBytes(url); 1939 loadURL.Data.URL = Util.StringToBytes256(url);
1945 OutPacket(loadURL, ThrottleOutPacketType.Task); 1940 OutPacket(loadURL, ThrottleOutPacketType.Task);
1946 } 1941 }
1947 1942
@@ -1949,18 +1944,18 @@ namespace OpenSim.Region.ClientStack.LindenUDP
1949 { 1944 {
1950 ScriptDialogPacket dialog = (ScriptDialogPacket)PacketPool.Instance.GetPacket(PacketType.ScriptDialog); 1945 ScriptDialogPacket dialog = (ScriptDialogPacket)PacketPool.Instance.GetPacket(PacketType.ScriptDialog);
1951 dialog.Data.ObjectID = objectID; 1946 dialog.Data.ObjectID = objectID;
1952 dialog.Data.ObjectName = Utils.StringToBytes(objectname); 1947 dialog.Data.ObjectName = Util.StringToBytes256(objectname);
1953 // this is the username of the *owner* 1948 // this is the username of the *owner*
1954 dialog.Data.FirstName = Utils.StringToBytes(ownerFirstName); 1949 dialog.Data.FirstName = Util.StringToBytes256(ownerFirstName);
1955 dialog.Data.LastName = Utils.StringToBytes(ownerLastName); 1950 dialog.Data.LastName = Util.StringToBytes256(ownerLastName);
1956 dialog.Data.Message = Utils.StringToBytes(msg); 1951 dialog.Data.Message = Util.StringToBytes1024(msg);
1957 dialog.Data.ImageID = textureID; 1952 dialog.Data.ImageID = textureID;
1958 dialog.Data.ChatChannel = ch; 1953 dialog.Data.ChatChannel = ch;
1959 ScriptDialogPacket.ButtonsBlock[] buttons = new ScriptDialogPacket.ButtonsBlock[buttonlabels.Length]; 1954 ScriptDialogPacket.ButtonsBlock[] buttons = new ScriptDialogPacket.ButtonsBlock[buttonlabels.Length];
1960 for (int i = 0; i < buttonlabels.Length; i++) 1955 for (int i = 0; i < buttonlabels.Length; i++)
1961 { 1956 {
1962 buttons[i] = new ScriptDialogPacket.ButtonsBlock(); 1957 buttons[i] = new ScriptDialogPacket.ButtonsBlock();
1963 buttons[i].ButtonLabel = Utils.StringToBytes(buttonlabels[i]); 1958 buttons[i].ButtonLabel = Util.StringToBytes256(buttonlabels[i]);
1964 } 1959 }
1965 dialog.Buttons = buttons; 1960 dialog.Buttons = buttons;
1966 OutPacket(dialog, ThrottleOutPacketType.Task); 1961 OutPacket(dialog, ThrottleOutPacketType.Task);
@@ -2116,19 +2111,19 @@ namespace OpenSim.Region.ClientStack.LindenUDP
2116 avatarReply.AgentData.AgentID = AgentId; 2111 avatarReply.AgentData.AgentID = AgentId;
2117 avatarReply.AgentData.AvatarID = avatarID; 2112 avatarReply.AgentData.AvatarID = avatarID;
2118 if (aboutText != null) 2113 if (aboutText != null)
2119 avatarReply.PropertiesData.AboutText = Utils.StringToBytes(aboutText); 2114 avatarReply.PropertiesData.AboutText = Util.StringToBytes1024(aboutText);
2120 else 2115 else
2121 avatarReply.PropertiesData.AboutText = Utils.StringToBytes(""); 2116 avatarReply.PropertiesData.AboutText = Utils.EmptyBytes;
2122 avatarReply.PropertiesData.BornOn = Utils.StringToBytes(bornOn); 2117 avatarReply.PropertiesData.BornOn = Util.StringToBytes256(bornOn);
2123 avatarReply.PropertiesData.CharterMember = charterMember; 2118 avatarReply.PropertiesData.CharterMember = charterMember;
2124 if (flAbout != null) 2119 if (flAbout != null)
2125 avatarReply.PropertiesData.FLAboutText = Utils.StringToBytes(flAbout); 2120 avatarReply.PropertiesData.FLAboutText = Util.StringToBytes256(flAbout);
2126 else 2121 else
2127 avatarReply.PropertiesData.FLAboutText = Utils.StringToBytes(""); 2122 avatarReply.PropertiesData.FLAboutText = Utils.EmptyBytes;
2128 avatarReply.PropertiesData.Flags = flags; 2123 avatarReply.PropertiesData.Flags = flags;
2129 avatarReply.PropertiesData.FLImageID = flImageID; 2124 avatarReply.PropertiesData.FLImageID = flImageID;
2130 avatarReply.PropertiesData.ImageID = imageID; 2125 avatarReply.PropertiesData.ImageID = imageID;
2131 avatarReply.PropertiesData.ProfileURL = Utils.StringToBytes(profileURL); 2126 avatarReply.PropertiesData.ProfileURL = Util.StringToBytes256(profileURL);
2132 avatarReply.PropertiesData.PartnerID = partnerID; 2127 avatarReply.PropertiesData.PartnerID = partnerID;
2133 OutPacket(avatarReply, ThrottleOutPacketType.Task); 2128 OutPacket(avatarReply, ThrottleOutPacketType.Task);
2134 } 2129 }
@@ -2255,7 +2250,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
2255 Group.Contribution = GroupMembership[i].Contribution; 2250 Group.Contribution = GroupMembership[i].Contribution;
2256 Group.GroupID = GroupMembership[i].GroupID; 2251 Group.GroupID = GroupMembership[i].GroupID;
2257 Group.GroupInsigniaID = GroupMembership[i].GroupPicture; 2252 Group.GroupInsigniaID = GroupMembership[i].GroupPicture;
2258 Group.GroupName = Utils.StringToBytes(GroupMembership[i].GroupName); 2253 Group.GroupName = Util.StringToBytes256(GroupMembership[i].GroupName);
2259 Group.GroupPowers = GroupMembership[i].GroupPowers; 2254 Group.GroupPowers = GroupMembership[i].GroupPowers;
2260 Groups[i] = Group; 2255 Groups[i] = Group;
2261 2256
@@ -2289,7 +2284,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
2289 UUIDGroupNameReplyPacket.UUIDNameBlockBlock[] uidnameblock = new UUIDGroupNameReplyPacket.UUIDNameBlockBlock[1]; 2284 UUIDGroupNameReplyPacket.UUIDNameBlockBlock[] uidnameblock = new UUIDGroupNameReplyPacket.UUIDNameBlockBlock[1];
2290 UUIDGroupNameReplyPacket.UUIDNameBlockBlock uidnamebloc = new UUIDGroupNameReplyPacket.UUIDNameBlockBlock(); 2285 UUIDGroupNameReplyPacket.UUIDNameBlockBlock uidnamebloc = new UUIDGroupNameReplyPacket.UUIDNameBlockBlock();
2291 uidnamebloc.ID = groupLLUID; 2286 uidnamebloc.ID = groupLLUID;
2292 uidnamebloc.GroupName = Utils.StringToBytes(GroupName); 2287 uidnamebloc.GroupName = Util.StringToBytes256(GroupName);
2293 uidnameblock[0] = uidnamebloc; 2288 uidnameblock[0] = uidnamebloc;
2294 pack.UUIDNameBlock = uidnameblock; 2289 pack.UUIDNameBlock = uidnameblock;
2295 OutPacket(pack, ThrottleOutPacketType.Task); 2290 OutPacket(pack, ThrottleOutPacketType.Task);
@@ -2314,8 +2309,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
2314 lsrepdb.Score = lsrpia[i].Score; 2309 lsrepdb.Score = lsrpia[i].Score;
2315 lsrepdb.TaskID = lsrpia[i].TaskID; 2310 lsrepdb.TaskID = lsrpia[i].TaskID;
2316 lsrepdb.TaskLocalID = lsrpia[i].TaskLocalID; 2311 lsrepdb.TaskLocalID = lsrpia[i].TaskLocalID;
2317 lsrepdb.TaskName = Utils.StringToBytes(lsrpia[i].TaskName); 2312 lsrepdb.TaskName = Util.StringToBytes256(lsrpia[i].TaskName);
2318 lsrepdb.OwnerName = Utils.StringToBytes(lsrpia[i].OwnerName); 2313 lsrepdb.OwnerName = Util.StringToBytes256(lsrpia[i].OwnerName);
2319 lsrepdba[i] = lsrepdb; 2314 lsrepdba[i] = lsrepdb;
2320 } 2315 }
2321 lsrp.ReportData = lsrepdba; 2316 lsrp.ReportData = lsrepdba;
@@ -3257,127 +3252,26 @@ namespace OpenSim.Region.ClientStack.LindenUDP
3257 canUseImproved = false; 3252 canUseImproved = false;
3258 } 3253 }
3259 } 3254 }
3260 }
3261
3262 static ObjectUpdatePacket.ObjectDataBlock BuildUpdateBlockFromPrim(SceneObjectPart prim, UUID assetID, PrimFlags flags, uint crc)
3263 {
3264 byte[] objectData = new byte[60];
3265 prim.OffsetPosition.ToBytes(objectData, 0);
3266 prim.Velocity.ToBytes(objectData, 12);
3267 prim.Acceleration.ToBytes(objectData, 24);
3268 prim.RotationOffset.ToBytes(objectData, 36);
3269 prim.AngularVelocity.ToBytes(objectData, 48);
3270
3271 ObjectUpdatePacket.ObjectDataBlock update = new ObjectUpdatePacket.ObjectDataBlock();
3272 update.ClickAction = (byte)prim.ClickAction;
3273 update.CRC = crc;
3274 update.ExtraParams = prim.Shape.ExtraParams ?? Utils.EmptyBytes;
3275 update.Flags = (byte)flags;
3276 update.FullID = prim.UUID;
3277 update.ID = prim.LocalId;
3278 //update.JointAxisOrAnchor = Vector3.Zero; // These are deprecated
3279 //update.JointPivot = Vector3.Zero;
3280 //update.JointType = 0;
3281 update.Material = prim.Material;
3282 update.MediaURL = Utils.EmptyBytes; // FIXME: Support this in OpenSim
3283 if (prim.IsAttachment)
3284 update.NameValue = Util.StringToBytes256("AttachItemID STRING RW SV " + assetID);
3285 else
3286 update.NameValue = Utils.EmptyBytes;
3287 update.ObjectData = objectData;
3288 update.ParentID = prim.ParentID;
3289 update.PathBegin = prim.Shape.PathBegin;
3290 update.PathCurve = prim.Shape.PathCurve;
3291 update.PathEnd = prim.Shape.PathEnd;
3292 update.PathRadiusOffset = prim.Shape.PathRadiusOffset;
3293 update.PathRevolutions = prim.Shape.PathRevolutions;
3294 update.PathScaleX = prim.Shape.PathScaleX;
3295 update.PathScaleY = prim.Shape.PathScaleY;
3296 update.PathShearX = prim.Shape.PathShearX;
3297 update.PathShearY = prim.Shape.PathShearY;
3298 update.PathSkew = prim.Shape.PathSkew;
3299 update.PathTaperX = prim.Shape.PathTaperX;
3300 update.PathTaperY = prim.Shape.PathTaperY;
3301 update.PathTwist = prim.Shape.PathTwist;
3302 update.PathTwistBegin = prim.Shape.PathTwistBegin;
3303 update.PCode = prim.Shape.PCode;
3304 update.ProfileBegin = prim.Shape.ProfileBegin;
3305 update.ProfileCurve = prim.Shape.ProfileCurve;
3306 update.ProfileEnd = prim.Shape.ProfileEnd;
3307 update.ProfileHollow = prim.Shape.ProfileHollow;
3308 update.PSBlock = prim.ParticleSystem ?? Utils.EmptyBytes;
3309 update.TextColor = new Color4(prim.Color).GetBytes(true);
3310 update.TextureAnim = prim.TextureAnimation ?? Utils.EmptyBytes;
3311 update.TextureEntry = prim.Shape.TextureEntry ?? Utils.EmptyBytes;
3312 update.Scale = prim.Scale;
3313 update.State = prim.Shape.State;
3314 update.Text = Util.StringToBytes256(prim.Text);
3315 update.UpdateFlags = (uint)flags;
3316
3317 if (prim.Sound != UUID.Zero)
3318 {
3319 update.Sound = prim.Sound;
3320 update.OwnerID = prim.OwnerID;
3321 update.Gain = (float)prim.SoundGain;
3322 update.Radius = (float)prim.SoundRadius;
3323 }
3324
3325 switch ((PCode)prim.Shape.PCode)
3326 {
3327 case PCode.Grass:
3328 case PCode.Tree:
3329 case PCode.NewTree:
3330 update.Data = new byte[] { prim.Shape.State };
3331 break;
3332 default:
3333 // TODO: Support ScratchPad
3334 //if (prim.ScratchPad != null)
3335 //{
3336 // update.Data = new byte[prim.ScratchPad.Length];
3337 // Buffer.BlockCopy(prim.ScratchPad, 0, update.Data, 0, update.Data.Length);
3338 //}
3339 //else
3340 //{
3341 // update.Data = Utils.EmptyBytes;
3342 //}
3343 update.Data = Utils.EmptyBytes;
3344 break;
3345 }
3346
3347 return update;
3348 }*/ 3255 }*/
3349 3256
3350 #endregion Prim/Avatar Updates 3257 #endregion Prim/Avatar Updates
3351 3258
3352 #region Avatar Packet/data sending Methods 3259 #region Avatar Packet/Data Sending Methods
3353 3260
3354 /// <summary> 3261 /// <summary>
3355 /// send a objectupdate packet with information about the clients avatar 3262 /// Send an ObjectUpdate packet with information about an avatar
3356 /// </summary> 3263 /// </summary>
3357 public void SendAvatarData(SendAvatarData data) 3264 public void SendAvatarData(SendAvatarData data)
3358 { 3265 {
3359 ObjectUpdatePacket objupdate = (ObjectUpdatePacket)PacketPool.Instance.GetPacket(PacketType.ObjectUpdate); 3266 ObjectUpdatePacket objupdate = (ObjectUpdatePacket)PacketPool.Instance.GetPacket(PacketType.ObjectUpdate);
3360 // TODO: don't create new blocks if recycling an old packet 3267 objupdate.Header.Zerocoded = true;
3361 objupdate.RegionData.RegionHandle = data.regionHandle; 3268
3269 objupdate.RegionData.RegionHandle = data.RegionHandle;
3362 objupdate.RegionData.TimeDilation = ushort.MaxValue; 3270 objupdate.RegionData.TimeDilation = ushort.MaxValue;
3271
3363 objupdate.ObjectData = new ObjectUpdatePacket.ObjectDataBlock[1]; 3272 objupdate.ObjectData = new ObjectUpdatePacket.ObjectDataBlock[1];
3364 objupdate.ObjectData[0] = CreateDefaultAvatarPacket(data.textureEntry); 3273 objupdate.ObjectData[0] = CreateAvatarUpdateBlock(data);
3365
3366 //give this avatar object a local id and assign the user a name
3367 objupdate.ObjectData[0].ID = data.avatarLocalID;
3368 objupdate.ObjectData[0].FullID = data.avatarID;
3369 objupdate.ObjectData[0].ParentID = data.parentID;
3370 objupdate.ObjectData[0].NameValue =
3371 Utils.StringToBytes("FirstName STRING RW SV " + data.firstName + "\nLastName STRING RW SV " + data.lastName + "\nTitle STRING RW SV " + data.grouptitle);
3372
3373 Vector3 pos2 = new Vector3(data.Pos.X, data.Pos.Y, data.Pos.Z);
3374 byte[] pb = pos2.GetBytes();
3375 Array.Copy(pb, 0, objupdate.ObjectData[0].ObjectData, 16, pb.Length);
3376
3377 byte[] rot = data.rotation.GetBytes();
3378 Array.Copy(rot, 0, objupdate.ObjectData[0].ObjectData, 52, rot.Length);
3379 3274
3380 objupdate.Header.Zerocoded = true;
3381 OutPacket(objupdate, ThrottleOutPacketType.Task); 3275 OutPacket(objupdate, ThrottleOutPacketType.Task);
3382 } 3276 }
3383 3277
@@ -3387,27 +3281,26 @@ namespace OpenSim.Region.ClientStack.LindenUDP
3387 /// </summary> 3281 /// </summary>
3388 public virtual void SendAvatarTerseUpdate(SendAvatarTerseData data) 3282 public virtual void SendAvatarTerseUpdate(SendAvatarTerseData data)
3389 { 3283 {
3390 if (data.priority == double.NaN) 3284 if (data.Priority == double.NaN)
3391 { 3285 {
3392 m_log.Error("[LLClientView] SendAvatarTerseUpdate received a NaN priority, dropping update"); 3286 m_log.Error("[LLClientView] SendAvatarTerseUpdate received a NaN priority, dropping update");
3393 return; 3287 return;
3394 } 3288 }
3395 3289
3396 Quaternion rotation = data.rotation; 3290 Quaternion rotation = data.Rotation;
3397 3291
3398 if (rotation.X == rotation.Y && 3292 if (rotation.X == rotation.Y &&
3399 rotation.Y == rotation.Z && 3293 rotation.Y == rotation.Z &&
3400 rotation.Z == rotation.W && rotation.W == 0) 3294 rotation.Z == rotation.W && rotation.W == 0.0f)
3401 rotation = Quaternion.Identity; 3295 rotation = Quaternion.Identity;
3402 3296
3403 ImprovedTerseObjectUpdatePacket.ObjectDataBlock terseBlock = 3297 ImprovedTerseObjectUpdatePacket.ObjectDataBlock terseBlock = CreateImprovedTerseBlock(data);
3404 CreateAvatarImprovedBlock(data.localID, data.position, data.velocity, rotation);
3405 3298
3406 lock (m_avatarTerseUpdates.SyncRoot) 3299 lock (m_avatarTerseUpdates.SyncRoot)
3407 m_avatarTerseUpdates.Enqueue(data.priority, terseBlock, data.localID); 3300 m_avatarTerseUpdates.Enqueue(data.Priority, terseBlock, data.LocalID);
3408 3301
3409 // If we received an update about our own avatar, process the avatar update priority queue immediately 3302 // If we received an update about our own avatar, process the avatar update priority queue immediately
3410 if (data.agentid == m_agentId) 3303 if (data.AgentID == m_agentId)
3411 ProcessAvatarTerseUpdates(); 3304 ProcessAvatarTerseUpdates();
3412 } 3305 }
3413 3306
@@ -3471,33 +3364,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP
3471 OutPacket(loc, ThrottleOutPacketType.Task); 3364 OutPacket(loc, ThrottleOutPacketType.Task);
3472 } 3365 }
3473 3366
3474 #endregion 3367 #endregion Avatar Packet/Data Sending Methods
3475 3368
3476 #region Primitive Packet/data Sending Methods 3369 #region Primitive Packet/Data Sending Methods
3477
3478 /// <summary>
3479 ///
3480 /// </summary>
3481 /// <param name="localID"></param>
3482 /// <param name="rotation"></param>
3483 /// <param name="attachPoint"></param>
3484 public void AttachObject(uint localID, Quaternion rotation, byte attachPoint, UUID ownerID)
3485 {
3486 if (attachPoint > 30 && ownerID != AgentId) // Someone else's HUD
3487 return;
3488
3489 ObjectAttachPacket attach = (ObjectAttachPacket)PacketPool.Instance.GetPacket(PacketType.ObjectAttach);
3490 // TODO: don't create new blocks if recycling an old packet
3491 attach.AgentData.AgentID = AgentId;
3492 attach.AgentData.SessionID = m_sessionId;
3493 attach.AgentData.AttachmentPoint = attachPoint;
3494 attach.ObjectData = new ObjectAttachPacket.ObjectDataBlock[1];
3495 attach.ObjectData[0] = new ObjectAttachPacket.ObjectDataBlock();
3496 attach.ObjectData[0].ObjectLocalID = localID;
3497 attach.ObjectData[0].Rotation = rotation;
3498 attach.Header.Zerocoded = true;
3499 OutPacket(attach, ThrottleOutPacketType.Task);
3500 }
3501 3370
3502 public void SendPrimitiveToClient(SendPrimitiveData data) 3371 public void SendPrimitiveToClient(SendPrimitiveData data)
3503 { 3372 {
@@ -3513,136 +3382,16 @@ namespace OpenSim.Region.ClientStack.LindenUDP
3513 return; 3382 return;
3514 if (data.primShape.PCode == 9 && data.primShape.State != 0 && data.parentID == 0) 3383 if (data.primShape.PCode == 9 && data.primShape.State != 0 && data.parentID == 0)
3515 return; 3384 return;
3516 3385
3517 if (rotation.X == rotation.Y && rotation.Y == rotation.Z && rotation.Z == rotation.W && rotation.W == 0.0f) 3386 if (rotation.X == rotation.Y && rotation.Y == rotation.Z && rotation.Z == rotation.W && rotation.W == 0.0f)
3518 rotation = Quaternion.Identity; 3387 rotation = Quaternion.Identity;
3519 3388
3520 ObjectUpdatePacket.ObjectDataBlock objectData = CreatePrimUpdateBlock(data.primShape, data.flags); 3389 ObjectUpdatePacket.ObjectDataBlock objectData = CreatePrimUpdateBlock(data);
3521
3522 objectData.ID = data.localID;
3523 objectData.FullID = data.objectID;
3524 objectData.OwnerID = data.ownerID;
3525
3526 objectData.Text = Util.StringToBytes256(data.text);
3527 objectData.TextColor[0] = data.color[0];
3528 objectData.TextColor[1] = data.color[1];
3529 objectData.TextColor[2] = data.color[2];
3530 objectData.TextColor[3] = data.color[3];
3531 objectData.ParentID = data.parentID;
3532 objectData.PSBlock = data.particleSystem;
3533 objectData.ClickAction = data.clickAction;
3534 objectData.Material = data.material;
3535 objectData.Flags = 0;
3536
3537 if (data.attachment)
3538 {
3539 // Necessary???
3540 objectData.JointAxisOrAnchor = new Vector3(0, 0, 2);
3541 objectData.JointPivot = new Vector3(0, 0, 0);
3542
3543 // Item from inventory???
3544 objectData.NameValue =
3545 Utils.StringToBytes("AttachItemID STRING RW SV " + data.AssetId.Guid);
3546 objectData.State = (byte)((data.AttachPoint % 16) * 16 + (data.AttachPoint / 16));
3547 }
3548
3549 // Xantor 20080528: Send sound info as well
3550 // Xantor 20080530: Zero out everything if there's no SoundId, so zerocompression will work again
3551 objectData.Sound = data.SoundId;
3552 if (data.SoundId == UUID.Zero)
3553 {
3554 objectData.OwnerID = UUID.Zero;
3555 objectData.Gain = 0.0f;
3556 objectData.Radius = 0.0f;
3557 objectData.Flags = 0;
3558 }
3559 else
3560 {
3561 objectData.OwnerID = data.ownerID;
3562 objectData.Gain = (float)data.SoundVolume;
3563 objectData.Radius = (float)data.SoundRadius;
3564 objectData.Flags = data.SoundFlags;
3565 }
3566
3567 byte[] pb = data.pos.GetBytes();
3568 Buffer.BlockCopy(pb, 0, objectData.ObjectData, 0, pb.Length);
3569
3570 byte[] vel = data.vel.GetBytes();
3571 Buffer.BlockCopy(vel, 0, objectData.ObjectData, pb.Length, vel.Length);
3572
3573 byte[] rot = rotation.GetBytes();
3574 Buffer.BlockCopy(rot, 0, objectData.ObjectData, 36, rot.Length);
3575
3576 byte[] rvel = data.rvel.GetBytes();
3577 Buffer.BlockCopy(rvel, 0, objectData.ObjectData, 36 + rot.Length, rvel.Length);
3578
3579 if (data.textureanim.Length > 0)
3580 {
3581 objectData.TextureAnim = data.textureanim;
3582 }
3583 3390
3584 lock (m_primFullUpdates.SyncRoot) 3391 lock (m_primFullUpdates.SyncRoot)
3585 m_primFullUpdates.Enqueue(data.priority, objectData, data.localID); 3392 m_primFullUpdates.Enqueue(data.priority, objectData, data.localID);
3586 } 3393 }
3587 3394
3588 void HandleQueueEmpty(ThrottleOutPacketType queue)
3589 {
3590 switch (queue)
3591 {
3592 case ThrottleOutPacketType.Texture:
3593 ProcessTextureRequests();
3594 break;
3595 case ThrottleOutPacketType.Task:
3596 if (Monitor.TryEnter(m_avatarTerseUpdates.SyncRoot, 1))
3597 {
3598 try
3599 {
3600 if (m_avatarTerseUpdates.Count > 0)
3601 {
3602
3603 ProcessAvatarTerseUpdates();
3604 return;
3605 }
3606 }
3607 finally { Monitor.Exit(m_avatarTerseUpdates.SyncRoot); }
3608 }
3609 break;
3610 case ThrottleOutPacketType.State:
3611 if (Monitor.TryEnter(m_primFullUpdates.SyncRoot, 1))
3612 {
3613 try
3614 {
3615 if (m_primFullUpdates.Count > 0)
3616 {
3617 ProcessPrimFullUpdates();
3618 return;
3619 }
3620 }
3621 finally { Monitor.Exit(m_primFullUpdates.SyncRoot); }
3622 }
3623
3624 if (Monitor.TryEnter(m_primTerseUpdates.SyncRoot, 1))
3625 {
3626 try
3627 {
3628 if (m_primTerseUpdates.Count > 0)
3629 {
3630 ProcessPrimTerseUpdates();
3631 return;
3632 }
3633 }
3634 finally { Monitor.Exit(m_primTerseUpdates.SyncRoot); }
3635 }
3636 break;
3637 }
3638 }
3639
3640 void ProcessTextureRequests()
3641 {
3642 if (m_imageManager != null)
3643 m_imageManager.ProcessImageQueue(m_textureSendLimit);
3644 }
3645
3646 void ProcessPrimFullUpdates() 3395 void ProcessPrimFullUpdates()
3647 { 3396 {
3648 ObjectUpdatePacket outPacket = (ObjectUpdatePacket)PacketPool.Instance.GetPacket(PacketType.ObjectUpdate); 3397 ObjectUpdatePacket outPacket = (ObjectUpdatePacket)PacketPool.Instance.GetPacket(PacketType.ObjectUpdate);
@@ -3666,33 +3415,26 @@ namespace OpenSim.Region.ClientStack.LindenUDP
3666 OutPacket(outPacket, ThrottleOutPacketType.State); 3415 OutPacket(outPacket, ThrottleOutPacketType.State);
3667 } 3416 }
3668 3417
3669 /// <summary>
3670 ///
3671 /// </summary>
3672 //public void SendPrimTerseUpdate(ulong regionHandle, ushort timeDilation, uint localID, Vector3 position,
3673 // Quaternion rotation, Vector3 velocity, Vector3 rotationalvelocity, byte state, UUID AssetId, UUID ownerID, int attachPoint)
3674 public void SendPrimTerseUpdate(SendPrimitiveTerseData data) 3418 public void SendPrimTerseUpdate(SendPrimitiveTerseData data)
3675 { 3419 {
3676 if (data.priority == double.NaN) 3420 if (data.Priority == double.NaN)
3677 { 3421 {
3678 m_log.Error("[LLClientView] SendPrimTerseUpdate received a NaN priority, dropping update"); 3422 m_log.Error("[LLClientView] SendPrimTerseUpdate received a NaN priority, dropping update");
3679 return; 3423 return;
3680 } 3424 }
3681 3425
3682 Quaternion rotation = data.rotation; 3426 Quaternion rotation = data.Rotation;
3683 3427
3684 if (data.attachPoint > 30 && data.owner != AgentId) // Someone else's HUD 3428 if (data.AttachPoint > 30 && data.OwnerID != AgentId) // Someone else's HUD
3685 return; 3429 return;
3686 3430
3687 if (rotation.X == rotation.Y && rotation.Y == rotation.Z && rotation.Z == rotation.W && rotation.W == 0) 3431 if (rotation.X == rotation.Y && rotation.Y == rotation.Z && rotation.Z == rotation.W && rotation.W == 0)
3688 rotation = Quaternion.Identity; 3432 rotation = Quaternion.Identity;
3689 3433
3690 ImprovedTerseObjectUpdatePacket.ObjectDataBlock objectData = 3434 ImprovedTerseObjectUpdatePacket.ObjectDataBlock objectData = CreateImprovedTerseBlock(data);
3691 CreatePrimImprovedBlock(data.localID, data.position, rotation,
3692 data.velocity, data.rotationalvelocity, data.state);
3693 3435
3694 lock (m_primTerseUpdates.SyncRoot) 3436 lock (m_primTerseUpdates.SyncRoot)
3695 m_primTerseUpdates.Enqueue(data.priority, objectData, data.localID); 3437 m_primTerseUpdates.Enqueue(data.Priority, objectData, data.LocalID);
3696 } 3438 }
3697 3439
3698 void ProcessPrimTerseUpdates() 3440 void ProcessPrimTerseUpdates()
@@ -3733,17 +3475,20 @@ namespace OpenSim.Region.ClientStack.LindenUDP
3733 return priority != double.NaN; 3475 return priority != double.NaN;
3734 }; 3476 };
3735 3477
3736 if ((type & StateUpdateTypes.AvatarTerse) != 0) { 3478 if ((type & StateUpdateTypes.AvatarTerse) != 0)
3479 {
3737 lock (m_avatarTerseUpdates.SyncRoot) 3480 lock (m_avatarTerseUpdates.SyncRoot)
3738 m_avatarTerseUpdates.Reprioritize(terse_update_priority_handler); 3481 m_avatarTerseUpdates.Reprioritize(terse_update_priority_handler);
3739 } 3482 }
3740 3483
3741 if ((type & StateUpdateTypes.PrimitiveFull) != 0) { 3484 if ((type & StateUpdateTypes.PrimitiveFull) != 0)
3485 {
3742 lock (m_primFullUpdates.SyncRoot) 3486 lock (m_primFullUpdates.SyncRoot)
3743 m_primFullUpdates.Reprioritize(update_priority_handler); 3487 m_primFullUpdates.Reprioritize(update_priority_handler);
3744 } 3488 }
3745 3489
3746 if ((type & StateUpdateTypes.PrimitiveTerse) != 0) { 3490 if ((type & StateUpdateTypes.PrimitiveTerse) != 0)
3491 {
3747 lock (m_primTerseUpdates.SyncRoot) 3492 lock (m_primTerseUpdates.SyncRoot)
3748 m_primTerseUpdates.Reprioritize(terse_update_priority_handler); 3493 m_primTerseUpdates.Reprioritize(terse_update_priority_handler);
3749 } 3494 }
@@ -3765,6 +3510,90 @@ namespace OpenSim.Region.ClientStack.LindenUDP
3765 } 3510 }
3766 } 3511 }
3767 3512
3513 #endregion Primitive Packet/Data Sending Methods
3514
3515 /// <summary>
3516 ///
3517 /// </summary>
3518 /// <param name="localID"></param>
3519 /// <param name="rotation"></param>
3520 /// <param name="attachPoint"></param>
3521 public void AttachObject(uint localID, Quaternion rotation, byte attachPoint, UUID ownerID)
3522 {
3523 if (attachPoint > 30 && ownerID != AgentId) // Someone else's HUD
3524 return;
3525
3526 ObjectAttachPacket attach = (ObjectAttachPacket)PacketPool.Instance.GetPacket(PacketType.ObjectAttach);
3527 // TODO: don't create new blocks if recycling an old packet
3528 attach.AgentData.AgentID = AgentId;
3529 attach.AgentData.SessionID = m_sessionId;
3530 attach.AgentData.AttachmentPoint = attachPoint;
3531 attach.ObjectData = new ObjectAttachPacket.ObjectDataBlock[1];
3532 attach.ObjectData[0] = new ObjectAttachPacket.ObjectDataBlock();
3533 attach.ObjectData[0].ObjectLocalID = localID;
3534 attach.ObjectData[0].Rotation = rotation;
3535 attach.Header.Zerocoded = true;
3536 OutPacket(attach, ThrottleOutPacketType.Task);
3537 }
3538
3539 void HandleQueueEmpty(ThrottleOutPacketType queue)
3540 {
3541 switch (queue)
3542 {
3543 case ThrottleOutPacketType.Texture:
3544 ProcessTextureRequests();
3545 break;
3546 case ThrottleOutPacketType.Task:
3547 if (Monitor.TryEnter(m_avatarTerseUpdates.SyncRoot, 1))
3548 {
3549 try
3550 {
3551 if (m_avatarTerseUpdates.Count > 0)
3552 {
3553
3554 ProcessAvatarTerseUpdates();
3555 return;
3556 }
3557 }
3558 finally { Monitor.Exit(m_avatarTerseUpdates.SyncRoot); }
3559 }
3560 break;
3561 case ThrottleOutPacketType.State:
3562 if (Monitor.TryEnter(m_primFullUpdates.SyncRoot, 1))
3563 {
3564 try
3565 {
3566 if (m_primFullUpdates.Count > 0)
3567 {
3568 ProcessPrimFullUpdates();
3569 return;
3570 }
3571 }
3572 finally { Monitor.Exit(m_primFullUpdates.SyncRoot); }
3573 }
3574
3575 if (Monitor.TryEnter(m_primTerseUpdates.SyncRoot, 1))
3576 {
3577 try
3578 {
3579 if (m_primTerseUpdates.Count > 0)
3580 {
3581 ProcessPrimTerseUpdates();
3582 return;
3583 }
3584 }
3585 finally { Monitor.Exit(m_primTerseUpdates.SyncRoot); }
3586 }
3587 break;
3588 }
3589 }
3590
3591 void ProcessTextureRequests()
3592 {
3593 if (m_imageManager != null)
3594 m_imageManager.ProcessImageQueue(m_textureSendLimit);
3595 }
3596
3768 public void SendAssetUploadCompleteMessage(sbyte AssetType, bool Success, UUID AssetFullID) 3597 public void SendAssetUploadCompleteMessage(sbyte AssetType, bool Success, UUID AssetFullID)
3769 { 3598 {
3770 AssetUploadCompletePacket newPack = new AssetUploadCompletePacket(); 3599 AssetUploadCompletePacket newPack = new AssetUploadCompletePacket();
@@ -3946,8 +3775,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
3946 OutPacket(proper, ThrottleOutPacketType.Task); 3775 OutPacket(proper, ThrottleOutPacketType.Task);
3947 } 3776 }
3948 3777
3949 #endregion
3950
3951 #region Estate Data Sending Methods 3778 #region Estate Data Sending Methods
3952 3779
3953 private static bool convertParamStringToBool(byte[] field) 3780 private static bool convertParamStringToBool(byte[] field)
@@ -4354,325 +4181,221 @@ namespace OpenSim.Region.ClientStack.LindenUDP
4354 4181
4355 #region Helper Methods 4182 #region Helper Methods
4356 4183
4357 protected ImprovedTerseObjectUpdatePacket.ObjectDataBlock CreateAvatarImprovedBlock(uint localID, Vector3 pos, 4184 protected ImprovedTerseObjectUpdatePacket.ObjectDataBlock CreateImprovedTerseBlock(SendAvatarTerseData data)
4358 Vector3 velocity,
4359 Quaternion rotation)
4360 { 4185 {
4361 byte[] bytes = new byte[60]; 4186 return CreateImprovedTerseBlock(true, data.LocalID, 0, data.CollisionPlane, data.Position, data.Velocity,
4362 int i = 0; 4187 data.Acceleration, data.Rotation, Vector3.Zero, data.TextureEntry);
4363 ImprovedTerseObjectUpdatePacket.ObjectDataBlock dat = PacketPool.GetDataBlock<ImprovedTerseObjectUpdatePacket.ObjectDataBlock>();
4364
4365 dat.TextureEntry = new byte[0]; // AvatarTemplate.TextureEntry;
4366
4367 uint ID = localID;
4368
4369 bytes[i++] = (byte)(ID % 256);
4370 bytes[i++] = (byte)((ID >> 8) % 256);
4371 bytes[i++] = (byte)((ID >> 16) % 256);
4372 bytes[i++] = (byte)((ID >> 24) % 256);
4373 bytes[i++] = 0;
4374 bytes[i++] = 1;
4375 i += 14;
4376 bytes[i++] = 128;
4377 bytes[i++] = 63;
4378
4379 byte[] pb = pos.GetBytes();
4380 Array.Copy(pb, 0, bytes, i, pb.Length);
4381 i += 12;
4382
4383 Vector3 internDirec = new Vector3(velocity.X, velocity.Y, velocity.Z);
4384
4385 internDirec = internDirec / 128.0f;
4386 internDirec.X += 1;
4387 internDirec.Y += 1;
4388 internDirec.Z += 1;
4389
4390 ushort InternVelocityX = (ushort)(32768 * internDirec.X);
4391 ushort InternVelocityY = (ushort)(32768 * internDirec.Y);
4392 ushort InternVelocityZ = (ushort)(32768 * internDirec.Z);
4393
4394 ushort ac = 32767;
4395 bytes[i++] = (byte)(InternVelocityX % 256);
4396 bytes[i++] = (byte)((InternVelocityX >> 8) % 256);
4397 bytes[i++] = (byte)(InternVelocityY % 256);
4398 bytes[i++] = (byte)((InternVelocityY >> 8) % 256);
4399 bytes[i++] = (byte)(InternVelocityZ % 256);
4400 bytes[i++] = (byte)((InternVelocityZ >> 8) % 256);
4401
4402 //accel
4403 bytes[i++] = (byte)(ac % 256);
4404 bytes[i++] = (byte)((ac >> 8) % 256);
4405 bytes[i++] = (byte)(ac % 256);
4406 bytes[i++] = (byte)((ac >> 8) % 256);
4407 bytes[i++] = (byte)(ac % 256);
4408 bytes[i++] = (byte)((ac >> 8) % 256);
4409
4410 //rotation
4411 ushort rw, rx, ry, rz;
4412 rw = (ushort)(32768 * (rotation.W + 1));
4413 rx = (ushort)(32768 * (rotation.X + 1));
4414 ry = (ushort)(32768 * (rotation.Y + 1));
4415 rz = (ushort)(32768 * (rotation.Z + 1));
4416
4417 //rot
4418 bytes[i++] = (byte)(rx % 256);
4419 bytes[i++] = (byte)((rx >> 8) % 256);
4420 bytes[i++] = (byte)(ry % 256);
4421 bytes[i++] = (byte)((ry >> 8) % 256);
4422 bytes[i++] = (byte)(rz % 256);
4423 bytes[i++] = (byte)((rz >> 8) % 256);
4424 bytes[i++] = (byte)(rw % 256);
4425 bytes[i++] = (byte)((rw >> 8) % 256);
4426
4427 //rotation vel
4428 bytes[i++] = (byte)(ac % 256);
4429 bytes[i++] = (byte)((ac >> 8) % 256);
4430 bytes[i++] = (byte)(ac % 256);
4431 bytes[i++] = (byte)((ac >> 8) % 256);
4432 bytes[i++] = (byte)(ac % 256);
4433 bytes[i++] = (byte)((ac >> 8) % 256);
4434
4435 dat.Data = bytes;
4436
4437 return (dat);
4438 } 4188 }
4439 4189
4440 /// <summary> 4190 protected ImprovedTerseObjectUpdatePacket.ObjectDataBlock CreateImprovedTerseBlock(SendPrimitiveTerseData data)
4441 ///
4442 /// </summary>
4443 /// <param name="localID"></param>
4444 /// <param name="position"></param>
4445 /// <param name="rotation"></param>
4446 /// <returns></returns>
4447 protected ImprovedTerseObjectUpdatePacket.ObjectDataBlock CreatePrimImprovedBlock(uint localID,
4448 Vector3 position,
4449 Quaternion rotation,
4450 Vector3 velocity,
4451 Vector3 rotationalvelocity,
4452 byte state)
4453 { 4191 {
4454 uint ID = localID; 4192 return CreateImprovedTerseBlock(false, data.LocalID, data.State, Vector4.Zero, data.Position, data.Velocity,
4455 byte[] bytes = new byte[60]; 4193 data.Acceleration, data.Rotation, data.AngularVelocity, data.TextureEntry);
4456
4457 int i = 0;
4458 ImprovedTerseObjectUpdatePacket.ObjectDataBlock dat = PacketPool.GetDataBlock<ImprovedTerseObjectUpdatePacket.ObjectDataBlock>();
4459 dat.TextureEntry = new byte[0];
4460 bytes[i++] = (byte)(ID % 256);
4461 bytes[i++] = (byte)((ID >> 8) % 256);
4462 bytes[i++] = (byte)((ID >> 16) % 256);
4463 bytes[i++] = (byte)((ID >> 24) % 256);
4464 bytes[i++] = (byte)(((state & 0xf0) >> 4) | ((state & 0x0f) << 4));
4465 bytes[i++] = 0;
4466
4467 byte[] pb = position.GetBytes();
4468 Array.Copy(pb, 0, bytes, i, pb.Length);
4469 i += 12;
4470 ushort ac = 32767;
4471
4472 ushort velx, vely, velz;
4473 Vector3 vel = new Vector3(velocity.X, velocity.Y, velocity.Z);
4474
4475 vel = vel / 128.0f;
4476 vel.X += 1;
4477 vel.Y += 1;
4478 vel.Z += 1;
4479 //vel
4480 velx = (ushort)(32768 * (vel.X));
4481 vely = (ushort)(32768 * (vel.Y));
4482 velz = (ushort)(32768 * (vel.Z));
4483
4484 bytes[i++] = (byte)(velx % 256);
4485 bytes[i++] = (byte)((velx >> 8) % 256);
4486 bytes[i++] = (byte)(vely % 256);
4487 bytes[i++] = (byte)((vely >> 8) % 256);
4488 bytes[i++] = (byte)(velz % 256);
4489 bytes[i++] = (byte)((velz >> 8) % 256);
4490
4491 //accel
4492 bytes[i++] = (byte)(ac % 256);
4493 bytes[i++] = (byte)((ac >> 8) % 256);
4494 bytes[i++] = (byte)(ac % 256);
4495 bytes[i++] = (byte)((ac >> 8) % 256);
4496 bytes[i++] = (byte)(ac % 256);
4497 bytes[i++] = (byte)((ac >> 8) % 256);
4498
4499 ushort rw, rx, ry, rz;
4500 rw = (ushort)(32768 * (rotation.W + 1));
4501 rx = (ushort)(32768 * (rotation.X + 1));
4502 ry = (ushort)(32768 * (rotation.Y + 1));
4503 rz = (ushort)(32768 * (rotation.Z + 1));
4504
4505 //rot
4506 bytes[i++] = (byte)(rx % 256);
4507 bytes[i++] = (byte)((rx >> 8) % 256);
4508 bytes[i++] = (byte)(ry % 256);
4509 bytes[i++] = (byte)((ry >> 8) % 256);
4510 bytes[i++] = (byte)(rz % 256);
4511 bytes[i++] = (byte)((rz >> 8) % 256);
4512 bytes[i++] = (byte)(rw % 256);
4513 bytes[i++] = (byte)((rw >> 8) % 256);
4514
4515 //rotation vel
4516 Vector3 rvel = new Vector3(rotationalvelocity.X, rotationalvelocity.Y, rotationalvelocity.Z);
4517
4518 rvel = rvel / 128.0f;
4519 rvel.X += 1;
4520 rvel.Y += 1;
4521 rvel.Z += 1;
4522 //vel
4523 ushort rvelx = (ushort)(32768 * (rvel.X));
4524 ushort rvely = (ushort)(32768 * (rvel.Y));
4525 ushort rvelz = (ushort)(32768 * (rvel.Z));
4526
4527 bytes[i++] = (byte)(rvelx % 256);
4528 bytes[i++] = (byte)((rvelx >> 8) % 256);
4529 bytes[i++] = (byte)(rvely % 256);
4530 bytes[i++] = (byte)((rvely >> 8) % 256);
4531 bytes[i++] = (byte)(rvelz % 256);
4532 bytes[i++] = (byte)((rvelz >> 8) % 256);
4533 dat.Data = bytes;
4534
4535 return dat;
4536 } 4194 }
4537 4195
4538 /// <summary> 4196 protected ImprovedTerseObjectUpdatePacket.ObjectDataBlock CreateImprovedTerseBlock(bool avatar, uint localID, byte state,
4539 /// Create the ObjectDataBlock for a ObjectUpdatePacket (for a Primitive) 4197 Vector4 collisionPlane, Vector3 position, Vector3 velocity, Vector3 acceleration, Quaternion rotation,
4540 /// </summary> 4198 Vector3 angularVelocity, byte[] textureEntry)
4541 /// <param name="primData"></param> 4199 {
4542 /// <returns></returns> 4200 int pos = 0;
4543 protected ObjectUpdatePacket.ObjectDataBlock CreatePrimUpdateBlock(PrimitiveBaseShape primShape, uint flags) 4201 byte[] data = new byte[(avatar ? 60 : 44)];
4544 { 4202
4545 ObjectUpdatePacket.ObjectDataBlock objupdate = PacketPool.GetDataBlock<ObjectUpdatePacket.ObjectDataBlock>(); 4203 // LocalID
4546 SetDefaultPrimPacketValues(objupdate); 4204 Utils.UIntToBytes(localID, data, pos);
4547 objupdate.UpdateFlags = flags; 4205 pos += 4;
4548 SetPrimPacketShapeData(objupdate, primShape); 4206
4549 4207 // Avatar/CollisionPlane
4550 if ((primShape.PCode == (byte)PCode.NewTree) || (primShape.PCode == (byte)PCode.Tree) || (primShape.PCode == (byte)PCode.Grass)) 4208 data[pos++] = state;
4551 { 4209 if (avatar)
4552 objupdate.Data = new byte[1]; 4210 {
4553 objupdate.Data[0] = primShape.State; 4211 data[pos++] = 1;
4554 } 4212
4555 return objupdate; 4213 if (collisionPlane == Vector4.Zero)
4556 } 4214 collisionPlane = Vector4.UnitW;
4557 4215
4558 protected void SetPrimPacketShapeData(ObjectUpdatePacket.ObjectDataBlock objectData, PrimitiveBaseShape primData) 4216 collisionPlane.ToBytes(data, pos);
4559 { 4217 pos += 16;
4560 objectData.TextureEntry = primData.TextureEntry; 4218 }
4561 objectData.PCode = primData.PCode; 4219 else
4562 objectData.State = primData.State; 4220 {
4563 objectData.PathBegin = primData.PathBegin; 4221 ++pos;
4564 objectData.PathEnd = primData.PathEnd; 4222 }
4565 objectData.PathScaleX = primData.PathScaleX; 4223
4566 objectData.PathScaleY = primData.PathScaleY; 4224 // Position
4567 objectData.PathShearX = primData.PathShearX; 4225 position.ToBytes(data, pos);
4568 objectData.PathShearY = primData.PathShearY; 4226 pos += 12;
4569 objectData.PathSkew = primData.PathSkew; 4227
4570 objectData.ProfileBegin = primData.ProfileBegin; 4228 // Velocity
4571 objectData.ProfileEnd = primData.ProfileEnd; 4229 Utils.UInt16ToBytes(Utils.FloatToUInt16(velocity.X, -128.0f, 128.0f), data, pos); pos += 2;
4572 objectData.Scale = primData.Scale; 4230 Utils.UInt16ToBytes(Utils.FloatToUInt16(velocity.Y, -128.0f, 128.0f), data, pos); pos += 2;
4573 objectData.PathCurve = primData.PathCurve; 4231 Utils.UInt16ToBytes(Utils.FloatToUInt16(velocity.Z, -128.0f, 128.0f), data, pos); pos += 2;
4574 objectData.ProfileCurve = primData.ProfileCurve; 4232
4575 objectData.ProfileHollow = primData.ProfileHollow; 4233 // Acceleration
4576 objectData.PathRadiusOffset = primData.PathRadiusOffset; 4234 Utils.UInt16ToBytes(Utils.FloatToUInt16(acceleration.X, -64.0f, 64.0f), data, pos); pos += 2;
4577 objectData.PathRevolutions = primData.PathRevolutions; 4235 Utils.UInt16ToBytes(Utils.FloatToUInt16(acceleration.Y, -64.0f, 64.0f), data, pos); pos += 2;
4578 objectData.PathTaperX = primData.PathTaperX; 4236 Utils.UInt16ToBytes(Utils.FloatToUInt16(acceleration.Z, -64.0f, 64.0f), data, pos); pos += 2;
4579 objectData.PathTaperY = primData.PathTaperY; 4237
4580 objectData.PathTwist = primData.PathTwist; 4238 // Rotation
4581 objectData.PathTwistBegin = primData.PathTwistBegin; 4239 Utils.UInt16ToBytes(Utils.FloatToUInt16(rotation.X, -1.0f, 1.0f), data, pos); pos += 2;
4582 objectData.ExtraParams = primData.ExtraParams; 4240 Utils.UInt16ToBytes(Utils.FloatToUInt16(rotation.Y, -1.0f, 1.0f), data, pos); pos += 2;
4241 Utils.UInt16ToBytes(Utils.FloatToUInt16(rotation.Z, -1.0f, 1.0f), data, pos); pos += 2;
4242 Utils.UInt16ToBytes(Utils.FloatToUInt16(rotation.W, -1.0f, 1.0f), data, pos); pos += 2;
4243
4244 // Angular Velocity
4245 Utils.UInt16ToBytes(Utils.FloatToUInt16(angularVelocity.X, -64.0f, 64.0f), data, pos); pos += 2;
4246 Utils.UInt16ToBytes(Utils.FloatToUInt16(angularVelocity.Y, -64.0f, 64.0f), data, pos); pos += 2;
4247 Utils.UInt16ToBytes(Utils.FloatToUInt16(angularVelocity.Z, -64.0f, 64.0f), data, pos); pos += 2;
4248
4249 ImprovedTerseObjectUpdatePacket.ObjectDataBlock block = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock();
4250 block.Data = data;
4251
4252 if (textureEntry != null && textureEntry.Length > 0)
4253 {
4254 byte[] teBytesFinal = new byte[textureEntry.Length + 4];
4255
4256 // Texture Length
4257 Utils.IntToBytes(textureEntry.Length, textureEntry, 0);
4258 // Texture
4259 Buffer.BlockCopy(textureEntry, 0, teBytesFinal, 4, textureEntry.Length);
4260
4261 block.TextureEntry = teBytesFinal;
4262 }
4263 else
4264 {
4265 block.TextureEntry = Utils.EmptyBytes;
4266 }
4267
4268 return block;
4583 } 4269 }
4584 4270
4585 /// <summary> 4271 protected ObjectUpdatePacket.ObjectDataBlock CreateAvatarUpdateBlock(SendAvatarData data)
4586 /// Set some default values in a ObjectUpdatePacket 4272 {
4587 /// </summary> 4273 byte[] objectData = new byte[60];
4588 /// <param name="objdata"></param> 4274 data.Position.ToBytes(objectData, 0);
4589 protected void SetDefaultPrimPacketValues(ObjectUpdatePacket.ObjectDataBlock objdata) 4275 //data.Velocity.ToBytes(objectData, 12);
4590 { 4276 //data.Acceleration.ToBytes(objectData, 24);
4591 objdata.PSBlock = new byte[0]; 4277 data.Rotation.ToBytes(objectData, 36);
4592 objdata.ExtraParams = new byte[1]; 4278 //data.AngularVelocity.ToBytes(objectData, 48);
4593 objdata.MediaURL = new byte[0]; 4279
4594 objdata.NameValue = new byte[0]; 4280 ObjectUpdatePacket.ObjectDataBlock update = new ObjectUpdatePacket.ObjectDataBlock();
4595 objdata.Text = new byte[0]; 4281
4596 objdata.TextColor = new byte[4]; 4282 update.Data = Utils.EmptyBytes;
4597 objdata.JointAxisOrAnchor = new Vector3(0, 0, 0); 4283 update.ExtraParams = new byte[1];
4598 objdata.JointPivot = new Vector3(0, 0, 0); 4284 update.FullID = data.AvatarID;
4599 objdata.Material = 3; 4285 update.ID = data.AvatarLocalID;
4600 objdata.TextureAnim = new byte[0]; 4286 update.Material = (byte)Material.Flesh;
4601 objdata.Sound = UUID.Zero; 4287 update.MediaURL = Utils.EmptyBytes;
4602 objdata.State = 0; 4288 update.NameValue = Utils.StringToBytes("FirstName STRING RW SV " + data.FirstName + "\nLastName STRING RW SV " +
4603 objdata.Data = new byte[0]; 4289 data.LastName + "\nTitle STRING RW SV " + data.GroupTitle);
4604 4290 update.ObjectData = objectData;
4605 objdata.ObjectData = new byte[60]; 4291 update.ParentID = data.ParentID;
4606 objdata.ObjectData[46] = 128; 4292 update.PathCurve = 16;
4607 objdata.ObjectData[47] = 63; 4293 update.PathScaleX = 100;
4294 update.PathScaleY = 100;
4295 update.PCode = (byte)PCode.Avatar;
4296 update.ProfileCurve = 1;
4297 update.PSBlock = Utils.EmptyBytes;
4298 update.Scale = Vector3.One;
4299 update.Text = Utils.EmptyBytes;
4300 update.TextColor = new byte[4];
4301 update.TextureAnim = Utils.EmptyBytes;
4302 update.TextureEntry = data.TextureEntry ?? Utils.EmptyBytes;
4303 update.UpdateFlags = 61 + (9 << 8) + (130 << 16) + (16 << 24); // TODO: Replace these numbers with PrimFlags
4304
4305 return update;
4608 } 4306 }
4609 4307
4610 /// <summary> 4308 protected ObjectUpdatePacket.ObjectDataBlock CreatePrimUpdateBlock(SendPrimitiveData data)
4611 ///
4612 /// </summary>
4613 /// <returns></returns>
4614 public ObjectUpdatePacket.ObjectDataBlock CreateDefaultAvatarPacket(byte[] textureEntry)
4615 { 4309 {
4616 ObjectUpdatePacket.ObjectDataBlock objdata = PacketPool.GetDataBlock<ObjectUpdatePacket.ObjectDataBlock>(); 4310 byte[] objectData = new byte[60];
4617 // new OpenMetaverse.Packets.ObjectUpdatePacket.ObjectDataBlock(data1, ref i); 4311 data.pos.ToBytes(objectData, 0);
4312 data.vel.ToBytes(objectData, 12);
4313 data.acc.ToBytes(objectData, 24);
4314 data.rotation.ToBytes(objectData, 36);
4315 data.rvel.ToBytes(objectData, 48);
4618 4316
4619 SetDefaultAvatarPacketValues(ref objdata); 4317 ObjectUpdatePacket.ObjectDataBlock update = new ObjectUpdatePacket.ObjectDataBlock();
4620 objdata.UpdateFlags = 61 + (9 << 8) + (130 << 16) + (16 << 24); 4318 update.ClickAction = (byte)data.clickAction;
4621 objdata.PathCurve = 16; 4319 update.CRC = 0;
4622 objdata.ProfileCurve = 1; 4320 update.ExtraParams = data.primShape.ExtraParams ?? Utils.EmptyBytes;
4623 objdata.PathScaleX = 100; 4321 update.FullID = data.objectID;
4624 objdata.PathScaleY = 100; 4322 update.ID = data.localID;
4625 objdata.ParentID = 0; 4323 //update.JointAxisOrAnchor = Vector3.Zero; // These are deprecated
4626 objdata.OwnerID = UUID.Zero; 4324 //update.JointPivot = Vector3.Zero;
4627 objdata.Scale = new Vector3(1, 1, 1); 4325 //update.JointType = 0;
4628 objdata.PCode = (byte)PCode.Avatar; 4326 update.Material = data.material;
4629 if (textureEntry != null) 4327 update.MediaURL = Utils.EmptyBytes; // FIXME: Support this in OpenSim
4328 if (data.attachment)
4630 { 4329 {
4631 objdata.TextureEntry = textureEntry; 4330 update.NameValue = Util.StringToBytes256("AttachItemID STRING RW SV " + data.AssetId);
4331 update.State = (byte)((data.AttachPoint % 16) * 16 + (data.AttachPoint / 16));
4332 }
4333 else
4334 {
4335 update.NameValue = Utils.EmptyBytes;
4336 update.State = data.primShape.State;
4337 }
4338 update.ObjectData = objectData;
4339 update.ParentID = data.parentID;
4340 update.PathBegin = data.primShape.PathBegin;
4341 update.PathCurve = data.primShape.PathCurve;
4342 update.PathEnd = data.primShape.PathEnd;
4343 update.PathRadiusOffset = data.primShape.PathRadiusOffset;
4344 update.PathRevolutions = data.primShape.PathRevolutions;
4345 update.PathScaleX = data.primShape.PathScaleX;
4346 update.PathScaleY = data.primShape.PathScaleY;
4347 update.PathShearX = data.primShape.PathShearX;
4348 update.PathShearY = data.primShape.PathShearY;
4349 update.PathSkew = data.primShape.PathSkew;
4350 update.PathTaperX = data.primShape.PathTaperX;
4351 update.PathTaperY = data.primShape.PathTaperY;
4352 update.PathTwist = data.primShape.PathTwist;
4353 update.PathTwistBegin = data.primShape.PathTwistBegin;
4354 update.PCode = data.primShape.PCode;
4355 update.ProfileBegin = data.primShape.ProfileBegin;
4356 update.ProfileCurve = data.primShape.ProfileCurve;
4357 update.ProfileEnd = data.primShape.ProfileEnd;
4358 update.ProfileHollow = data.primShape.ProfileHollow;
4359 update.PSBlock = data.particleSystem ?? Utils.EmptyBytes;
4360 update.TextColor = data.color ?? Color4.Black.GetBytes(true);
4361 update.TextureAnim = data.textureanim ?? Utils.EmptyBytes;
4362 update.TextureEntry = data.primShape.TextureEntry ?? Utils.EmptyBytes;
4363 update.Scale = data.primShape.Scale;
4364 update.Text = Util.StringToBytes256(data.text);
4365 update.UpdateFlags = (uint)data.flags;
4366
4367 if (data.SoundId != UUID.Zero)
4368 {
4369 update.Sound = data.SoundId;
4370 update.OwnerID = data.ownerID;
4371 update.Gain = (float)data.SoundVolume;
4372 update.Radius = (float)data.SoundRadius;
4373 update.Flags = data.SoundFlags;
4374 }
4375
4376 switch ((PCode)data.primShape.PCode)
4377 {
4378 case PCode.Grass:
4379 case PCode.Tree:
4380 case PCode.NewTree:
4381 update.Data = new byte[] { data.primShape.State };
4382 break;
4383 default:
4384 // TODO: Support ScratchPad
4385 //if (prim.ScratchPad != null)
4386 //{
4387 // update.Data = new byte[prim.ScratchPad.Length];
4388 // Buffer.BlockCopy(prim.ScratchPad, 0, update.Data, 0, update.Data.Length);
4389 //}
4390 //else
4391 //{
4392 // update.Data = Utils.EmptyBytes;
4393 //}
4394 update.Data = Utils.EmptyBytes;
4395 break;
4632 } 4396 }
4633 Vector3 pos = new Vector3(objdata.ObjectData, 16);
4634 pos.X = 100f;
4635 objdata.ID = 8880000;
4636 objdata.NameValue = Utils.StringToBytes("FirstName STRING RW SV Test \nLastName STRING RW SV User ");
4637 //Vector3 pos2 = new Vector3(100f, 100f, 23f);
4638 //objdata.FullID=user.AgentId;
4639 byte[] pb = pos.GetBytes();
4640 Array.Copy(pb, 0, objdata.ObjectData, 16, pb.Length);
4641
4642 return objdata;
4643 }
4644 4397
4645 /// <summary> 4398 return update;
4646 ///
4647 /// </summary>
4648 /// <param name="objdata"></param>
4649 protected void SetDefaultAvatarPacketValues(ref ObjectUpdatePacket.ObjectDataBlock objdata)
4650 {
4651 objdata.PSBlock = new byte[0];
4652 objdata.ExtraParams = new byte[1];
4653 objdata.MediaURL = new byte[0];
4654 objdata.NameValue = new byte[0];
4655 objdata.Text = new byte[0];
4656 objdata.TextColor = new byte[4];
4657 objdata.JointAxisOrAnchor = new Vector3(0, 0, 0);
4658 objdata.JointPivot = new Vector3(0, 0, 0);
4659 objdata.Material = 4;
4660 objdata.TextureAnim = new byte[0];
4661 objdata.Sound = UUID.Zero;
4662 Primitive.TextureEntry ntex = new Primitive.TextureEntry(new UUID("00000000-0000-0000-5005-000000000005"));
4663 objdata.TextureEntry = ntex.GetBytes();
4664
4665 objdata.State = 0;
4666 objdata.Data = new byte[0];
4667
4668 objdata.ObjectData = new byte[76];
4669 objdata.ObjectData[15] = 128;
4670 objdata.ObjectData[16] = 63;
4671 objdata.ObjectData[56] = 128;
4672 objdata.ObjectData[61] = 102;
4673 objdata.ObjectData[62] = 40;
4674 objdata.ObjectData[63] = 61;
4675 objdata.ObjectData[64] = 189;
4676 } 4399 }
4677 4400
4678 public void SendNameReply(UUID profileId, string firstname, string lastname) 4401 public void SendNameReply(UUID profileId, string firstname, string lastname)
@@ -4682,8 +4405,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
4682 packet.UUIDNameBlock = new UUIDNameReplyPacket.UUIDNameBlockBlock[1]; 4405 packet.UUIDNameBlock = new UUIDNameReplyPacket.UUIDNameBlockBlock[1];
4683 packet.UUIDNameBlock[0] = new UUIDNameReplyPacket.UUIDNameBlockBlock(); 4406 packet.UUIDNameBlock[0] = new UUIDNameReplyPacket.UUIDNameBlockBlock();
4684 packet.UUIDNameBlock[0].ID = profileId; 4407 packet.UUIDNameBlock[0].ID = profileId;
4685 packet.UUIDNameBlock[0].FirstName = Utils.StringToBytes(firstname); 4408 packet.UUIDNameBlock[0].FirstName = Util.StringToBytes256(firstname);
4686 packet.UUIDNameBlock[0].LastName = Utils.StringToBytes(lastname); 4409 packet.UUIDNameBlock[0].LastName = Util.StringToBytes256(lastname);
4687 4410
4688 OutPacket(packet, ThrottleOutPacketType.Task); 4411 OutPacket(packet, ThrottleOutPacketType.Task);
4689 } 4412 }
@@ -4879,8 +4602,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
4879 scriptQuestion.Data.TaskID = taskID; 4602 scriptQuestion.Data.TaskID = taskID;
4880 scriptQuestion.Data.ItemID = itemID; 4603 scriptQuestion.Data.ItemID = itemID;
4881 scriptQuestion.Data.Questions = question; 4604 scriptQuestion.Data.Questions = question;
4882 scriptQuestion.Data.ObjectName = Utils.StringToBytes(taskName); 4605 scriptQuestion.Data.ObjectName = Util.StringToBytes256(taskName);
4883 scriptQuestion.Data.ObjectOwner = Utils.StringToBytes(ownerName); 4606 scriptQuestion.Data.ObjectOwner = Util.StringToBytes256(ownerName);
4884 4607
4885 OutPacket(scriptQuestion, ThrottleOutPacketType.Task); 4608 OutPacket(scriptQuestion, ThrottleOutPacketType.Task);
4886 } 4609 }
@@ -5274,7 +4997,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
5274 if (m_moneyBalance + debit >= 0) 4997 if (m_moneyBalance + debit >= 0)
5275 { 4998 {
5276 m_moneyBalance += debit; 4999 m_moneyBalance += debit;
5277 SendMoneyBalance(UUID.Zero, true, Utils.StringToBytes("Poof Poof!"), m_moneyBalance); 5000 SendMoneyBalance(UUID.Zero, true, Util.StringToBytes256("Poof Poof!"), m_moneyBalance);
5278 return true; 5001 return true;
5279 } 5002 }
5280 return false; 5003 return false;
@@ -9218,7 +8941,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
9218 new GroupTitlesReplyPacket.GroupDataBlock(); 8941 new GroupTitlesReplyPacket.GroupDataBlock();
9219 8942
9220 groupTitlesReply.GroupData[i].Title = 8943 groupTitlesReply.GroupData[i].Title =
9221 Utils.StringToBytes(d.Name); 8944 Util.StringToBytes256(d.Name);
9222 groupTitlesReply.GroupData[i].RoleID = 8945 groupTitlesReply.GroupData[i].RoleID =
9223 d.UUID; 8946 d.UUID;
9224 groupTitlesReply.GroupData[i].Selected = 8947 groupTitlesReply.GroupData[i].Selected =
@@ -9255,10 +8978,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP
9255 groupProfileRequest.GroupData.GroupID); 8978 groupProfileRequest.GroupData.GroupID);
9256 8979
9257 groupProfileReply.GroupData.GroupID = d.GroupID; 8980 groupProfileReply.GroupData.GroupID = d.GroupID;
9258 groupProfileReply.GroupData.Name = Utils.StringToBytes(d.Name); 8981 groupProfileReply.GroupData.Name = Util.StringToBytes256(d.Name);
9259 groupProfileReply.GroupData.Charter = Utils.StringToBytes(d.Charter); 8982 groupProfileReply.GroupData.Charter = Util.StringToBytes1024(d.Charter);
9260 groupProfileReply.GroupData.ShowInList = d.ShowInList; 8983 groupProfileReply.GroupData.ShowInList = d.ShowInList;
9261 groupProfileReply.GroupData.MemberTitle = Utils.StringToBytes(d.MemberTitle); 8984 groupProfileReply.GroupData.MemberTitle = Util.StringToBytes256(d.MemberTitle);
9262 groupProfileReply.GroupData.PowersMask = d.PowersMask; 8985 groupProfileReply.GroupData.PowersMask = d.PowersMask;
9263 groupProfileReply.GroupData.InsigniaID = d.InsigniaID; 8986 groupProfileReply.GroupData.InsigniaID = d.InsigniaID;
9264 groupProfileReply.GroupData.FounderID = d.FounderID; 8987 groupProfileReply.GroupData.FounderID = d.FounderID;
@@ -9330,11 +9053,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP
9330 groupMembersReply.MemberData[i].Contribution = 9053 groupMembersReply.MemberData[i].Contribution =
9331 m.Contribution; 9054 m.Contribution;
9332 groupMembersReply.MemberData[i].OnlineStatus = 9055 groupMembersReply.MemberData[i].OnlineStatus =
9333 Utils.StringToBytes(m.OnlineStatus); 9056 Util.StringToBytes256(m.OnlineStatus);
9334 groupMembersReply.MemberData[i].AgentPowers = 9057 groupMembersReply.MemberData[i].AgentPowers =
9335 m.AgentPowers; 9058 m.AgentPowers;
9336 groupMembersReply.MemberData[i].Title = 9059 groupMembersReply.MemberData[i].Title =
9337 Utils.StringToBytes(m.Title); 9060 Util.StringToBytes256(m.Title);
9338 groupMembersReply.MemberData[i].IsOwner = 9061 groupMembersReply.MemberData[i].IsOwner =
9339 m.IsOwner; 9062 m.IsOwner;
9340 } 9063 }
@@ -9395,11 +9118,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP
9395 groupRolesReply.RoleData[i].RoleID = 9118 groupRolesReply.RoleData[i].RoleID =
9396 d.RoleID; 9119 d.RoleID;
9397 groupRolesReply.RoleData[i].Name = 9120 groupRolesReply.RoleData[i].Name =
9398 Utils.StringToBytes(d.Name); 9121 Util.StringToBytes256(d.Name);
9399 groupRolesReply.RoleData[i].Title = 9122 groupRolesReply.RoleData[i].Title =
9400 Utils.StringToBytes(d.Title); 9123 Util.StringToBytes256(d.Title);
9401 groupRolesReply.RoleData[i].Description = 9124 groupRolesReply.RoleData[i].Description =
9402 Utils.StringToBytes(d.Description); 9125 Util.StringToBytes1024(d.Description);
9403 groupRolesReply.RoleData[i].Powers = 9126 groupRolesReply.RoleData[i].Powers =
9404 d.Powers; 9127 d.Powers;
9405 groupRolesReply.RoleData[i].Members = 9128 groupRolesReply.RoleData[i].Members =
@@ -9626,9 +9349,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP
9626 groupNoticesListReply.Data[i].Timestamp = 9349 groupNoticesListReply.Data[i].Timestamp =
9627 g.Timestamp; 9350 g.Timestamp;
9628 groupNoticesListReply.Data[i].FromName = 9351 groupNoticesListReply.Data[i].FromName =
9629 Utils.StringToBytes(g.FromName); 9352 Util.StringToBytes256(g.FromName);
9630 groupNoticesListReply.Data[i].Subject = 9353 groupNoticesListReply.Data[i].Subject =
9631 Utils.StringToBytes(g.Subject); 9354 Util.StringToBytes256(g.Subject);
9632 groupNoticesListReply.Data[i].HasAttachment = 9355 groupNoticesListReply.Data[i].HasAttachment =
9633 g.HasAttachment; 9356 g.HasAttachment;
9634 groupNoticesListReply.Data[i].AssetType = 9357 groupNoticesListReply.Data[i].AssetType =
@@ -10227,12 +9950,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP
10227 byte mediaLoop) 9950 byte mediaLoop)
10228 { 9951 {
10229 ParcelMediaUpdatePacket updatePacket = new ParcelMediaUpdatePacket(); 9952 ParcelMediaUpdatePacket updatePacket = new ParcelMediaUpdatePacket();
10230 updatePacket.DataBlock.MediaURL = Utils.StringToBytes(mediaUrl); 9953 updatePacket.DataBlock.MediaURL = Util.StringToBytes256(mediaUrl);
10231 updatePacket.DataBlock.MediaID = mediaTextureID; 9954 updatePacket.DataBlock.MediaID = mediaTextureID;
10232 updatePacket.DataBlock.MediaAutoScale = autoScale; 9955 updatePacket.DataBlock.MediaAutoScale = autoScale;
10233 9956
10234 updatePacket.DataBlockExtended.MediaType = Utils.StringToBytes(mediaType); 9957 updatePacket.DataBlockExtended.MediaType = Util.StringToBytes256(mediaType);
10235 updatePacket.DataBlockExtended.MediaDesc = Utils.StringToBytes(mediaDesc); 9958 updatePacket.DataBlockExtended.MediaDesc = Util.StringToBytes256(mediaDesc);
10236 updatePacket.DataBlockExtended.MediaWidth = mediaWidth; 9959 updatePacket.DataBlockExtended.MediaWidth = mediaWidth;
10237 updatePacket.DataBlockExtended.MediaHeight = mediaHeight; 9960 updatePacket.DataBlockExtended.MediaHeight = mediaHeight;
10238 updatePacket.DataBlockExtended.MediaLoop = mediaLoop; 9961 updatePacket.DataBlockExtended.MediaLoop = mediaLoop;
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs
index 4f3478b..66e1468 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs
@@ -733,10 +733,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP
733 // on to en-US to avoid number parsing issues 733 // on to en-US to avoid number parsing issues
734 Culture.SetCurrentCulture(); 734 Culture.SetCurrentCulture();
735 735
736 IncomingPacket incomingPacket = null;
737
738 while (base.IsRunning) 736 while (base.IsRunning)
739 { 737 {
738 IncomingPacket incomingPacket = null;
739
740 try 740 try
741 { 741 {
742 if (packetInbox.Dequeue(100, ref incomingPacket)) 742 if (packetInbox.Dequeue(100, ref incomingPacket))
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 30fe976..70b11c3 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -357,13 +357,6 @@ namespace OpenSim.Region.Framework.Scenes
357 get { return m_defaultScriptEngine; } 357 get { return m_defaultScriptEngine; }
358 } 358 }
359 359
360 // Reference to all of the agents in the scene (root and child)
361 protected Dictionary<UUID, ScenePresence> m_scenePresences
362 {
363 get { return m_sceneGraph.ScenePresences; }
364 set { m_sceneGraph.ScenePresences = value; }
365 }
366
367 public EntityManager Entities 360 public EntityManager Entities
368 { 361 {
369 get { return m_sceneGraph.Entities; } 362 get { return m_sceneGraph.Entities; }
@@ -1183,14 +1176,13 @@ namespace OpenSim.Region.Framework.Scenes
1183 /// <param name="stats">Stats on the Simulator's performance</param> 1176 /// <param name="stats">Stats on the Simulator's performance</param>
1184 private void SendSimStatsPackets(SimStats stats) 1177 private void SendSimStatsPackets(SimStats stats)
1185 { 1178 {
1186 List<ScenePresence> StatSendAgents = GetScenePresences(); 1179 ForEachScenePresence(
1187 foreach (ScenePresence agent in StatSendAgents) 1180 delegate(ScenePresence agent)
1188 {
1189 if (!agent.IsChildAgent)
1190 { 1181 {
1191 agent.ControllingClient.SendSimStats(stats); 1182 if (!agent.IsChildAgent)
1183 agent.ControllingClient.SendSimStats(stats);
1192 } 1184 }
1193 } 1185 );
1194 } 1186 }
1195 1187
1196 /// <summary> 1188 /// <summary>
@@ -3501,10 +3493,8 @@ namespace OpenSim.Region.Framework.Scenes
3501 { 3493 {
3502 ScenePresence presence; 3494 ScenePresence presence;
3503 3495
3504 lock (m_scenePresences) 3496 lock (m_sceneGraph.ScenePresences)
3505 { 3497 m_sceneGraph.ScenePresences.TryGetValue(agentID, out presence);
3506 m_scenePresences.TryGetValue(agentID, out presence);
3507 }
3508 3498
3509 if (presence != null) 3499 if (presence != null)
3510 { 3500 {
@@ -3714,12 +3704,9 @@ namespace OpenSim.Region.Framework.Scenes
3714 public void RequestTeleportLocation(IClientAPI remoteClient, ulong regionHandle, Vector3 position, 3704 public void RequestTeleportLocation(IClientAPI remoteClient, ulong regionHandle, Vector3 position,
3715 Vector3 lookAt, uint teleportFlags) 3705 Vector3 lookAt, uint teleportFlags)
3716 { 3706 {
3717 ScenePresence sp = null; 3707 ScenePresence sp;
3718 lock (m_scenePresences) 3708 lock (m_sceneGraph.ScenePresences)
3719 { 3709 m_sceneGraph.ScenePresences.TryGetValue(remoteClient.AgentId, out sp);
3720 if (m_scenePresences.ContainsKey(remoteClient.AgentId))
3721 sp = m_scenePresences[remoteClient.AgentId];
3722 }
3723 3710
3724 if (sp != null) 3711 if (sp != null)
3725 { 3712 {
@@ -4168,7 +4155,7 @@ namespace OpenSim.Region.Framework.Scenes
4168 public void ForEachScenePresence(Action<ScenePresence> action) 4155 public void ForEachScenePresence(Action<ScenePresence> action)
4169 { 4156 {
4170 // We don't want to try to send messages if there are no avatars. 4157 // We don't want to try to send messages if there are no avatars.
4171 if (m_scenePresences != null) 4158 if (m_sceneGraph != null && m_sceneGraph.ScenePresences != null)
4172 { 4159 {
4173 try 4160 try
4174 { 4161 {
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index 79f6366..a078b3d 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -3791,15 +3791,15 @@ if (m_shape != null) {
3791 if (ParentGroup.RootPart == this) 3791 if (ParentGroup.RootPart == this)
3792 lPos = AbsolutePosition; 3792 lPos = AbsolutePosition;
3793 } 3793 }
3794 3794
3795 // Causes this thread to dig into the Client Thread Data. 3795 // Causes this thread to dig into the Client Thread Data.
3796 // Remember your locking here! 3796 // Remember your locking here!
3797 remoteClient.SendPrimTerseUpdate(new SendPrimitiveTerseData(m_regionHandle, 3797 remoteClient.SendPrimTerseUpdate(new SendPrimitiveTerseData(m_regionHandle,
3798 (ushort)(m_parentGroup.GetTimeDilation() * 3798 (ushort)(m_parentGroup.GetTimeDilation() *
3799 (float)ushort.MaxValue), LocalId, lPos, 3799 (float)ushort.MaxValue), LocalId, lPos,
3800 RotationOffset, Velocity, 3800 RotationOffset, Velocity, Acceleration,
3801 RotationalVelocity, state, FromItemID, 3801 RotationalVelocity, state, FromItemID,
3802 OwnerID, (int)AttachmentPoint, ParentGroup.GetUpdatePriority(remoteClient))); 3802 OwnerID, (int)AttachmentPoint, null, ParentGroup.GetUpdatePriority(remoteClient)));
3803 } 3803 }
3804 3804
3805 public void AddScriptLPS(int count) 3805 public void AddScriptLPS(int count)
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index f05c3d8..bdd80c6 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -1160,15 +1160,21 @@ namespace OpenSim.Region.Framework.Scenes
1160 /// </summary> 1160 /// </summary>
1161 public void HandleAgentUpdate(IClientAPI remoteClient, AgentUpdateArgs agentData) 1161 public void HandleAgentUpdate(IClientAPI remoteClient, AgentUpdateArgs agentData)
1162 { 1162 {
1163 lock (m_agentUpdates) 1163 const int AGENT_UPDATE_TIMEOUT_MS = 1000 * 3;
1164
1165 if (System.Threading.Monitor.TryEnter(m_agentUpdates, AGENT_UPDATE_TIMEOUT_MS))
1164 { 1166 {
1165 if (m_updatesAllowed) 1167 try
1166 { 1168 {
1167 RealHandleAgentUpdate(remoteClient, agentData); 1169 if (m_updatesAllowed)
1168 return; 1170 {
1171 RealHandleAgentUpdate(remoteClient, agentData);
1172 return;
1173 }
1174
1175 m_agentUpdates.Add(agentData);
1169 } 1176 }
1170 1177 finally { System.Threading.Monitor.Exit(m_agentUpdates); }
1171 m_agentUpdates.Add(agentData);
1172 } 1178 }
1173 } 1179 }
1174 1180
@@ -2471,7 +2477,7 @@ namespace OpenSim.Region.Framework.Scenes
2471 pos.Z -= m_appearance.HipOffset; 2477 pos.Z -= m_appearance.HipOffset;
2472 2478
2473 remoteClient.SendAvatarTerseUpdate(new SendAvatarTerseData(m_regionHandle, (ushort)(m_scene.TimeDilation * ushort.MaxValue), LocalId, 2479 remoteClient.SendAvatarTerseUpdate(new SendAvatarTerseData(m_regionHandle, (ushort)(m_scene.TimeDilation * ushort.MaxValue), LocalId,
2474 pos, m_velocity, m_rotation, m_uuid, GetUpdatePriority(remoteClient))); 2480 pos, m_velocity, Vector3.Zero, m_rotation, Vector4.Zero, m_uuid, null, GetUpdatePriority(remoteClient)));
2475 2481
2476 m_scene.StatsReporter.AddAgentTime(Environment.TickCount - m_perfMonMS); 2482 m_scene.StatsReporter.AddAgentTime(Environment.TickCount - m_perfMonMS);
2477 m_scene.StatsReporter.AddAgentUpdates(1); 2483 m_scene.StatsReporter.AddAgentUpdates(1);
@@ -3504,7 +3510,6 @@ namespace OpenSim.Region.Framework.Scenes
3504 3510
3505 public void Close() 3511 public void Close()
3506 { 3512 {
3507
3508 lock (m_attachments) 3513 lock (m_attachments)
3509 { 3514 {
3510 // Delete attachments from scene 3515 // Delete attachments from scene
@@ -3535,7 +3540,6 @@ namespace OpenSim.Region.Framework.Scenes
3535 m_sceneViewer.Close(); 3540 m_sceneViewer.Close();
3536 3541
3537 RemoveFromPhysicalScene(); 3542 RemoveFromPhysicalScene();
3538 GC.Collect();
3539 } 3543 }
3540 3544
3541 public ScenePresence() 3545 public ScenePresence()