aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs239
-rwxr-xr-xOpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs9
-rw-r--r--OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs2
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs19
-rwxr-xr-xOpenSim/Region/Framework/Scenes/Scene.cs35
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs66
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectPart.cs16
-rw-r--r--OpenSim/Region/Framework/Scenes/ScenePresence.cs399
-rw-r--r--OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs4
-rw-r--r--OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs4
10 files changed, 483 insertions, 310 deletions
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
index 662e5ad..526783e 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
@@ -80,7 +80,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
80 public event DeRezObject OnDeRezObject; 80 public event DeRezObject OnDeRezObject;
81 public event RezRestoreToWorld OnRezRestoreToWorld; 81 public event RezRestoreToWorld OnRezRestoreToWorld;
82 public event ModifyTerrain OnModifyTerrain; 82 public event ModifyTerrain OnModifyTerrain;
83 public event Action<IClientAPI> OnRegionHandShakeReply; 83 public event Action<IClientAPI, uint> OnRegionHandShakeReply;
84 public event GenericCall1 OnRequestWearables; 84 public event GenericCall1 OnRequestWearables;
85 public event SetAppearance OnSetAppearance; 85 public event SetAppearance OnSetAppearance;
86 public event AvatarNowWearing OnAvatarNowWearing; 86 public event AvatarNowWearing OnAvatarNowWearing;
@@ -392,6 +392,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
392 392
393 protected IAssetService m_assetService; 393 protected IAssetService m_assetService;
394 394
395 protected bool m_supportViewerCache = false;
395 #endregion Class Members 396 #endregion Class Members
396 397
397 #region Properties 398 #region Properties
@@ -552,6 +553,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
552 string name = string.Format("AsyncInUDP-{0}",m_agentId.ToString()); 553 string name = string.Format("AsyncInUDP-{0}",m_agentId.ToString());
553 m_asyncPacketProcess = new JobEngine(name, name, 10000); 554 m_asyncPacketProcess = new JobEngine(name, name, 10000);
554 IsActive = true; 555 IsActive = true;
556
557 m_supportViewerCache = m_udpServer.SupportViewerObjectsCache;
555 } 558 }
556 559
557 #region Client Methods 560 #region Client Methods
@@ -4777,6 +4780,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP
4777 13 // ID (high frequency) 4780 13 // ID (high frequency)
4778 }; 4781 };
4779 4782
4783 static private readonly byte[] ObjectUpdateCachedHeader = new byte[] {
4784 Helpers.MSG_RELIABLE,
4785 0, 0, 0, 0, // sequence number
4786 0, // extra
4787 14 // ID (high frequency)
4788 };
4789
4780 private void ProcessEntityUpdates(int maxUpdatesBytes) 4790 private void ProcessEntityUpdates(int maxUpdatesBytes)
4781 { 4791 {
4782 if (!IsActive) 4792 if (!IsActive)
@@ -4786,8 +4796,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP
4786 if (mysp == null) 4796 if (mysp == null)
4787 return; 4797 return;
4788 4798
4799
4789 List<EntityUpdate> objectUpdates = null; 4800 List<EntityUpdate> objectUpdates = null;
4790 //List<EntityUpdate> compressedUpdates = null; 4801 List<EntityUpdate> objectUpdateProbes = null;
4802 List<EntityUpdate> compressedUpdates = null;
4791 List<EntityUpdate> terseUpdates = null; 4803 List<EntityUpdate> terseUpdates = null;
4792 List<SceneObjectPart> ObjectAnimationUpdates = null; 4804 List<SceneObjectPart> ObjectAnimationUpdates = null;
4793 4805
@@ -4799,6 +4811,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
4799 4811
4800 EntityUpdate update; 4812 EntityUpdate update;
4801 4813
4814 bool viewerCache = m_supportViewerCache && (m_viewerHandShakeFlags & 1) != 0 && mysp.IsChildAgent; // only on child agents
4802 bool doCulling = m_scene.ObjectsCullingByDistance; 4815 bool doCulling = m_scene.ObjectsCullingByDistance;
4803 float cullingrange = 64.0f; 4816 float cullingrange = 64.0f;
4804 Vector3 mypos = Vector3.Zero; 4817 Vector3 mypos = Vector3.Zero;
@@ -4807,7 +4820,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
4807 bool orderedDequeue = false; // temporary off 4820 bool orderedDequeue = false; // temporary off
4808 4821
4809 HashSet<SceneObjectGroup> GroupsNeedFullUpdate = new HashSet<SceneObjectGroup>(); 4822 HashSet<SceneObjectGroup> GroupsNeedFullUpdate = new HashSet<SceneObjectGroup>();
4810 4823 bool useCompressUpdate = false;
4811 4824
4812 if (doCulling) 4825 if (doCulling)
4813 { 4826 {
@@ -4834,15 +4847,17 @@ namespace OpenSim.Region.ClientStack.LindenUDP
4834 } 4847 }
4835 } 4848 }
4836 4849
4837 PrimUpdateFlags updateFlags = (PrimUpdateFlags)update.Flags; 4850 PrimUpdateFlags updateFlags = update.Flags;
4838 4851
4839 if(updateFlags.HasFlag(PrimUpdateFlags.Kill)) 4852 if (updateFlags.HasFlag(PrimUpdateFlags.Kill))
4840 { 4853 {
4841 m_killRecord.Add(update.Entity.LocalId); 4854 m_killRecord.Add(update.Entity.LocalId);
4842 maxUpdatesBytes -= 30; 4855 maxUpdatesBytes -= 30;
4843 continue; 4856 continue;
4844 } 4857 }
4845 4858
4859 useCompressUpdate = false;
4860
4846 if (update.Entity is SceneObjectPart) 4861 if (update.Entity is SceneObjectPart)
4847 { 4862 {
4848 SceneObjectPart part = (SceneObjectPart)update.Entity; 4863 SceneObjectPart part = (SceneObjectPart)update.Entity;
@@ -4928,10 +4943,38 @@ namespace OpenSim.Region.ClientStack.LindenUDP
4928 if (dpos > maxview * maxview) 4943 if (dpos > maxview * maxview)
4929 continue; 4944 continue;
4930 4945
4931 GroupsNeedFullUpdate.Add(grp); 4946 if (!viewerCache || !updateFlags.HasFlag(PrimUpdateFlags.UpdateProbe))
4932 continue; 4947 {
4948 GroupsNeedFullUpdate.Add(grp);
4949 continue;
4950 }
4951 }
4952 }
4953
4954 if (updateFlags.HasFlag(PrimUpdateFlags.UpdateProbe))
4955 {
4956 if (objectUpdateProbes == null)
4957 {
4958 objectUpdateProbes = new List<EntityUpdate>();
4959 maxUpdatesBytes -= 18;
4960 }
4961 objectUpdateProbes.Add(update);
4962 maxUpdatesBytes -= 12;
4963 continue;
4964 }
4965
4966 if (m_SupportObjectAnimations && updateFlags.HasFlag(PrimUpdateFlags.Animations))
4967 {
4968 if (part.Animations != null)
4969 {
4970 if (ObjectAnimationUpdates == null)
4971 ObjectAnimationUpdates = new List<SceneObjectPart>();
4972 ObjectAnimationUpdates.Add(part);
4973 maxUpdatesBytes -= 20 * part.Animations.Count + 24;
4933 } 4974 }
4934 } 4975 }
4976 if(viewerCache)
4977 useCompressUpdate = grp.IsViewerCachable;
4935 } 4978 }
4936 else if (update.Entity is ScenePresence) 4979 else if (update.Entity is ScenePresence)
4937 { 4980 {
@@ -4951,27 +4994,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
4951 4994
4952 #region UpdateFlags to packet type conversion 4995 #region UpdateFlags to packet type conversion
4953 4996
4954 // bool canUseCompressed = true;
4955
4956 if (update.Entity is SceneObjectPart)
4957 {
4958 if (m_SupportObjectAnimations && updateFlags.HasFlag(PrimUpdateFlags.Animations))
4959 {
4960 SceneObjectPart sop = (SceneObjectPart)update.Entity;
4961 if ( sop.Animations != null)
4962 {
4963 if(ObjectAnimationUpdates == null)
4964 ObjectAnimationUpdates = new List<SceneObjectPart>();
4965 ObjectAnimationUpdates.Add(sop);
4966 maxUpdatesBytes -= 20 * sop.Animations.Count + 24;
4967 }
4968 }
4969 }
4970 else
4971 {
4972 // canUseCompressed = false;
4973 }
4974
4975 updateFlags &= PrimUpdateFlags.FullUpdate; // clear other control bits already handled 4997 updateFlags &= PrimUpdateFlags.FullUpdate; // clear other control bits already handled
4976 if(updateFlags == PrimUpdateFlags.None) 4998 if(updateFlags == PrimUpdateFlags.None)
4977 continue; 4999 continue;
@@ -5025,34 +5047,28 @@ namespace OpenSim.Region.ClientStack.LindenUDP
5025 } 5047 }
5026 else 5048 else
5027 { 5049 {
5028 SceneObjectPart part = (SceneObjectPart)update.Entity; 5050 if (useCompressUpdate)
5029 SceneObjectGroup grp = part.ParentGroup;
5030 // minimal compress conditions, not enough ?
5031 //if (grp.UsesPhysics || part.Velocity.LengthSquared() > 1e-8f || part.Acceleration.LengthSquared() > 1e-6f)
5032 { 5051 {
5033 maxUpdatesBytes -= 150; // crude estimation 5052 maxUpdatesBytes -= 150; // crude estimation
5034 5053
5035 if (objectUpdates == null) 5054 if (compressedUpdates == null)
5036 { 5055 {
5037 objectUpdates = new List<EntityUpdate>(); 5056 compressedUpdates = new List<EntityUpdate>();
5038 maxUpdatesBytes -= 18; 5057 maxUpdatesBytes -= 18;
5039 } 5058 }
5040 objectUpdates.Add(update); 5059 compressedUpdates.Add(update);
5041 } 5060 }
5042 //compress still disabled
5043 /*
5044 else 5061 else
5045 { 5062 {
5046 maxUpdatesBytes -= 150; // crude estimation 5063 maxUpdatesBytes -= 150; // crude estimation
5047 5064
5048 if (compressedUpdates == null) 5065 if (objectUpdates == null)
5049 { 5066 {
5050 compressedUpdates = new List<EntityUpdate>(); 5067 objectUpdates = new List<EntityUpdate>();
5051 maxUpdatesBytes -= 18; 5068 maxUpdatesBytes -= 18;
5052 } 5069 }
5053 compressedUpdates.Add(update); 5070 objectUpdates.Add(update);
5054 } 5071 }
5055 */
5056 } 5072 }
5057 } 5073 }
5058 5074
@@ -5147,7 +5163,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
5147 delegate (OutgoingPacket oPacket) { ResendPrimUpdates(tau, oPacket); }, false, false); 5163 delegate (OutgoingPacket oPacket) { ResendPrimUpdates(tau, oPacket); }, false, false);
5148 } 5164 }
5149 } 5165 }
5150 /* 5166
5151 if(compressedUpdates != null) 5167 if(compressedUpdates != null)
5152 { 5168 {
5153 List<EntityUpdate> tau = new List<EntityUpdate>(30); 5169 List<EntityUpdate> tau = new List<EntityUpdate>(30);
@@ -5168,8 +5184,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP
5168 int count = 0; 5184 int count = 0;
5169 foreach (EntityUpdate eu in compressedUpdates) 5185 foreach (EntityUpdate eu in compressedUpdates)
5170 { 5186 {
5187 SceneObjectPart sop = (SceneObjectPart)eu.Entity;
5188 if (sop.ParentGroup == null || sop.ParentGroup.IsDeleted)
5189 continue;
5171 lastpos = pos; 5190 lastpos = pos;
5172 CreateCompressedUpdateBlock((SceneObjectPart)eu.Entity, mysp, data, ref pos); 5191 CreateCompressedUpdateBlock(sop, mysp, data, ref pos);
5173 if (pos < LLUDPServer.MAXPAYLOAD) 5192 if (pos < LLUDPServer.MAXPAYLOAD)
5174 { 5193 {
5175 tau.Add(eu); 5194 tau.Add(eu);
@@ -5207,7 +5226,68 @@ namespace OpenSim.Region.ClientStack.LindenUDP
5207 delegate (OutgoingPacket oPacket) { ResendPrimUpdates(tau, oPacket); }, false, false); 5226 delegate (OutgoingPacket oPacket) { ResendPrimUpdates(tau, oPacket); }, false, false);
5208 } 5227 }
5209 } 5228 }
5210 */ 5229
5230 if (objectUpdateProbes != null)
5231 {
5232 UDPPacketBuffer buf = m_udpServer.GetNewUDPBuffer(m_udpClient.RemoteEndPoint);
5233 byte[] data = buf.Data;
5234
5235 Buffer.BlockCopy(ObjectUpdateCachedHeader, 0, data, 0, 7);
5236
5237 Utils.UInt64ToBytesSafepos(m_scene.RegionInfo.RegionHandle, data, 7); // 15
5238 Utils.UInt16ToBytes(timeDilation, data, 15); // 17
5239
5240 int countposition = 17; // blocks count position
5241 int pos = 18;
5242
5243 int count = 0;
5244 foreach (EntityUpdate eu in objectUpdateProbes)
5245 {
5246 SceneObjectPart sop = (SceneObjectPart)eu.Entity;
5247 if (sop.ParentGroup == null || sop.ParentGroup.IsDeleted)
5248 continue;
5249 uint primflags = m_scene.Permissions.GenerateClientFlags(sop, mysp);
5250 if (mysp.UUID != sop.OwnerID)
5251 primflags &= ~(uint)PrimFlags.CreateSelected;
5252 else
5253 {
5254 if (sop.CreateSelected)
5255 primflags |= (uint)PrimFlags.CreateSelected;
5256 else
5257 primflags &= ~(uint)PrimFlags.CreateSelected;
5258 }
5259
5260 Utils.UIntToBytes(sop.LocalId, data, pos); pos += 4;
5261 Utils.UIntToBytes((uint)sop.ParentGroup.PseudoCRC, data, pos); pos += 4; //WRONG
5262 Utils.UIntToBytes(primflags, data, pos); pos += 4;
5263
5264 if (pos < (LLUDPServer.MAXPAYLOAD - 12))
5265 ++count;
5266 else
5267 {
5268 // we need more packets
5269 UDPPacketBuffer newbuf = m_udpServer.GetNewUDPBuffer(m_udpClient.RemoteEndPoint);
5270 Buffer.BlockCopy(buf.Data, 0, newbuf.Data, 0, countposition); // start is the same
5271
5272 buf.Data[countposition] = (byte)count;
5273 buf.DataLength = pos;
5274 m_udpServer.SendUDPPacket(m_udpClient, buf, ThrottleOutPacketType.Task, null, false, false);
5275
5276 buf = newbuf;
5277 data = buf.Data;
5278 pos = 18;
5279 count = 0;
5280 }
5281 }
5282
5283 if (count > 0)
5284 {
5285 buf.Data[countposition] = (byte)count;
5286 buf.DataLength = pos;
5287 m_udpServer.SendUDPPacket(m_udpClient, buf, ThrottleOutPacketType.Task, null, false, false);
5288 }
5289 }
5290
5211 if (terseUpdates != null) 5291 if (terseUpdates != null)
5212 { 5292 {
5213 int blocks = terseUpdates.Count; 5293 int blocks = terseUpdates.Count;
@@ -5329,8 +5409,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP
5329 { 5409 {
5330 lock (GroupsInView) 5410 lock (GroupsInView)
5331 GroupsInView.Add(grp); 5411 GroupsInView.Add(grp);
5412 PrimUpdateFlags flags = PrimUpdateFlags.CancelKill;
5413 if(viewerCache && grp.IsViewerCachable)
5414 flags |= PrimUpdateFlags.UpdateProbe;
5332 foreach (SceneObjectPart p in grp.Parts) 5415 foreach (SceneObjectPart p in grp.Parts)
5333 SendEntityUpdate(p, PrimUpdateFlags.CancelKill); 5416 SendEntityUpdate(p, flags);
5334 } 5417 }
5335 } 5418 }
5336 5419
@@ -5461,10 +5544,14 @@ namespace OpenSim.Region.ClientStack.LindenUDP
5461 5544
5462 if(GroupsNeedFullUpdate.Count > 0) 5545 if(GroupsNeedFullUpdate.Count > 0)
5463 { 5546 {
5464 foreach(SceneObjectGroup grp in GroupsNeedFullUpdate) 5547 bool viewerCache = m_supportViewerCache && (m_viewerHandShakeFlags & 1) != 0 && mysp.IsChildAgent;
5548 foreach (SceneObjectGroup grp in GroupsNeedFullUpdate)
5465 { 5549 {
5466 foreach(SceneObjectPart p in grp.Parts) 5550 PrimUpdateFlags flags = PrimUpdateFlags.CancelKill;
5467 SendEntityUpdate(p, PrimUpdateFlags.CancelKill); 5551 if (viewerCache && grp.IsViewerCachable)
5552 flags |= PrimUpdateFlags.UpdateProbe;
5553 foreach (SceneObjectPart p in grp.Parts)
5554 SendEntityUpdate(p, flags);
5468 } 5555 }
5469 } 5556 }
5470 5557
@@ -7173,7 +7260,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
7173 dest[pos++] = state; 7260 dest[pos++] = state;
7174 7261
7175 ///**** temp hack 7262 ///**** temp hack
7176 Utils.UIntToBytesSafepos((uint)rnd.Next(), dest, pos); pos += 4; //CRC needs fix or things will get crazy for now avoid caching 7263 Utils.UIntToBytesSafepos((uint)part.ParentGroup.PseudoCRC, dest, pos); pos += 4;
7177 dest[pos++] = part.Material; 7264 dest[pos++] = part.Material;
7178 dest[pos++] = part.ClickAction; 7265 dest[pos++] = part.ClickAction;
7179 part.Shape.Scale.ToBytes(dest, pos); pos += 12; 7266 part.Shape.Scale.ToBytes(dest, pos); pos += 12;
@@ -8407,13 +8494,27 @@ namespace OpenSim.Region.ClientStack.LindenUDP
8407 return true; 8494 return true;
8408 } 8495 }
8409 8496
8497 public uint m_viewerHandShakeFlags = 0;
8498
8410 private bool HandlerRegionHandshakeReply(IClientAPI sender, Packet Pack) 8499 private bool HandlerRegionHandshakeReply(IClientAPI sender, Packet Pack)
8411 { 8500 {
8412 Action<IClientAPI> handlerRegionHandShakeReply = OnRegionHandShakeReply; 8501 Action<IClientAPI, uint> handlerRegionHandShakeReply = OnRegionHandShakeReply;
8413 if (handlerRegionHandShakeReply != null) 8502 if (handlerRegionHandShakeReply == null)
8414 { 8503 return true; // silence the warning
8415 handlerRegionHandShakeReply(this); 8504
8416 } 8505 RegionHandshakeReplyPacket rsrpkt = (RegionHandshakeReplyPacket)Pack;
8506 if(rsrpkt.AgentData.AgentID != m_agentId || rsrpkt.AgentData.SessionID != m_sessionId)
8507 return false;
8508
8509 // regionHandSHake is a protocol message, but it is also seems to be the only way to update terrain textures
8510 // in last case this should be ignored.
8511 OnRegionHandShakeReply = null;
8512 if(m_supportViewerCache)
8513 m_viewerHandShakeFlags = rsrpkt.RegionInfo.Flags;
8514 else
8515 m_viewerHandShakeFlags = 0;
8516
8517 handlerRegionHandShakeReply(this, m_viewerHandShakeFlags);
8417 8518
8418 return true; 8519 return true;
8419 } 8520 }
@@ -8657,19 +8758,19 @@ namespace OpenSim.Region.ClientStack.LindenUDP
8657 return true; 8758 return true;
8658 } 8759 }
8659 8760
8660 private bool HandleCompleteAgentMovement(IClientAPI sender, Packet Pack) 8761 private bool HandleCompleteAgentMovement(IClientAPI sender, Packet Pack)
8661 { 8762 {
8662 m_log.DebugFormat("[LLClientView] HandleCompleteAgentMovement"); 8763 //m_log.DebugFormat("[LLClientView] HandleCompleteAgentMovement");
8663 8764
8664 Action<IClientAPI, bool> handlerCompleteMovementToRegion = OnCompleteMovementToRegion; 8765 Action<IClientAPI, bool> handlerCompleteMovementToRegion = OnCompleteMovementToRegion;
8665 if (handlerCompleteMovementToRegion != null) 8766 if (handlerCompleteMovementToRegion == null)
8666 { 8767 return false;
8667 handlerCompleteMovementToRegion(sender, true); 8768
8668 } 8769 CompleteAgentMovementPacket cmp = (CompleteAgentMovementPacket)Pack;
8669 else 8770 if(cmp.AgentData.AgentID != m_agentId || cmp.AgentData.SessionID != m_sessionId || cmp.AgentData.CircuitCode != m_circuitCode)
8670 m_log.Debug("HandleCompleteAgentMovement NULL handler"); 8771 return false;
8671 8772
8672 handlerCompleteMovementToRegion = null; 8773 handlerCompleteMovementToRegion(sender, true);
8673 8774
8674 return true; 8775 return true;
8675 } 8776 }
@@ -9141,6 +9242,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP
9141 9242
9142 private bool HandleRequestMultipleObjects(IClientAPI sender, Packet Pack) 9243 private bool HandleRequestMultipleObjects(IClientAPI sender, Packet Pack)
9143 { 9244 {
9245 ObjectRequest handlerObjectRequest = OnObjectRequest;
9246 if (handlerObjectRequest == null)
9247 return false;
9248
9144 RequestMultipleObjectsPacket incomingRequest = (RequestMultipleObjectsPacket)Pack; 9249 RequestMultipleObjectsPacket incomingRequest = (RequestMultipleObjectsPacket)Pack;
9145 9250
9146 #region Packet Session and User Check 9251 #region Packet Session and User Check
@@ -9149,16 +9254,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
9149 return true; 9254 return true;
9150 #endregion 9255 #endregion
9151 9256
9152 ObjectRequest handlerObjectRequest = null;
9153
9154 for (int i = 0; i < incomingRequest.ObjectData.Length; i++) 9257 for (int i = 0; i < incomingRequest.ObjectData.Length; i++)
9155 {
9156 handlerObjectRequest = OnObjectRequest;
9157 if (handlerObjectRequest != null)
9158 {
9159 handlerObjectRequest(incomingRequest.ObjectData[i].ID, this); 9258 handlerObjectRequest(incomingRequest.ObjectData[i].ID, this);
9160 }
9161 }
9162 return true; 9259 return true;
9163 } 9260 }
9164 9261
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs
index a0b3d21..6032681 100755
--- a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs
@@ -369,6 +369,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
369 /// </summary> 369 /// </summary>
370 public int IncomingOrphanedPacketCount { get; protected set; } 370 public int IncomingOrphanedPacketCount { get; protected set; }
371 371
372 public bool SupportViewerObjectsCache = false;
372 /// <summary> 373 /// <summary>
373 /// Run queue empty processing within a single persistent thread. 374 /// Run queue empty processing within a single persistent thread.
374 /// </summary> 375 /// </summary>
@@ -433,6 +434,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
433 m_disableFacelights = config.GetBoolean("DisableFacelights", false); 434 m_disableFacelights = config.GetBoolean("DisableFacelights", false);
434 m_ackTimeout = 1000 * config.GetInt("AckTimeout", 60); 435 m_ackTimeout = 1000 * config.GetInt("AckTimeout", 60);
435 m_pausedAckTimeout = 1000 * config.GetInt("PausedAckTimeout", 300); 436 m_pausedAckTimeout = 1000 * config.GetInt("PausedAckTimeout", 300);
437 SupportViewerObjectsCache = config.GetBoolean("SupportViewerObjectsCache", SupportViewerObjectsCache);
436 } 438 }
437 else 439 else
438 { 440 {
@@ -1724,14 +1726,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
1724 if (client != null) 1726 if (client != null)
1725 { 1727 {
1726 client.SendRegionHandshake(); 1728 client.SendRegionHandshake();
1727
1728 client.CheckViewerCaps(); 1729 client.CheckViewerCaps();
1729
1730 // We only want to send initial data to new clients, not ones which are being converted from child to root.
1731 bool tp = (aCircuit.teleportFlags > 0);
1732 // Let's delay this for TP agents, otherwise the viewer doesn't know where to get resources from
1733 if (!tp)
1734 client.SceneAgent.SendInitialDataToMe();
1735 } 1730 }
1736 } 1731 }
1737 else 1732 else
diff --git a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs
index fd08721..936f956 100644
--- a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs
+++ b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs
@@ -574,7 +574,7 @@ namespace OpenSim.Region.CoreModules.World.Estate
574 Scene.RegionInfo.RegionSettings.Save(); 574 Scene.RegionInfo.RegionSettings.Save();
575 TriggerRegionInfoChange(); 575 TriggerRegionInfoChange();
576 sendRegionHandshakeToAll(); 576 sendRegionHandshakeToAll();
577 sendRegionInfoPacketToAll(); 577// sendRegionInfoPacketToAll();
578 } 578 }
579 579
580 private void handleCommitEstateTerrainTextureRequest(IClientAPI remoteClient) 580 private void handleCommitEstateTerrainTextureRequest(IClientAPI remoteClient)
diff --git a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs
index 0c080d2..2995091 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs
@@ -153,10 +153,23 @@ namespace OpenSim.Region.Framework.Scenes
153 /// <param name="remoteClient"></param> 153 /// <param name="remoteClient"></param>
154 public void RequestPrim(uint primLocalID, IClientAPI remoteClient) 154 public void RequestPrim(uint primLocalID, IClientAPI remoteClient)
155 { 155 {
156 SceneObjectGroup sog = GetGroupByPrim(primLocalID); 156 SceneObjectPart part = GetSceneObjectPart(primLocalID);
157 if (part != null)
158 {
159 SceneObjectGroup sog = part.ParentGroup;
160 if(!sog.IsDeleted)
161 {
162 PrimUpdateFlags update = PrimUpdateFlags.FullUpdate;
163 if (sog.RootPart.Shape.MeshFlagEntry)
164 update = PrimUpdateFlags.FullUpdatewithAnim;
165 part.SendUpdate(remoteClient, update);
166 }
167 }
168
169 //SceneObjectGroup sog = GetGroupByPrim(primLocalID);
157 170
158 if (sog != null) 171 //if (sog != null)
159 sog.SendFullAnimUpdateToClient(remoteClient); 172 //sog.SendFullAnimUpdateToClient(remoteClient);
160 } 173 }
161 174
162 /// <summary> 175 /// <summary>
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 7668a87..7d312e9 100755
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -170,8 +170,6 @@ namespace OpenSim.Region.Framework.Scenes
170 } 170 }
171 private bool m_scripts_enabled; 171 private bool m_scripts_enabled;
172 172
173 public SynchronizeSceneHandler SynchronizeScene;
174
175 public bool ClampNegativeZ 173 public bool ClampNegativeZ
176 { 174 {
177 get { return m_clampNegativeZ; } 175 get { return m_clampNegativeZ; }
@@ -1006,11 +1004,9 @@ namespace OpenSim.Region.Framework.Scenes
1006 m_useTrashOnDelete = startupConfig.GetBoolean("UseTrashOnDelete",m_useTrashOnDelete); 1004 m_useTrashOnDelete = startupConfig.GetBoolean("UseTrashOnDelete",m_useTrashOnDelete);
1007 m_trustBinaries = startupConfig.GetBoolean("TrustBinaries", m_trustBinaries); 1005 m_trustBinaries = startupConfig.GetBoolean("TrustBinaries", m_trustBinaries);
1008 m_allowScriptCrossings = startupConfig.GetBoolean("AllowScriptCrossing", m_allowScriptCrossings); 1006 m_allowScriptCrossings = startupConfig.GetBoolean("AllowScriptCrossing", m_allowScriptCrossings);
1009 m_dontPersistBefore = 1007 m_dontPersistBefore = startupConfig.GetLong("MinimumTimeBeforePersistenceConsidered", DEFAULT_MIN_TIME_FOR_PERSISTENCE);
1010 startupConfig.GetLong("MinimumTimeBeforePersistenceConsidered", DEFAULT_MIN_TIME_FOR_PERSISTENCE);
1011 m_dontPersistBefore *= 10000000; 1008 m_dontPersistBefore *= 10000000;
1012 m_persistAfter = 1009 m_persistAfter = startupConfig.GetLong("MaximumTimeBeforePersistenceConsidered", DEFAULT_MAX_TIME_FOR_PERSISTENCE);
1013 startupConfig.GetLong("MaximumTimeBeforePersistenceConsidered", DEFAULT_MAX_TIME_FOR_PERSISTENCE);
1014 m_persistAfter *= 10000000; 1010 m_persistAfter *= 10000000;
1015 1011
1016 m_defaultScriptEngine = startupConfig.GetString("DefaultScriptEngine", "XEngine"); 1012 m_defaultScriptEngine = startupConfig.GetString("DefaultScriptEngine", "XEngine");
@@ -1695,9 +1691,6 @@ namespace OpenSim.Region.Framework.Scenes
1695 { 1691 {
1696 if (PhysicsEnabled) 1692 if (PhysicsEnabled)
1697 physicsFPS = m_sceneGraph.UpdatePhysics(FrameTime); 1693 physicsFPS = m_sceneGraph.UpdatePhysics(FrameTime);
1698
1699 if (SynchronizeScene != null)
1700 SynchronizeScene(this);
1701 } 1694 }
1702 1695
1703 tmpMS2 = Util.GetTimeStampMS(); 1696 tmpMS2 = Util.GetTimeStampMS();
@@ -1775,30 +1768,6 @@ namespace OpenSim.Region.Framework.Scenes
1775 1768
1776 // Region ready should always be set 1769 // Region ready should always be set
1777 Ready = true; 1770 Ready = true;
1778
1779
1780 IConfig restartConfig = m_config.Configs["RestartModule"];
1781 if (restartConfig != null)
1782 {
1783 string markerPath = restartConfig.GetString("MarkerPath", String.Empty);
1784
1785 if (markerPath != String.Empty)
1786 {
1787 string path = Path.Combine(markerPath, RegionInfo.RegionID.ToString() + ".ready");
1788 try
1789 {
1790 string pidstring = System.Diagnostics.Process.GetCurrentProcess().Id.ToString();
1791 FileStream fs = File.Create(path);
1792 System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
1793 Byte[] buf = enc.GetBytes(pidstring);
1794 fs.Write(buf, 0, buf.Length);
1795 fs.Close();
1796 }
1797 catch (Exception)
1798 {
1799 }
1800 }
1801 }
1802 } 1771 }
1803 else 1772 else
1804 { 1773 {
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 7d5bbbf..0b38179 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -119,6 +119,21 @@ namespace OpenSim.Region.Framework.Scenes
119 119
120 // private PrimCountTaintedDelegate handlerPrimCountTainted = null; 120 // private PrimCountTaintedDelegate handlerPrimCountTainted = null;
121 121
122 public bool IsViewerCachable
123 {
124 get
125 {
126 // needs more exclusion ?
127 return(Backup && !IsTemporary && !inTransit && !IsSelected && !UsesPhysics && !IsAttachmentCheckFull() &&
128 !RootPart.Shape.MeshFlagEntry && // animations are not sent correctly for now
129 RootPart.KeyframeMotion == null &&
130 (DateTime.UtcNow.Ticks - timeLastChanged > 36000000000) && //36000000000 is one hour
131 RootPart.Velocity.LengthSquared() < 1e8f && // should not be needed
132 RootPart.Acceleration.LengthSquared() < 1e4f // should not be needed
133 );
134 }
135 }
136
122 /// <summary> 137 /// <summary>
123 /// Signal whether the non-inventory attributes of any prims in the group have changed 138 /// Signal whether the non-inventory attributes of any prims in the group have changed
124 /// since the group's last persistent backup 139 /// since the group's last persistent backup
@@ -128,7 +143,8 @@ namespace OpenSim.Region.Framework.Scenes
128 private long timeLastChanged = 0; 143 private long timeLastChanged = 0;
129 private long m_maxPersistTime = 0; 144 private long m_maxPersistTime = 0;
130 private long m_minPersistTime = 0; 145 private long m_minPersistTime = 0;
131// private Random m_rand; 146
147 public int PseudoCRC;
132 148
133 /// <summary> 149 /// <summary>
134 /// This indicates whether the object has changed such that it needs to be repersisted to permenant storage 150 /// This indicates whether the object has changed such that it needs to be repersisted to permenant storage
@@ -145,40 +161,26 @@ namespace OpenSim.Region.Framework.Scenes
145 { 161 {
146 if (value) 162 if (value)
147 { 163 {
148
149 if (Backup) 164 if (Backup)
150 {
151 m_scene.SceneGraph.FireChangeBackup(this); 165 m_scene.SceneGraph.FireChangeBackup(this);
152 } 166
167 PseudoCRC = (int)(DateTime.UtcNow.Ticks); ;
153 timeLastChanged = DateTime.UtcNow.Ticks; 168 timeLastChanged = DateTime.UtcNow.Ticks;
154 if (!m_hasGroupChanged) 169 if (!m_hasGroupChanged)
155 timeFirstChanged = DateTime.UtcNow.Ticks; 170 timeFirstChanged = timeLastChanged;
156 if (m_rootPart != null && m_scene != null) 171 if (m_rootPart != null && m_scene != null)
157 { 172 {
158/*
159 if (m_rand == null)
160 {
161 byte[] val = new byte[16];
162 m_rootPart.UUID.ToBytes(val, 0);
163 m_rand = new Random(BitConverter.ToInt32(val, 0));
164 }
165 */
166 if (m_scene.GetRootAgentCount() == 0) 173 if (m_scene.GetRootAgentCount() == 0)
167 { 174 {
168 //If the region is empty, this change has been made by an automated process 175 //If the region is empty, this change has been made by an automated process
169 //and thus we delay the persist time by a random amount between 1.5 and 2.5. 176 //and thus we delay the persist time by a random amount between 1.5 and 2.5.
170 177
171// float factor = 1.5f + (float)(m_rand.NextDouble());
172 float factor = 2.0f; 178 float factor = 2.0f;
173 m_maxPersistTime = (long)((float)m_scene.m_persistAfter * factor); 179 m_maxPersistTime = (long)(m_scene.m_persistAfter * factor);
174 m_minPersistTime = (long)((float)m_scene.m_dontPersistBefore * factor); 180 m_minPersistTime = (long)(m_scene.m_dontPersistBefore * factor);
175 } 181 }
176 else 182 else
177 { 183 {
178 //If the region is not empty, we want to obey the minimum and maximum persist times
179 //but add a random factor so we stagger the object persistance a little
180// m_maxPersistTime = (long)((float)m_scene.m_persistAfter * (1.0d - (m_rand.NextDouble() / 5.0d))); //Multiply by 1.0-1.5
181// m_minPersistTime = (long)((float)m_scene.m_dontPersistBefore * (1.0d + (m_rand.NextDouble() / 2.0d))); //Multiply by 0.8-1.0
182 m_maxPersistTime = m_scene.m_persistAfter; 184 m_maxPersistTime = m_scene.m_persistAfter;
183 m_minPersistTime = m_scene.m_dontPersistBefore; 185 m_minPersistTime = m_scene.m_dontPersistBefore;
184 } 186 }
@@ -1330,6 +1332,7 @@ namespace OpenSim.Region.Framework.Scenes
1330 public SceneObjectGroup() 1332 public SceneObjectGroup()
1331 { 1333 {
1332 m_lastCollisionSoundMS = Util.GetTimeStampMS() + 1000.0; 1334 m_lastCollisionSoundMS = Util.GetTimeStampMS() + 1000.0;
1335 PseudoCRC = (int)(DateTime.UtcNow.Ticks);
1333 } 1336 }
1334 1337
1335 /// <summary> 1338 /// <summary>
@@ -2441,6 +2444,21 @@ namespace OpenSim.Region.Framework.Scenes
2441 } 2444 }
2442 } 2445 }
2443 2446
2447 public void SendUpdateProbes(IClientAPI remoteClient)
2448 {
2449 PrimUpdateFlags update = PrimUpdateFlags.UpdateProbe;
2450
2451 RootPart.SendUpdate(remoteClient, update);
2452
2453 SceneObjectPart[] parts = m_parts.GetArray();
2454 for (int i = 0; i < parts.Length; i++)
2455 {
2456 SceneObjectPart part = parts[i];
2457 if (part != RootPart)
2458 part.SendUpdate(remoteClient, update);
2459 }
2460 }
2461
2444 #region Copying 2462 #region Copying
2445 2463
2446 /// <summary> 2464 /// <summary>
@@ -2516,6 +2534,7 @@ namespace OpenSim.Region.Framework.Scenes
2516 } 2534 }
2517 2535
2518 dupe.InvalidatePartsLinkMaps(); 2536 dupe.InvalidatePartsLinkMaps();
2537 dupe.PseudoCRC = (int)(DateTime.UtcNow.Ticks);
2519 m_dupeInProgress = false; 2538 m_dupeInProgress = false;
2520 return dupe; 2539 return dupe;
2521 } 2540 }
@@ -2769,6 +2788,7 @@ namespace OpenSim.Region.Framework.Scenes
2769 } 2788 }
2770 } 2789 }
2771 2790
2791 PseudoCRC = (int)(DateTime.UtcNow.Ticks);
2772 rpart.ScheduleFullUpdate(); 2792 rpart.ScheduleFullUpdate();
2773 } 2793 }
2774 2794
@@ -2808,6 +2828,7 @@ namespace OpenSim.Region.Framework.Scenes
2808 part.ResetIDs(part.LinkNum); // Don't change link nums 2828 part.ResetIDs(part.LinkNum); // Don't change link nums
2809 m_parts.Add(part.UUID, part); 2829 m_parts.Add(part.UUID, part);
2810 } 2830 }
2831 PseudoCRC = (int)(DateTime.UtcNow.Ticks);
2811 } 2832 }
2812 } 2833 }
2813 2834
@@ -3117,7 +3138,6 @@ namespace OpenSim.Region.Framework.Scenes
3117 } 3138 }
3118 } 3139 }
3119 3140
3120
3121 // 'linkPart' == the root of the group being linked into this group 3141 // 'linkPart' == the root of the group being linked into this group
3122 SceneObjectPart linkPart = objectGroup.m_rootPart; 3142 SceneObjectPart linkPart = objectGroup.m_rootPart;
3123 3143
@@ -3160,7 +3180,6 @@ namespace OpenSim.Region.Framework.Scenes
3160 axPos *= Quaternion.Conjugate(parentRot); 3180 axPos *= Quaternion.Conjugate(parentRot);
3161 linkPart.OffsetPosition = axPos; 3181 linkPart.OffsetPosition = axPos;
3162 3182
3163
3164 // If there is only one SOP in a SOG, the LinkNum is zero. I.e., not a linkset. 3183 // If there is only one SOP in a SOG, the LinkNum is zero. I.e., not a linkset.
3165 // Now that we know this SOG has at least two SOPs in it, the new root 3184 // Now that we know this SOG has at least two SOPs in it, the new root
3166 // SOP becomes the first in the linkset. 3185 // SOP becomes the first in the linkset.
@@ -3193,8 +3212,7 @@ namespace OpenSim.Region.Framework.Scenes
3193 3212
3194 linkPart.CreateSelected = true; 3213 linkPart.CreateSelected = true;
3195 3214
3196 // let physics know preserve part volume dtc messy since UpdatePrimFlags doesn't look to parent changes for now 3215 linkPart.UpdatePrimFlags(grpusephys, grptemporary, (IsPhantom || (linkPart.Flags & PrimFlags.Phantom) != 0), linkPart.VolumeDetectActive || RootPart.VolumeDetectActive, true);
3197 linkPart.UpdatePrimFlags(grpusephys, grptemporary, (IsPhantom || (linkPart.Flags & PrimFlags.Phantom) != 0), linkPart.VolumeDetectActive, true);
3198 3216
3199 // If the added SOP is physical, also tell the physics engine about the link relationship. 3217 // If the added SOP is physical, also tell the physics engine about the link relationship.
3200 if (linkPart.PhysActor != null && m_rootPart.PhysActor != null && m_rootPart.PhysActor.IsPhysical) 3218 if (linkPart.PhysActor != null && m_rootPart.PhysActor != null && m_rootPart.PhysActor.IsPhysical)
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index 5c38bf3..4f3f83a 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -1179,9 +1179,10 @@ namespace OpenSim.Region.Framework.Scenes
1179 1179
1180 set 1180 set
1181 { 1181 {
1182 string old = m_mediaUrl;
1182 m_mediaUrl = value; 1183 m_mediaUrl = value;
1183 1184
1184 if (ParentGroup != null) 1185 if (ParentGroup != null && old != m_mediaUrl)
1185 ParentGroup.HasGroupChanged = true; 1186 ParentGroup.HasGroupChanged = true;
1186 } 1187 }
1187 } 1188 }
@@ -1385,13 +1386,6 @@ namespace OpenSim.Region.Framework.Scenes
1385 } 1386 }
1386 } 1387 }
1387 1388
1388 [XmlIgnore]
1389 public bool IsOccupied // KF If an av is sittingon this prim
1390 {
1391 get { return m_occupied; }
1392 set { m_occupied = value; }
1393 }
1394
1395 /// <summary> 1389 /// <summary>
1396 /// ID of the avatar that is sat on us if we have a sit target. If there is no such avatar then is UUID.Zero 1390 /// ID of the avatar that is sat on us if we have a sit target. If there is no such avatar then is UUID.Zero
1397 /// </summary> 1391 /// </summary>
@@ -2472,12 +2466,6 @@ namespace OpenSim.Region.Framework.Scenes
2472 2466
2473 public uint GetEffectiveObjectFlags() 2467 public uint GetEffectiveObjectFlags()
2474 { 2468 {
2475 // Commenting this section of code out since it doesn't actually do anything, as enums are handled by
2476 // value rather than reference
2477// PrimFlags f = _flags;
2478// if (m_parentGroup == null || m_parentGroup.RootPart == this)
2479// f &= ~(PrimFlags.Touch | PrimFlags.Money);
2480
2481 uint eff = (uint)Flags | (uint)LocalFlags; 2469 uint eff = (uint)Flags | (uint)LocalFlags;
2482 if(m_inventory == null || m_inventory.Count == 0) 2470 if(m_inventory == null || m_inventory.Count == 0)
2483 eff |= (uint)PrimFlags.InventoryEmpty; 2471 eff |= (uint)PrimFlags.InventoryEmpty;
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index f010035..e635841 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -1212,7 +1212,9 @@ namespace OpenSim.Region.Framework.Scenes
1212 ControllingClient.OnForceReleaseControls += HandleForceReleaseControls; 1212 ControllingClient.OnForceReleaseControls += HandleForceReleaseControls;
1213 ControllingClient.OnAutoPilotGo += MoveToTargetHandle; 1213 ControllingClient.OnAutoPilotGo += MoveToTargetHandle;
1214 ControllingClient.OnUpdateThrottles += RaiseUpdateThrottles; 1214 ControllingClient.OnUpdateThrottles += RaiseUpdateThrottles;
1215// ControllingClient.OnAgentFOV += HandleAgentFOV; 1215 ControllingClient.OnRegionHandShakeReply += RegionHandShakeReply;
1216
1217 // ControllingClient.OnAgentFOV += HandleAgentFOV;
1216 1218
1217 // ControllingClient.OnChildAgentStatus += new StatusChange(this.ChildStatusChange); 1219 // ControllingClient.OnChildAgentStatus += new StatusChange(this.ChildStatusChange);
1218 // ControllingClient.OnStopMovement += new GenericCall2(this.StopMovement); 1220 // ControllingClient.OnStopMovement += new GenericCall2(this.StopMovement);
@@ -1232,7 +1234,9 @@ namespace OpenSim.Region.Framework.Scenes
1232 ControllingClient.OnForceReleaseControls -= HandleForceReleaseControls; 1234 ControllingClient.OnForceReleaseControls -= HandleForceReleaseControls;
1233 ControllingClient.OnAutoPilotGo -= MoveToTargetHandle; 1235 ControllingClient.OnAutoPilotGo -= MoveToTargetHandle;
1234 ControllingClient.OnUpdateThrottles -= RaiseUpdateThrottles; 1236 ControllingClient.OnUpdateThrottles -= RaiseUpdateThrottles;
1235// ControllingClient.OnAgentFOV += HandleAgentFOV; 1237 ControllingClient.OnRegionHandShakeReply -= RegionHandShakeReply;
1238
1239 // ControllingClient.OnAgentFOV += HandleAgentFOV;
1236 } 1240 }
1237 1241
1238 private void SetDirectionVectors() 1242 private void SetDirectionVectors()
@@ -2126,56 +2130,54 @@ namespace OpenSim.Region.Framework.Scenes
2126 return; 2130 return;
2127 } 2131 }
2128 2132
2129 2133 if(IsChildAgent)
2134 {
2135 return; // how?
2136 }
2130 //m_log.DebugFormat("[CompleteMovement] MakeRootAgent: {0}ms", Util.EnvironmentTickCountSubtract(ts)); 2137 //m_log.DebugFormat("[CompleteMovement] MakeRootAgent: {0}ms", Util.EnvironmentTickCountSubtract(ts));
2131 2138
2132 if(!haveGroupInformation && !IsChildAgent && !IsNPC) 2139 if (!IsNPC)
2133 { 2140 {
2134 IGroupsModule gm = m_scene.RequestModuleInterface<IGroupsModule>(); 2141 if (!haveGroupInformation && !IsNPC)
2135 if (gm != null) 2142 {
2136 Grouptitle = gm.GetGroupTitle(m_uuid); 2143 IGroupsModule gm = m_scene.RequestModuleInterface<IGroupsModule>();
2144 if (gm != null)
2145 Grouptitle = gm.GetGroupTitle(m_uuid);
2137 2146
2138 //m_log.DebugFormat("[CompleteMovement] Missing Grouptitle: {0}ms", Util.EnvironmentTickCountSubtract(ts)); 2147 //m_log.DebugFormat("[CompleteMovement] Missing Grouptitle: {0}ms", Util.EnvironmentTickCountSubtract(ts));
2139 2148
2140 InventoryFolderBase cof = m_scene.InventoryService.GetFolderForType(client.AgentId, (FolderType)46); 2149 InventoryFolderBase cof = m_scene.InventoryService.GetFolderForType(client.AgentId, (FolderType)46);
2141 if (cof == null) 2150 if (cof == null)
2142 COF = UUID.Zero; 2151 COF = UUID.Zero;
2143 else 2152 else
2144 COF = cof.ID; 2153 COF = cof.ID;
2145 2154
2146 m_log.DebugFormat("[CompleteMovement]: Missing COF for {0} is {1}", client.AgentId, COF); 2155 m_log.DebugFormat("[CompleteMovement]: Missing COF for {0} is {1}", client.AgentId, COF);
2147 } 2156 }
2148 2157
2149 if (!string.IsNullOrEmpty(m_callbackURI)) 2158 if (!string.IsNullOrEmpty(m_callbackURI))
2150 { 2159 {
2151 // We cannot sleep here since this would hold up the inbound packet processing thread, as 2160 // We cannot sleep here since this would hold up the inbound packet processing thread, as
2152 // CompleteMovement() is executed synchronously. However, it might be better to delay the release 2161 // CompleteMovement() is executed synchronously. However, it might be better to delay the release
2153 // here until we know for sure that the agent is active in this region. Sending AgentMovementComplete 2162 // here until we know for sure that the agent is active in this region. Sending AgentMovementComplete
2154 // is not enough for Imprudence clients - there appears to be a small delay (<200ms, <500ms) until they regard this 2163 // is not enough for Imprudence clients - there appears to be a small delay (<200ms, <500ms) until they regard this
2155 // region as the current region, meaning that a close sent before then will fail the teleport. 2164 // region as the current region, meaning that a close sent before then will fail the teleport.
2156 // System.Threading.Thread.Sleep(2000); 2165 // System.Threading.Thread.Sleep(2000);
2157 2166
2158 m_log.DebugFormat( 2167 m_log.DebugFormat(
2159 "[SCENE PRESENCE]: Releasing {0} {1} with callback to {2}", 2168 "[SCENE PRESENCE]: Releasing {0} {1} with callback to {2}",
2160 client.Name, client.AgentId, m_callbackURI); 2169 client.Name, client.AgentId, m_callbackURI);
2161 2170
2162 UUID originID; 2171 UUID originID;
2163 2172
2164 lock (m_originRegionIDAccessLock) 2173 lock (m_originRegionIDAccessLock)
2165 originID = m_originRegionID; 2174 originID = m_originRegionID;
2166 2175
2167 Scene.SimulationService.ReleaseAgent(originID, UUID, m_callbackURI); 2176 Scene.SimulationService.ReleaseAgent(originID, UUID, m_callbackURI);
2168 m_callbackURI = null; 2177 m_callbackURI = null;
2169 //m_log.DebugFormat("[CompleteMovement] ReleaseAgent: {0}ms", Util.EnvironmentTickCountSubtract(ts)); 2178 //m_log.DebugFormat("[CompleteMovement] ReleaseAgent: {0}ms", Util.EnvironmentTickCountSubtract(ts));
2179 }
2170 } 2180 }
2171// else
2172// {
2173// m_log.DebugFormat(
2174// "[SCENE PRESENCE]: No callback provided on CompleteMovement of {0} {1} to {2}",
2175// client.Name, client.AgentId, m_scene.RegionInfo.RegionName);
2176// }
2177
2178
2179 // Tell the client that we're totally ready 2181 // Tell the client that we're totally ready
2180 ControllingClient.MoveAgentIntoRegion(m_scene.RegionInfo, AbsolutePosition, look); 2182 ControllingClient.MoveAgentIntoRegion(m_scene.RegionInfo, AbsolutePosition, look);
2181 //m_log.DebugFormat("[CompleteMovement] MoveAgentIntoRegion: {0}ms", Util.EnvironmentTickCountSubtract(ts)); 2183 //m_log.DebugFormat("[CompleteMovement] MoveAgentIntoRegion: {0}ms", Util.EnvironmentTickCountSubtract(ts));
@@ -2187,32 +2189,29 @@ namespace OpenSim.Region.Framework.Scenes
2187 2189
2188 int delayctnr = Util.EnvironmentTickCount(); 2190 int delayctnr = Util.EnvironmentTickCount();
2189 2191
2190 if (!IsChildAgent) 2192 if( ParentPart != null && !IsNPC && (crossingFlags & 0x08) != 0)
2191 { 2193 {
2192 if( ParentPart != null && !IsNPC && (crossingFlags & 0x08) != 0) 2194 ParentPart.ParentGroup.SendFullAnimUpdateToClient(ControllingClient);
2193 { 2195 }
2194 ParentPart.ParentGroup.SendFullAnimUpdateToClient(ControllingClient);
2195 }
2196 2196
2197 // verify baked textures and cache 2197 // verify baked textures and cache
2198 bool cachedbaked = false; 2198 bool cachedbaked = false;
2199 2199
2200 if (IsNPC) 2200 if (IsNPC)
2201 cachedbaked = true; 2201 cachedbaked = true;
2202 else 2202 else
2203 { 2203 {
2204 if (m_scene.AvatarFactory != null && !isHGTP) 2204 if (m_scene.AvatarFactory != null && !isHGTP)
2205 cachedbaked = m_scene.AvatarFactory.ValidateBakedTextureCache(this); 2205 cachedbaked = m_scene.AvatarFactory.ValidateBakedTextureCache(this);
2206 2206
2207 // not sure we need this 2207 // not sure we need this
2208 if (!cachedbaked) 2208 if (!cachedbaked)
2209 { 2209 {
2210 if (m_scene.AvatarFactory != null) 2210 if (m_scene.AvatarFactory != null)
2211 m_scene.AvatarFactory.QueueAppearanceSave(UUID); 2211 m_scene.AvatarFactory.QueueAppearanceSave(UUID);
2212 }
2213 } 2212 }
2214 //m_log.DebugFormat("[CompleteMovement] Baked check: {0}ms", Util.EnvironmentTickCountSubtract(ts));
2215 } 2213 }
2214 //m_log.DebugFormat("[CompleteMovement] Baked check: {0}ms", Util.EnvironmentTickCountSubtract(ts));
2216 2215
2217 if(m_teleportFlags > 0) 2216 if(m_teleportFlags > 0)
2218 { 2217 {
@@ -2251,104 +2250,103 @@ namespace OpenSim.Region.Framework.Scenes
2251 landch.sendClientInitialLandInfo(client, !gotCrossUpdate); 2250 landch.sendClientInitialLandInfo(client, !gotCrossUpdate);
2252 } 2251 }
2253 2252
2254 if (!IsChildAgent) 2253 List<ScenePresence> allpresences = m_scene.GetScenePresences();
2255 {
2256 List<ScenePresence> allpresences = m_scene.GetScenePresences();
2257 2254
2258 // send avatar object to all presences including us, so they cross it into region 2255 // send avatar object to all presences including us, so they cross it into region
2259 // then hide if necessary 2256 // then hide if necessary
2260 2257
2261 SendInitialAvatarDataToAllAgents(allpresences); 2258 SendInitialAvatarDataToAllAgents(allpresences);
2262 2259
2263 // send this look 2260 // send this look
2264 SendAppearanceToAgent(this); 2261 SendAppearanceToAgent(this);
2265 2262
2266 // send this animations 2263 // send this animations
2267 2264
2268 UUID[] animIDs = null; 2265 UUID[] animIDs = null;
2269 int[] animseqs = null; 2266 int[] animseqs = null;
2270 UUID[] animsobjs = null; 2267 UUID[] animsobjs = null;
2271 2268
2272 if (Animator != null) 2269 if (Animator != null)
2273 Animator.GetArrays(out animIDs, out animseqs, out animsobjs); 2270 Animator.GetArrays(out animIDs, out animseqs, out animsobjs);
2274 2271
2275 bool haveAnims = (animIDs != null && animseqs != null && animsobjs != null); 2272 bool haveAnims = (animIDs != null && animseqs != null && animsobjs != null);
2276 2273
2277 if (haveAnims) 2274 if (haveAnims)
2278 SendAnimPackToAgent(this, animIDs, animseqs, animsobjs); 2275 SendAnimPackToAgent(this, animIDs, animseqs, animsobjs);
2279 2276
2280 // we should be able to receive updates, etc 2277 // we should be able to receive updates, etc
2281 // so release them 2278 // so release them
2282 m_inTransit = false; 2279 m_inTransit = false;
2283 2280
2284 // send look and animations to others 2281 // send look and animations to others
2285 // if not cached we send greys 2282 // if not cached we send greys
2286 // uncomented if will wait till avatar does baking 2283 // uncomented if will wait till avatar does baking
2287 //if (cachedbaked) 2284 //if (cachedbaked)
2285 {
2286 foreach (ScenePresence p in allpresences)
2288 { 2287 {
2289 foreach (ScenePresence p in allpresences) 2288 if (p == this)
2290 { 2289 continue;
2291 if (p == this)
2292 continue;
2293 2290
2294 if (ParcelHideThisAvatar && currentParcelUUID != p.currentParcelUUID && !p.IsViewerUIGod) 2291 if (ParcelHideThisAvatar && currentParcelUUID != p.currentParcelUUID && !p.IsViewerUIGod)
2295 continue; 2292 continue;
2296 2293
2297 SendAppearanceToAgentNF(p); 2294 SendAppearanceToAgentNF(p);
2298 if (haveAnims) 2295 if (haveAnims)
2299 SendAnimPackToAgentNF(p, animIDs, animseqs, animsobjs); 2296 SendAnimPackToAgentNF(p, animIDs, animseqs, animsobjs);
2300 } 2297 }
2301 } // greys if 2298 } // greys if
2302 2299
2303 //m_log.DebugFormat("[CompleteMovement] ValidateAndSendAppearanceAndAgentData: {0}ms", Util.EnvironmentTickCountSubtract(ts)); 2300 //m_log.DebugFormat("[CompleteMovement] ValidateAndSendAppearanceAndAgentData: {0}ms", Util.EnvironmentTickCountSubtract(ts));
2304 2301
2305 // attachments 2302 // attachments
2306 if (IsNPC || IsRealLogin(m_teleportFlags)) 2303 if (IsNPC || IsRealLogin(m_teleportFlags))
2307 { 2304 {
2308 if (Scene.AttachmentsModule != null) 2305 if (Scene.AttachmentsModule != null)
2309 // Util.FireAndForget( 2306 // Util.FireAndForget(
2310 // o => 2307 // o =>
2311 // { 2308 // {
2312 2309
2313 if (!IsNPC) 2310 if (!IsNPC)
2311 Scene.AttachmentsModule.RezAttachments(this);
2312 else
2313 Util.FireAndForget(x =>
2314 {
2314 Scene.AttachmentsModule.RezAttachments(this); 2315 Scene.AttachmentsModule.RezAttachments(this);
2315 else 2316 });
2316 Util.FireAndForget(x =>
2317 {
2318 Scene.AttachmentsModule.RezAttachments(this);
2319 });
2320 2317
2321 // }); 2318 // });
2322 } 2319 }
2323 else 2320 else
2321 {
2322 if (m_attachments.Count > 0)
2324 { 2323 {
2325 if (m_attachments.Count > 0)
2326 {
2327// m_log.DebugFormat( 2324// m_log.DebugFormat(
2328// "[SCENE PRESENCE]: Restarting scripts in attachments for {0} in {1}", Name, Scene.Name); 2325// "[SCENE PRESENCE]: Restarting scripts in attachments for {0} in {1}", Name, Scene.Name);
2329 2326
2330 foreach (SceneObjectGroup sog in m_attachments) 2327 foreach (SceneObjectGroup sog in m_attachments)
2331 { 2328 {
2332 sog.RootPart.ParentGroup.CreateScriptInstances(0, false, m_scene.DefaultScriptEngine, GetStateSource()); 2329 sog.RootPart.ParentGroup.CreateScriptInstances(0, false, m_scene.DefaultScriptEngine, GetStateSource());
2333 sog.ResumeScripts(); 2330 sog.ResumeScripts();
2334 } 2331 }
2335 2332
2336 foreach (ScenePresence p in allpresences) 2333 foreach (ScenePresence p in allpresences)
2334 {
2335 if (p == this)
2337 { 2336 {
2338 if (p == this) 2337 SendAttachmentsToAgentNF(this);
2339 { 2338 continue;
2340 SendAttachmentsToAgentNF(this); 2339 }
2341 continue;
2342 }
2343 2340
2344 if (ParcelHideThisAvatar && currentParcelUUID != p.currentParcelUUID && !p.IsViewerUIGod) 2341 if (ParcelHideThisAvatar && currentParcelUUID != p.currentParcelUUID && !p.IsViewerUIGod)
2345 continue; 2342 continue;
2346 2343
2347 SendAttachmentsToAgentNF(p); 2344 SendAttachmentsToAgentNF(p);
2348 }
2349 } 2345 }
2350 } 2346 }
2351 2347 }
2348 if(!IsNPC)
2349 {
2352 //m_log.DebugFormat("[CompleteMovement] attachments: {0}ms", Util.EnvironmentTickCountSubtract(ts)); 2350 //m_log.DebugFormat("[CompleteMovement] attachments: {0}ms", Util.EnvironmentTickCountSubtract(ts));
2353 if (openChildAgents) 2351 if (openChildAgents)
2354 { 2352 {
@@ -2366,34 +2364,33 @@ namespace OpenSim.Region.Framework.Scenes
2366 2364
2367 m_lastChildAgentUpdateGodLevel = GodController.ViwerUIGodLevel; 2365 m_lastChildAgentUpdateGodLevel = GodController.ViwerUIGodLevel;
2368 m_childUpdatesBusy = false; // allow them 2366 m_childUpdatesBusy = false; // allow them
2369 }
2370 2367
2371 //m_log.DebugFormat("[CompleteMovement] openChildAgents: {0}ms", Util.EnvironmentTickCountSubtract(ts)); 2368 //m_log.DebugFormat("[CompleteMovement] openChildAgents: {0}ms", Util.EnvironmentTickCountSubtract(ts));
2372 2369
2373 // send the rest of the world 2370 // send the rest of the world
2374 if (m_teleportFlags > 0 && !IsNPC || m_currentParcelHide) 2371 if (m_teleportFlags > 0 | m_currentParcelHide)
2375 SendInitialDataToMe(); 2372 SendInitialDataToMe();
2376 2373
2377 // priority uses avatar position only 2374 // priority uses avatar position only
2378// m_reprioritizationLastPosition = AbsolutePosition; 2375 // m_reprioritizationLastPosition = AbsolutePosition;
2379// m_reprioritizationLastDrawDistance = DrawDistance; 2376 // m_reprioritizationLastDrawDistance = DrawDistance;
2380// m_reprioritizationLastTime = Util.EnvironmentTickCount() + 15000; // delay it 2377 // m_reprioritizationLastTime = Util.EnvironmentTickCount() + 15000; // delay it
2381// m_reprioritizationBusy = false; 2378 // m_reprioritizationBusy = false;
2382 2379
2383 //m_log.DebugFormat("[CompleteMovement] SendInitialDataToMe: {0}ms", Util.EnvironmentTickCountSubtract(ts)); 2380 //m_log.DebugFormat("[CompleteMovement] SendInitialDataToMe: {0}ms", Util.EnvironmentTickCountSubtract(ts));
2384 2381
2385 if (!IsChildAgent && openChildAgents) 2382 if (openChildAgents)
2386 {
2387 IFriendsModule friendsModule = m_scene.RequestModuleInterface<IFriendsModule>();
2388 if (friendsModule != null)
2389 { 2383 {
2390 if(gotCrossUpdate) 2384 IFriendsModule friendsModule = m_scene.RequestModuleInterface<IFriendsModule>();
2391 friendsModule.IsNowRoot(this); 2385 if (friendsModule != null)
2392 else 2386 {
2393 friendsModule.SendFriendsOnlineIfNeeded(ControllingClient); 2387 if(gotCrossUpdate)
2388 friendsModule.IsNowRoot(this);
2389 else
2390 friendsModule.SendFriendsOnlineIfNeeded(ControllingClient);
2391 }
2392 //m_log.DebugFormat("[CompleteMovement] friendsModule: {0}ms", Util.EnvironmentTickCountSubtract(ts));
2394 } 2393 }
2395 //m_log.DebugFormat("[CompleteMovement] friendsModule: {0}ms", Util.EnvironmentTickCountSubtract(ts));
2396
2397 } 2394 }
2398 } 2395 }
2399 finally 2396 finally
@@ -4024,10 +4021,100 @@ namespace OpenSim.Region.Framework.Scenes
4024 ControllingClient.SendCoarseLocationUpdate(avatarUUIDs, coarseLocations); 4021 ControllingClient.SendCoarseLocationUpdate(avatarUUIDs, coarseLocations);
4025 } 4022 }
4026 4023
4024
4025 public void RegionHandShakeReply (IClientAPI client, uint flags)
4026 {
4027 if(IsNPC)
4028 return;
4029
4030 bool selfappearance = (flags & 4) != 0;
4031 bool cacheCulling = (flags & 1) != 0;
4032 bool cacheEmpty;
4033 if(cacheCulling)
4034 cacheEmpty = (flags & 2) != 0;
4035 else
4036 cacheEmpty = true;
4037
4038 if (m_teleportFlags > 0) // only doing for child for now
4039 return;
4040
4041 lock (m_completeMovementLock)
4042 {
4043 if (SentInitialData)
4044 return;
4045 SentInitialData = true;
4046 }
4047
4048 Util.FireAndForget(delegate
4049 {
4050 Scene.SendLayerData(ControllingClient);
4051
4052 ILandChannel landch = m_scene.LandChannel;
4053 if (landch != null)
4054 landch.sendClientInitialLandInfo(ControllingClient, true);
4055
4056 // recheck to reduce timing issues
4057 ControllingClient.CheckViewerCaps();
4058
4059 SendOtherAgentsAvatarFullToMe();
4060 /*
4061 if (m_scene.ObjectsCullingByDistance && cacheCulling)
4062 {
4063 m_reprioritizationBusy = true;
4064 m_reprioritizationLastPosition = AbsolutePosition;
4065 m_reprioritizationLastDrawDistance = DrawDistance;
4066
4067 ControllingClient.ReprioritizeUpdates();
4068 m_reprioritizationLastTime = Util.EnvironmentTickCount();
4069 m_reprioritizationBusy = false;
4070 return;
4071 }
4072 */
4073
4074 EntityBase[] entities = Scene.Entities.GetEntities();
4075 if(cacheEmpty)
4076 {
4077 foreach (EntityBase e in entities)
4078 {
4079 if (e != null && e is SceneObjectGroup && !((SceneObjectGroup)e).IsAttachment)
4080 ((SceneObjectGroup)e).SendFullAnimUpdateToClient(ControllingClient);
4081 }
4082 }
4083 else
4084 {
4085 foreach (EntityBase e in entities)
4086 {
4087 if (e != null && e is SceneObjectGroup && !((SceneObjectGroup)e).IsAttachment)
4088 {
4089 SceneObjectGroup grp = e as SceneObjectGroup;
4090 if(grp.IsViewerCachable)
4091 grp.SendUpdateProbes(ControllingClient);
4092 else
4093 grp.SendFullAnimUpdateToClient(ControllingClient);
4094 }
4095 }
4096 }
4097
4098 m_reprioritizationLastPosition = AbsolutePosition;
4099 m_reprioritizationLastDrawDistance = DrawDistance;
4100 m_reprioritizationLastTime = Util.EnvironmentTickCount() + 15000; // delay it
4101
4102 m_reprioritizationBusy = false;
4103
4104 });
4105
4106 }
4107
4027 public void SendInitialDataToMe() 4108 public void SendInitialDataToMe()
4028 { 4109 {
4029 // Send all scene object to the new client 4110 // Send all scene object to the new client
4030 SentInitialData = true; 4111 lock (m_completeMovementLock)
4112 {
4113 if (SentInitialData)
4114 return;
4115 SentInitialData = true;
4116 }
4117
4031 Util.FireAndForget(delegate 4118 Util.FireAndForget(delegate
4032 { 4119 {
4033 // we created a new ScenePresence (a new child agent) in a fresh region. 4120 // we created a new ScenePresence (a new child agent) in a fresh region.
@@ -4280,7 +4367,13 @@ namespace OpenSim.Region.Framework.Scenes
4280 if(IsDeleted || !ControllingClient.IsActive) 4367 if(IsDeleted || !ControllingClient.IsActive)
4281 return; 4368 return;
4282 4369
4283 if(!SentInitialData) 4370 bool needsendinitial = false;
4371 lock(m_completeMovementLock)
4372 {
4373 needsendinitial = SentInitialData;
4374 }
4375
4376 if(!needsendinitial)
4284 { 4377 {
4285 SendInitialDataToMe(); 4378 SendInitialDataToMe();
4286 return; 4379 return;
diff --git a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs
index 59ce05a..80baf82 100644
--- a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs
+++ b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs
@@ -699,7 +699,7 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server
699 public event TeleportCancel OnTeleportCancel; 699 public event TeleportCancel OnTeleportCancel;
700 public event DeRezObject OnDeRezObject; 700 public event DeRezObject OnDeRezObject;
701 public event RezRestoreToWorld OnRezRestoreToWorld; 701 public event RezRestoreToWorld OnRezRestoreToWorld;
702 public event Action<IClientAPI> OnRegionHandShakeReply; 702 public event Action<IClientAPI, uint> OnRegionHandShakeReply;
703 public event GenericCall1 OnRequestWearables; 703 public event GenericCall1 OnRequestWearables;
704 public event Action<IClientAPI, bool> OnCompleteMovementToRegion; 704 public event Action<IClientAPI, bool> OnCompleteMovementToRegion;
705 public event UpdateAgent OnPreAgentUpdate; 705 public event UpdateAgent OnPreAgentUpdate;
@@ -938,7 +938,7 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server
938 938
939 if (OnRegionHandShakeReply != null) 939 if (OnRegionHandShakeReply != null)
940 { 940 {
941 OnRegionHandShakeReply(this); 941 OnRegionHandShakeReply(this, 0);
942 } 942 }
943 943
944 if (OnCompleteMovementToRegion != null) 944 if (OnCompleteMovementToRegion != null)
diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs
index 09f2a58..a7ed7d1 100644
--- a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs
+++ b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs
@@ -319,7 +319,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC
319 319
320 public event DeRezObject OnDeRezObject; 320 public event DeRezObject OnDeRezObject;
321 public event RezRestoreToWorld OnRezRestoreToWorld; 321 public event RezRestoreToWorld OnRezRestoreToWorld;
322 public event Action<IClientAPI> OnRegionHandShakeReply; 322 public event Action<IClientAPI, uint> OnRegionHandShakeReply;
323 public event GenericCall1 OnRequestWearables; 323 public event GenericCall1 OnRequestWearables;
324 public event Action<IClientAPI, bool> OnCompleteMovementToRegion; 324 public event Action<IClientAPI, bool> OnCompleteMovementToRegion;
325 public event UpdateAgent OnPreAgentUpdate; 325 public event UpdateAgent OnPreAgentUpdate;
@@ -928,7 +928,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC
928 { 928 {
929 if (OnRegionHandShakeReply != null) 929 if (OnRegionHandShakeReply != null)
930 { 930 {
931 OnRegionHandShakeReply(this); 931 OnRegionHandShakeReply(this, 0);
932 } 932 }
933 } 933 }
934 934