aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Framework/Scenes/ScenePresence.cs
diff options
context:
space:
mode:
authorUbitUmarov2014-07-31 03:10:50 +0100
committerUbitUmarov2014-07-31 03:10:50 +0100
commita5e9429f2bb2276486cc2f1ed2249e14fba90d6a (patch)
tree30373d517c5adbea792afb993d8a99546022b26b /OpenSim/Region/Framework/Scenes/ScenePresence.cs
parentmake HandlerRegionHandshakeReply processing async and delay it a bit. This (diff)
downloadopensim-SC-a5e9429f2bb2276486cc2f1ed2249e14fba90d6a.zip
opensim-SC-a5e9429f2bb2276486cc2f1ed2249e14fba90d6a.tar.gz
opensim-SC-a5e9429f2bb2276486cc2f1ed2249e14fba90d6a.tar.bz2
opensim-SC-a5e9429f2bb2276486cc2f1ed2249e14fba90d6a.tar.xz
MESS: changes in MakeRootAgent and CompleteMovement reordering things.
Added sending of land overlay and parcel information. This in order to only send avatar related information after having its position well defined and on the right parcel. THIS MAY STILL BE BAD :)
Diffstat (limited to 'OpenSim/Region/Framework/Scenes/ScenePresence.cs')
-rw-r--r--OpenSim/Region/Framework/Scenes/ScenePresence.cs143
1 files changed, 118 insertions, 25 deletions
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 6b627be..5775747 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -140,8 +140,67 @@ namespace OpenSim.Region.Framework.Scenes
140 /// </summary> 140 /// </summary>
141 public static readonly float SIGNIFICANT_MOVEMENT = 2.0f; 141 public static readonly float SIGNIFICANT_MOVEMENT = 2.0f;
142 142
143 public UUID currentParcelUUID = UUID.Zero; 143 private UUID m_currentParcelUUID = UUID.Zero;
144 private object parcelLock = new Object();
144 145
146 public UUID currentParcelUUID
147 {
148 get { return m_currentParcelUUID; }
149 set
150 {
151 lock (parcelLock)
152 {
153 m_currentParcelUUID = value;
154 }
155 }
156 }
157
158 public bool ParcelAllowThisAvatarSounds
159 {
160 get
161 {
162 try
163 {
164 lock (parcelLock)
165 {
166 ILandObject land = m_scene.LandChannel.GetLandObject(AbsolutePosition.X, AbsolutePosition.Y);
167 if (land == null)
168 return true;
169 if (land.LandData.AnyAVSounds)
170 return true;
171 if (!land.LandData.GroupAVSounds)
172 return false;
173 return land.LandData.GroupID == ControllingClient.ActiveGroupId;
174 }
175 }
176 catch
177 {
178 return true;
179 }
180 }
181 }
182
183 public bool ParcelHideThisAvatar
184 {
185 get
186 {
187 try
188 {
189 lock (parcelLock)
190 {
191 ILandObject land = m_scene.LandChannel.GetLandObject(AbsolutePosition.X, AbsolutePosition.Y);
192 if (land == null || !land.LandData.SeeAVs)
193 return false;
194 return true;
195 }
196 }
197 catch
198 {
199 return false;
200 }
201 }
202 }
203
145 /// <value> 204 /// <value>
146 /// The animator for this avatar 205 /// The animator for this avatar
147 /// </value> 206 /// </value>
@@ -482,21 +541,7 @@ namespace OpenSim.Region.Framework.Scenes
482 } 541 }
483 } 542 }
484 543
485 public bool ParcelAllowThisAvatarSounds
486 {
487 get
488 {
489 ILandObject land = m_scene.LandChannel.GetLandObject(AbsolutePosition.X, AbsolutePosition.Y);
490 if (land == null)
491 return true;
492 544
493 if (land.LandData.AnyAVSounds)
494 return true;
495 if (!land.LandData.GroupAVSounds)
496 return false;
497 return land.LandData.GroupID == ControllingClient.ActiveGroupId;
498 }
499 }
500 545
501 public byte State { get; set; } 546 public byte State { get; set; }
502 547
@@ -1023,6 +1068,9 @@ namespace OpenSim.Region.Framework.Scenes
1023 /// This method is on the critical path for transferring an avatar from one region to another. Delay here 1068 /// This method is on the critical path for transferring an avatar from one region to another. Delay here
1024 /// delays that crossing. 1069 /// delays that crossing.
1025 /// </remarks> 1070 /// </remarks>
1071
1072
1073 // only in use as part of completemovement
1026 private bool MakeRootAgent(Vector3 pos, bool isFlying) 1074 private bool MakeRootAgent(Vector3 pos, bool isFlying)
1027 { 1075 {
1028 lock (m_completeMovementLock) 1076 lock (m_completeMovementLock)
@@ -1229,6 +1277,7 @@ namespace OpenSim.Region.Framework.Scenes
1229 // 1277 //
1230 // One cannot simply iterate over attachments in a fire and forget thread because this would no longer 1278 // One cannot simply iterate over attachments in a fire and forget thread because this would no longer
1231 // be locked, allowing race conditions if other code changes the attachments list. 1279 // be locked, allowing race conditions if other code changes the attachments list.
1280
1232 List<SceneObjectGroup> attachments = GetAttachments(); 1281 List<SceneObjectGroup> attachments = GetAttachments();
1233 1282
1234 if (attachments.Count > 0) 1283 if (attachments.Count > 0)
@@ -1236,16 +1285,19 @@ namespace OpenSim.Region.Framework.Scenes
1236 m_log.DebugFormat( 1285 m_log.DebugFormat(
1237 "[SCENE PRESENCE]: Restarting scripts in attachments for {0} in {1}", Name, Scene.Name); 1286 "[SCENE PRESENCE]: Restarting scripts in attachments for {0} in {1}", Name, Scene.Name);
1238 1287
1239 // Resume scripts 1288 // Resume scripts this possible should also be moved down after sending the avatar to viewer ?
1240 foreach (SceneObjectGroup sog in attachments) 1289 foreach (SceneObjectGroup sog in attachments)
1241 { 1290 {
1242 sog.ScheduleGroupForFullUpdate(); 1291// sending attachments before the avatar ?
1292// moved to completemovement where it already was
1293// sog.ScheduleGroupForFullUpdate();
1243 sog.RootPart.ParentGroup.CreateScriptInstances(0, false, m_scene.DefaultScriptEngine, GetStateSource()); 1294 sog.RootPart.ParentGroup.CreateScriptInstances(0, false, m_scene.DefaultScriptEngine, GetStateSource());
1244 sog.ResumeScripts(); 1295 sog.ResumeScripts();
1245 } 1296 }
1246 } 1297 }
1247 } 1298 }
1248 1299
1300/*
1249 SendAvatarDataToAllAgents(); 1301 SendAvatarDataToAllAgents();
1250 1302
1251 // send the animations of the other presences to me 1303 // send the animations of the other presences to me
@@ -1254,6 +1306,7 @@ namespace OpenSim.Region.Framework.Scenes
1254 if (presence != this) 1306 if (presence != this)
1255 presence.Animator.SendAnimPackToClient(ControllingClient); 1307 presence.Animator.SendAnimPackToClient(ControllingClient);
1256 }); 1308 });
1309*/
1257 1310
1258 // If we don't reset the movement flag here, an avatar that crosses to a neighbouring sim and returns will 1311 // If we don't reset the movement flag here, an avatar that crosses to a neighbouring sim and returns will
1259 // stall on the border crossing since the existing child agent will still have the last movement 1312 // stall on the border crossing since the existing child agent will still have the last movement
@@ -1421,6 +1474,9 @@ namespace OpenSim.Region.Framework.Scenes
1421 1474
1422 public void StopFlying() 1475 public void StopFlying()
1423 { 1476 {
1477 if (IsInTransit)
1478 return;
1479
1424 Vector3 pos = AbsolutePosition; 1480 Vector3 pos = AbsolutePosition;
1425 if (Appearance.AvatarHeight != 127.0f) 1481 if (Appearance.AvatarHeight != 127.0f)
1426 pos += new Vector3(0f, 0f, (Appearance.AvatarHeight / 6f)); 1482 pos += new Vector3(0f, 0f, (Appearance.AvatarHeight / 6f));
@@ -1661,9 +1717,7 @@ namespace OpenSim.Region.Framework.Scenes
1661 m_log.InfoFormat( 1717 m_log.InfoFormat(
1662 "[SCENE PRESENCE]: Completing movement of {0} into region {1} in position {2}", 1718 "[SCENE PRESENCE]: Completing movement of {0} into region {1} in position {2}",
1663 client.Name, Scene.Name, AbsolutePosition); 1719 client.Name, Scene.Name, AbsolutePosition);
1664 1720
1665
1666
1667 m_inTransit = true; 1721 m_inTransit = true;
1668 try 1722 try
1669 { 1723 {
@@ -1709,8 +1763,9 @@ namespace OpenSim.Region.Framework.Scenes
1709 ControllingClient.MoveAgentIntoRegion(m_scene.RegionInfo, AbsolutePosition, look); 1763 ControllingClient.MoveAgentIntoRegion(m_scene.RegionInfo, AbsolutePosition, look);
1710 1764
1711 // Remember in HandleUseCircuitCode, we delayed this to here 1765 // Remember in HandleUseCircuitCode, we delayed this to here
1712 if (m_teleportFlags > 0) 1766// this prims etc, moved down
1713 SendInitialDataToMe(); 1767// if (m_teleportFlags > 0)
1768// SendInitialDataToMe();
1714 1769
1715 // m_log.DebugFormat("[SCENE PRESENCE] Completed movement"); 1770 // m_log.DebugFormat("[SCENE PRESENCE] Completed movement");
1716 1771
@@ -1742,6 +1797,20 @@ namespace OpenSim.Region.Framework.Scenes
1742 // client.Name, client.AgentId, m_scene.RegionInfo.RegionName); 1797 // client.Name, client.AgentId, m_scene.RegionInfo.RegionName);
1743 // } 1798 // }
1744 1799
1800 // send initial land overlay and parcel
1801 if (!IsChildAgent)
1802 {
1803 ILandChannel landch = m_scene.LandChannel;
1804 if (landch != null)
1805 {
1806 landch.sendClientInitialLandInfo(client);
1807 }
1808 }
1809
1810 // send agentData to all clients including us (?)
1811 // get appearance
1812 // if in cache sent it to all clients
1813 // send what we have to us, even if not in cache ( bad? )
1745 ValidateAndSendAppearanceAndAgentData(); 1814 ValidateAndSendAppearanceAndAgentData();
1746 1815
1747 // Create child agents in neighbouring regions 1816 // Create child agents in neighbouring regions
@@ -1750,11 +1819,11 @@ namespace OpenSim.Region.Framework.Scenes
1750 IEntityTransferModule m_agentTransfer = m_scene.RequestModuleInterface<IEntityTransferModule>(); 1819 IEntityTransferModule m_agentTransfer = m_scene.RequestModuleInterface<IEntityTransferModule>();
1751 if (m_agentTransfer != null) 1820 if (m_agentTransfer != null)
1752 m_agentTransfer.EnableChildAgents(this); 1821 m_agentTransfer.EnableChildAgents(this);
1753 1822/* moved down
1754 IFriendsModule friendsModule = m_scene.RequestModuleInterface<IFriendsModule>(); 1823 IFriendsModule friendsModule = m_scene.RequestModuleInterface<IFriendsModule>();
1755 if (friendsModule != null) 1824 if (friendsModule != null)
1756 friendsModule.SendFriendsOnlineIfNeeded(ControllingClient); 1825 friendsModule.SendFriendsOnlineIfNeeded(ControllingClient);
1757 1826*/
1758 } 1827 }
1759 1828
1760 // XXX: If we force an update here, then multiple attachments do appear correctly on a destination region 1829 // XXX: If we force an update here, then multiple attachments do appear correctly on a destination region
@@ -1769,6 +1838,27 @@ namespace OpenSim.Region.Framework.Scenes
1769 // m_log.DebugFormat( 1838 // m_log.DebugFormat(
1770 // "[SCENE PRESENCE]: Completing movement of {0} into region {1} took {2}ms", 1839 // "[SCENE PRESENCE]: Completing movement of {0} into region {1} took {2}ms",
1771 // client.Name, Scene.RegionInfo.RegionName, (DateTime.Now - startTime).Milliseconds); 1840 // client.Name, Scene.RegionInfo.RegionName, (DateTime.Now - startTime).Milliseconds);
1841
1842 // send the rest of the world
1843 if (m_teleportFlags > 0)
1844 SendInitialDataToMe();
1845
1846 if (!IsChildAgent)
1847 {
1848// moved from makeroot missing in sendInitialDataToMe ?
1849 m_scene.ForEachRootScenePresence(delegate(ScenePresence presence)
1850 {
1851 if (presence != this)
1852 presence.Animator.SendAnimPackToClient(ControllingClient);
1853 });
1854
1855 if (openChildAgents)
1856 {
1857 IFriendsModule friendsModule = m_scene.RequestModuleInterface<IFriendsModule>();
1858 if (friendsModule != null)
1859 friendsModule.SendFriendsOnlineIfNeeded(ControllingClient);
1860 }
1861 }
1772 } 1862 }
1773 finally 1863 finally
1774 { 1864 {
@@ -1864,6 +1954,9 @@ namespace OpenSim.Region.Framework.Scenes
1864 return; 1954 return;
1865 } 1955 }
1866 1956
1957 if (IsInTransit)
1958 return;
1959
1867 #region Sanity Checking 1960 #region Sanity Checking
1868 1961
1869 // This is irritating. Really. 1962 // This is irritating. Really.
@@ -3307,13 +3400,13 @@ namespace OpenSim.Region.Framework.Scenes
3307 SendAvatarDataToAllAgents(); 3400 SendAvatarDataToAllAgents();
3308 3401
3309 // This invocation always shows up in the viewer logs as an error. Is it needed? 3402 // This invocation always shows up in the viewer logs as an error. Is it needed?
3403 // try to send what we have even if not in cache
3310 SendAppearanceToAgent(this); 3404 SendAppearanceToAgent(this);
3311 3405
3312 // If we are using the the cached appearance then send it out to everyone 3406 // If we are using the the cached appearance then send it out to everyone
3313 if (cachedappearance) 3407 if (cachedappearance)
3314 { 3408 {
3315 m_log.DebugFormat("[SCENE PRESENCE]: Baked textures are in the cache for {0} in {1}", Name, m_scene.Name); 3409 m_log.DebugFormat("[SCENE PRESENCE]: Baked textures are in the cache for {0} in {1}", Name, m_scene.Name);
3316
3317 // If the avatars baked textures are all in the cache, then we have a 3410 // If the avatars baked textures are all in the cache, then we have a
3318 // complete appearance... send it out, if not, then we'll send it when 3411 // complete appearance... send it out, if not, then we'll send it when
3319 // the avatar finishes updating its appearance 3412 // the avatar finishes updating its appearance