diff options
Diffstat (limited to 'OpenSim/Region')
12 files changed, 116 insertions, 59 deletions
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs index 4aa19d1..8d85d1a 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs | |||
@@ -651,8 +651,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
651 | catch (Exception e) | 651 | catch (Exception e) |
652 | { | 652 | { |
653 | // Make sure that we see any exception caused by the asynchronous operation. | 653 | // Make sure that we see any exception caused by the asynchronous operation. |
654 | m_log.Error( | 654 | m_log.ErrorFormat( |
655 | string.Format("[LLCLIENTVIEW]: Caught exception while processing {0}", packetObject.Pack), e); | 655 | "[LLCLIENTVIEW]: Caught exception while processing {0} for {1}, {2} {3}", |
656 | packetObject.Pack, Name, e.Message, e.StackTrace); | ||
656 | } | 657 | } |
657 | } | 658 | } |
658 | 659 | ||
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs index 45bede3..dcfe615 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs | |||
@@ -615,7 +615,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
615 | 615 | ||
616 | // UseCircuitCode handling | 616 | // UseCircuitCode handling |
617 | if (packet.Type == PacketType.UseCircuitCode) | 617 | if (packet.Type == PacketType.UseCircuitCode) |
618 | { | 618 | { |
619 | object[] array = new object[] { buffer, packet }; | 619 | object[] array = new object[] { buffer, packet }; |
620 | 620 | ||
621 | if (m_asyncPacketHandling) | 621 | if (m_asyncPacketHandling) |
@@ -843,7 +843,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
843 | 843 | ||
844 | m_log.DebugFormat( | 844 | m_log.DebugFormat( |
845 | "[LLUDPSERVER]: Handling UseCircuitCode request from {0} took {1}ms", | 845 | "[LLUDPSERVER]: Handling UseCircuitCode request from {0} took {1}ms", |
846 | buffer.RemoteEndPoint, (DateTime.Now - startTime).Milliseconds); | 846 | buffer.RemoteEndPoint, (DateTime.Now - startTime).Milliseconds); |
847 | } | 847 | } |
848 | 848 | ||
849 | private void SendAckImmediate(IPEndPoint remoteEndpoint, uint sequenceNumber) | 849 | private void SendAckImmediate(IPEndPoint remoteEndpoint, uint sequenceNumber) |
diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs index e89368a..348b8b9 100644 --- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs | |||
@@ -178,12 +178,16 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
178 | UUID itemID = UUID.Zero; | 178 | UUID itemID = UUID.Zero; |
179 | if (sp != null) | 179 | if (sp != null) |
180 | { | 180 | { |
181 | foreach (SceneObjectGroup grp in sp.GetAttachments(AttachmentPt)) | 181 | foreach (SceneObjectGroup grp in sp.Attachments) |
182 | { | 182 | { |
183 | itemID = grp.GetFromItemID(); | 183 | if (grp.GetAttachmentPoint() == (byte)AttachmentPt) |
184 | if (itemID != UUID.Zero) | 184 | { |
185 | DetachSingleAttachmentToInv(itemID, remoteClient); | 185 | itemID = grp.GetFromItemID(); |
186 | break; | ||
187 | } | ||
186 | } | 188 | } |
189 | if (itemID != UUID.Zero) | ||
190 | DetachSingleAttachmentToInv(itemID, remoteClient); | ||
187 | } | 191 | } |
188 | 192 | ||
189 | if (group.GetFromItemID() == UUID.Zero) | 193 | if (group.GetFromItemID() == UUID.Zero) |
diff --git a/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs b/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs index 7f482cb..2dd444d 100644 --- a/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs | |||
@@ -61,7 +61,7 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory | |||
61 | { | 61 | { |
62 | scene.RegisterModuleInterface<IAvatarFactory>(this); | 62 | scene.RegisterModuleInterface<IAvatarFactory>(this); |
63 | scene.EventManager.OnNewClient += NewClient; | 63 | scene.EventManager.OnNewClient += NewClient; |
64 | 64 | ||
65 | if (config != null) | 65 | if (config != null) |
66 | { | 66 | { |
67 | IConfig sconfig = config.Configs["Startup"]; | 67 | IConfig sconfig = config.Configs["Startup"]; |
@@ -138,7 +138,6 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory | |||
138 | 138 | ||
139 | return cached; | 139 | return cached; |
140 | } | 140 | } |
141 | |||
142 | 141 | ||
143 | /// <summary> | 142 | /// <summary> |
144 | /// Set appearance data (textureentry and slider settings) received from the client | 143 | /// Set appearance data (textureentry and slider settings) received from the client |
@@ -155,9 +154,9 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory | |||
155 | m_log.WarnFormat("[AVATAR FACTORY MODULE]: SetAppearance unable to find presence for {0}",client.AgentId); | 154 | m_log.WarnFormat("[AVATAR FACTORY MODULE]: SetAppearance unable to find presence for {0}",client.AgentId); |
156 | return; | 155 | return; |
157 | } | 156 | } |
158 | 157 | ||
159 | bool changed = false; | 158 | bool changed = false; |
160 | 159 | ||
161 | // Process the texture entry | 160 | // Process the texture entry |
162 | if (textureEntry != null) | 161 | if (textureEntry != null) |
163 | { | 162 | { |
@@ -174,7 +173,7 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory | |||
174 | }); | 173 | }); |
175 | } | 174 | } |
176 | } | 175 | } |
177 | 176 | ||
178 | // Process the visual params, this may change height as well | 177 | // Process the visual params, this may change height as well |
179 | if (visualParams != null) | 178 | if (visualParams != null) |
180 | { | 179 | { |
@@ -185,14 +184,14 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory | |||
185 | sp.SetHeight(sp.Appearance.AvatarHeight); | 184 | sp.SetHeight(sp.Appearance.AvatarHeight); |
186 | } | 185 | } |
187 | } | 186 | } |
188 | 187 | ||
189 | // If something changed in the appearance then queue an appearance save | 188 | // If something changed in the appearance then queue an appearance save |
190 | if (changed) | 189 | if (changed) |
191 | QueueAppearanceSave(client.AgentId); | 190 | QueueAppearanceSave(client.AgentId); |
192 | 191 | ||
193 | // And always queue up an appearance update to send out | 192 | // And always queue up an appearance update to send out |
194 | QueueAppearanceSend(client.AgentId); | 193 | QueueAppearanceSend(client.AgentId); |
195 | 194 | ||
196 | // Send the appearance back to the avatar | 195 | // Send the appearance back to the avatar |
197 | // AvatarAppearance avp = sp.Appearance; | 196 | // AvatarAppearance avp = sp.Appearance; |
198 | // sp.ControllingClient.SendAvatarDataImmediate(sp); | 197 | // sp.ControllingClient.SendAvatarDataImmediate(sp); |
@@ -216,35 +215,35 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory | |||
216 | } | 215 | } |
217 | return true; | 216 | return true; |
218 | } | 217 | } |
219 | 218 | ||
220 | #region UpdateAppearanceTimer | 219 | #region UpdateAppearanceTimer |
221 | 220 | ||
222 | public void QueueAppearanceSend(UUID agentid) | 221 | public void QueueAppearanceSend(UUID agentid) |
223 | { | 222 | { |
224 | // m_log.WarnFormat("[AVATAR FACTORY MODULE]: Queue appearance send for {0}",agentid); | 223 | // m_log.WarnFormat("[AVATAR FACTORY MODULE]: Queue appearance send for {0}", agentid); |
225 | 224 | ||
226 | // 100 nanoseconds (ticks) we should wait | 225 | // 100 nanoseconds (ticks) we should wait |
227 | long timestamp = DateTime.Now.Ticks + Convert.ToInt64(m_sendtime * 10000000); | 226 | long timestamp = DateTime.Now.Ticks + Convert.ToInt64(m_sendtime * 10000000); |
228 | lock (m_sendqueue) | 227 | lock (m_sendqueue) |
229 | { | 228 | { |
230 | m_sendqueue[agentid] = timestamp; | 229 | m_sendqueue[agentid] = timestamp; |
231 | m_updateTimer.Start(); | 230 | m_updateTimer.Start(); |
232 | } | 231 | } |
233 | } | 232 | } |
234 | 233 | ||
235 | public void QueueAppearanceSave(UUID agentid) | 234 | public void QueueAppearanceSave(UUID agentid) |
236 | { | 235 | { |
237 | // m_log.WarnFormat("[AVATAR FACTORY MODULE]: Queue appearance save for {0}",agentid); | 236 | // m_log.WarnFormat("[AVATAR FACTORY MODULE]: Queue appearance save for {0}", agentid); |
238 | 237 | ||
239 | // 100 nanoseconds (ticks) we should wait | 238 | // 100 nanoseconds (ticks) we should wait |
240 | long timestamp = DateTime.Now.Ticks + Convert.ToInt64(m_savetime * 10000000); | 239 | long timestamp = DateTime.Now.Ticks + Convert.ToInt64(m_savetime * 10000000); |
241 | lock (m_savequeue) | 240 | lock (m_savequeue) |
242 | { | 241 | { |
243 | m_savequeue[agentid] = timestamp; | 242 | m_savequeue[agentid] = timestamp; |
244 | m_updateTimer.Start(); | 243 | m_updateTimer.Start(); |
245 | } | 244 | } |
246 | } | 245 | } |
247 | 246 | ||
248 | private void HandleAppearanceSend(UUID agentid) | 247 | private void HandleAppearanceSend(UUID agentid) |
249 | { | 248 | { |
250 | ScenePresence sp = m_scene.GetScenePresence(agentid); | 249 | ScenePresence sp = m_scene.GetScenePresence(agentid); |
@@ -254,7 +253,7 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory | |||
254 | return; | 253 | return; |
255 | } | 254 | } |
256 | 255 | ||
257 | // m_log.WarnFormat("[AVATAR FACTORY MODULE]: Handle appearance send for {0}", agentid); | 256 | // m_log.WarnFormat("[AVATAR FACTORY MODULE]: Handle appearance send for {0}", agentid); |
258 | 257 | ||
259 | // Send the appearance to everyone in the scene | 258 | // Send the appearance to everyone in the scene |
260 | sp.SendAppearanceToAllOtherAgents(); | 259 | sp.SendAppearanceToAllOtherAgents(); |
@@ -262,7 +261,7 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory | |||
262 | 261 | ||
263 | // Send the appearance back to the avatar | 262 | // Send the appearance back to the avatar |
264 | // AvatarAppearance avp = sp.Appearance; | 263 | // AvatarAppearance avp = sp.Appearance; |
265 | // sp.ControllingClient.SendAppearance(avp.Owner,avp.VisualParams,avp.Texture.GetBytes()); | 264 | // sp.ControllingClient.SendAppearance(avp.Owner, avp.VisualParams, avp.Texture.GetBytes()); |
266 | 265 | ||
267 | /* | 266 | /* |
268 | // this needs to be fixed, the flag should be on scene presence not the region module | 267 | // this needs to be fixed, the flag should be on scene presence not the region module |
@@ -290,11 +289,11 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory | |||
290 | private void HandleAppearanceUpdateTimer(object sender, EventArgs ea) | 289 | private void HandleAppearanceUpdateTimer(object sender, EventArgs ea) |
291 | { | 290 | { |
292 | long now = DateTime.Now.Ticks; | 291 | long now = DateTime.Now.Ticks; |
293 | 292 | ||
294 | lock (m_sendqueue) | 293 | lock (m_sendqueue) |
295 | { | 294 | { |
296 | Dictionary<UUID,long> sends = new Dictionary<UUID,long>(m_sendqueue); | 295 | Dictionary<UUID, long> sends = new Dictionary<UUID, long>(m_sendqueue); |
297 | foreach (KeyValuePair<UUID,long> kvp in sends) | 296 | foreach (KeyValuePair<UUID, long> kvp in sends) |
298 | { | 297 | { |
299 | if (kvp.Value < now) | 298 | if (kvp.Value < now) |
300 | { | 299 | { |
@@ -306,8 +305,8 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory | |||
306 | 305 | ||
307 | lock (m_savequeue) | 306 | lock (m_savequeue) |
308 | { | 307 | { |
309 | Dictionary<UUID,long> saves = new Dictionary<UUID,long>(m_savequeue); | 308 | Dictionary<UUID, long> saves = new Dictionary<UUID, long>(m_savequeue); |
310 | foreach (KeyValuePair<UUID,long> kvp in saves) | 309 | foreach (KeyValuePair<UUID, long> kvp in saves) |
311 | { | 310 | { |
312 | if (kvp.Value < now) | 311 | if (kvp.Value < now) |
313 | { | 312 | { |
@@ -320,7 +319,7 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory | |||
320 | if (m_savequeue.Count == 0 && m_sendqueue.Count == 0) | 319 | if (m_savequeue.Count == 0 && m_sendqueue.Count == 0) |
321 | m_updateTimer.Stop(); | 320 | m_updateTimer.Stop(); |
322 | } | 321 | } |
323 | 322 | ||
324 | #endregion | 323 | #endregion |
325 | 324 | ||
326 | /// <summary> | 325 | /// <summary> |
@@ -336,8 +335,8 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory | |||
336 | } | 335 | } |
337 | 336 | ||
338 | // m_log.WarnFormat("[AVATAR FACTORY MODULE]: Received request for wearables of {0}", client.AgentId); | 337 | // m_log.WarnFormat("[AVATAR FACTORY MODULE]: Received request for wearables of {0}", client.AgentId); |
339 | 338 | ||
340 | client.SendWearables(sp.Appearance.Wearables,sp.Appearance.Serial++); | 339 | client.SendWearables(sp.Appearance.Wearables, sp.Appearance.Serial++); |
341 | } | 340 | } |
342 | 341 | ||
343 | /// <summary> | 342 | /// <summary> |
@@ -353,17 +352,17 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory | |||
353 | m_log.WarnFormat("[AVATAR FACTORY MODULE]: AvatarIsWearing unable to find presence for {0}", client.AgentId); | 352 | m_log.WarnFormat("[AVATAR FACTORY MODULE]: AvatarIsWearing unable to find presence for {0}", client.AgentId); |
354 | return; | 353 | return; |
355 | } | 354 | } |
356 | 355 | ||
357 | // m_log.WarnFormat("[AVATAR FACTORY MODULE]: AvatarIsWearing called for {0}",client.AgentId); | 356 | // m_log.WarnFormat("[AVATAR FACTORY MODULE]: AvatarIsWearing called for {0}", client.AgentId); |
358 | 357 | ||
359 | AvatarAppearance avatAppearance = new AvatarAppearance(sp.Appearance, false); | 358 | AvatarAppearance avatAppearance = new AvatarAppearance(sp.Appearance, false); |
360 | 359 | ||
361 | foreach (AvatarWearingArgs.Wearable wear in e.NowWearing) | 360 | foreach (AvatarWearingArgs.Wearable wear in e.NowWearing) |
362 | { | 361 | { |
363 | if (wear.Type < AvatarWearable.MAX_WEARABLES) | 362 | if (wear.Type < AvatarWearable.MAX_WEARABLES) |
364 | avatAppearance.Wearables[wear.Type].Add(wear.ItemID,UUID.Zero); | 363 | avatAppearance.Wearables[wear.Type].Add(wear.ItemID, UUID.Zero); |
365 | } | 364 | } |
366 | 365 | ||
367 | avatAppearance.GetAssetsFrom(sp.Appearance); | 366 | avatAppearance.GetAssetsFrom(sp.Appearance); |
368 | 367 | ||
369 | // This could take awhile since it needs to pull inventory | 368 | // This could take awhile since it needs to pull inventory |
@@ -381,11 +380,11 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory | |||
381 | { | 380 | { |
382 | for (int i = 0; i < AvatarWearable.MAX_WEARABLES; i++) | 381 | for (int i = 0; i < AvatarWearable.MAX_WEARABLES; i++) |
383 | { | 382 | { |
384 | for (int j = 0 ; j < appearance.Wearables[j].Count ; j ++ ) | 383 | for (int j = 0; j < appearance.Wearables[j].Count; j++) |
385 | { | 384 | { |
386 | if (appearance.Wearables[i][j].ItemID == UUID.Zero) | 385 | if (appearance.Wearables[i][j].ItemID == UUID.Zero) |
387 | continue; | 386 | continue; |
388 | 387 | ||
389 | // Ignore ruth's assets | 388 | // Ignore ruth's assets |
390 | if (appearance.Wearables[i][j].ItemID == AvatarWearable.DefaultWearables[i][0].ItemID) | 389 | if (appearance.Wearables[i][j].ItemID == AvatarWearable.DefaultWearables[i][0].ItemID) |
391 | continue; | 390 | continue; |
@@ -399,9 +398,9 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory | |||
399 | else | 398 | else |
400 | { | 399 | { |
401 | m_log.ErrorFormat( | 400 | m_log.ErrorFormat( |
402 | "[AVATAR FACTORY MODULE]: Can't find inventory item {0} for {1}, setting to default", | 401 | "[AVATAR FACTORY MODULE]: Can't find inventory item {0} for {1}, setting to default", |
403 | appearance.Wearables[i][j].ItemID, (WearableType)i); | 402 | appearance.Wearables[i][j].ItemID, (WearableType)i); |
404 | 403 | ||
405 | appearance.Wearables[i].RemoveItem(appearance.Wearables[i][j].ItemID); | 404 | appearance.Wearables[i].RemoveItem(appearance.Wearables[i][j].ItemID); |
406 | } | 405 | } |
407 | } | 406 | } |
diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index 283182c..9ba144d 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs | |||
@@ -435,6 +435,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
435 | // Now let's make it officially a child agent | 435 | // Now let's make it officially a child agent |
436 | sp.MakeChildAgent(); | 436 | sp.MakeChildAgent(); |
437 | 437 | ||
438 | sp.Scene.CleanDroppedAttachments(); | ||
439 | |||
438 | // Finally, let's close this previously-known-as-root agent, when the jump is outside the view zone | 440 | // Finally, let's close this previously-known-as-root agent, when the jump is outside the view zone |
439 | 441 | ||
440 | if (NeedsClosing(oldRegionX, newRegionX, oldRegionY, newRegionY, reg)) | 442 | if (NeedsClosing(oldRegionX, newRegionX, oldRegionY, newRegionY, reg)) |
diff --git a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs index 1bf0d67..6844c60 100644 --- a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs +++ b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs | |||
@@ -1098,12 +1098,14 @@ namespace OpenSim.Region.CoreModules.World.Estate | |||
1098 | if (m_scene.RegionInfo.RegionSettings.AllowLandJoinDivide) | 1098 | if (m_scene.RegionInfo.RegionSettings.AllowLandJoinDivide) |
1099 | flags |= RegionFlags.AllowParcelChanges; | 1099 | flags |= RegionFlags.AllowParcelChanges; |
1100 | if (m_scene.RegionInfo.RegionSettings.BlockShowInSearch) | 1100 | if (m_scene.RegionInfo.RegionSettings.BlockShowInSearch) |
1101 | flags |= (RegionFlags)(1 << 29); | 1101 | flags |= RegionFlags.BlockParcelSearch; |
1102 | 1102 | ||
1103 | if (m_scene.RegionInfo.RegionSettings.FixedSun) | 1103 | if (m_scene.RegionInfo.RegionSettings.FixedSun) |
1104 | flags |= RegionFlags.SunFixed; | 1104 | flags |= RegionFlags.SunFixed; |
1105 | if (m_scene.RegionInfo.RegionSettings.Sandbox) | 1105 | if (m_scene.RegionInfo.RegionSettings.Sandbox) |
1106 | flags |= RegionFlags.Sandbox; | 1106 | flags |= RegionFlags.Sandbox; |
1107 | if (m_scene.RegionInfo.EstateSettings.AllowVoice) | ||
1108 | flags |= RegionFlags.AllowVoice; | ||
1107 | 1109 | ||
1108 | // Fudge these to always on, so the menu options activate | 1110 | // Fudge these to always on, so the menu options activate |
1109 | // | 1111 | // |
diff --git a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs index 634685a..695202f 100644 --- a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs +++ b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs | |||
@@ -88,7 +88,8 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
88 | 88 | ||
89 | // caches ExtendedLandData | 89 | // caches ExtendedLandData |
90 | private Cache parcelInfoCache; | 90 | private Cache parcelInfoCache; |
91 | private Vector3? forcedPosition = null; | 91 | private Dictionary<UUID, Vector3> forcedPosition = |
92 | new Dictionary<UUID, Vector3>(); | ||
92 | 93 | ||
93 | #region INonSharedRegionModule Members | 94 | #region INonSharedRegionModule Members |
94 | 95 | ||
@@ -177,7 +178,7 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
177 | void ClientOnPreAgentUpdate(IClientAPI remoteClient, AgentUpdateArgs agentData) | 178 | void ClientOnPreAgentUpdate(IClientAPI remoteClient, AgentUpdateArgs agentData) |
178 | { | 179 | { |
179 | //If we are forcing a position for them to go | 180 | //If we are forcing a position for them to go |
180 | if (forcedPosition != null) | 181 | if (forcedPosition.ContainsKey(remoteClient.AgentId)) |
181 | { | 182 | { |
182 | ScenePresence clientAvatar = m_scene.GetScenePresence(remoteClient.AgentId); | 183 | ScenePresence clientAvatar = m_scene.GetScenePresence(remoteClient.AgentId); |
183 | 184 | ||
@@ -187,23 +188,23 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
187 | 188 | ||
188 | 189 | ||
189 | //Make sure we stop if they get about to the right place to prevent yoyo and prevents getting stuck on banlines | 190 | //Make sure we stop if they get about to the right place to prevent yoyo and prevents getting stuck on banlines |
190 | if (Vector3.Distance(clientAvatar.AbsolutePosition, forcedPosition.Value) < .2) | 191 | if (Vector3.Distance(clientAvatar.AbsolutePosition, forcedPosition[remoteClient.AgentId]) < .2) |
191 | { | 192 | { |
192 | Debug.WriteLine(string.Format("Stopping force position because {0} is close enough to position {1}", forcedPosition.Value, clientAvatar.AbsolutePosition)); | 193 | Debug.WriteLine(string.Format("Stopping force position because {0} is close enough to position {1}", forcedPosition[remoteClient.AgentId], clientAvatar.AbsolutePosition)); |
193 | forcedPosition = null; | 194 | forcedPosition.Remove(remoteClient.AgentId); |
194 | } | 195 | } |
195 | //if we are far away, teleport | 196 | //if we are far away, teleport |
196 | else if (Vector3.Distance(clientAvatar.AbsolutePosition, forcedPosition.Value) > 3) | 197 | else if (Vector3.Distance(clientAvatar.AbsolutePosition, forcedPosition[remoteClient.AgentId]) > 3) |
197 | { | 198 | { |
198 | Debug.WriteLine(string.Format("Teleporting out because {0} is too far from avatar position {1}", forcedPosition.Value, clientAvatar.AbsolutePosition)); | 199 | Debug.WriteLine(string.Format("Teleporting out because {0} is too far from avatar position {1}", forcedPosition[remoteClient.AgentId], clientAvatar.AbsolutePosition)); |
199 | clientAvatar.Teleport(forcedPosition.Value); | 200 | clientAvatar.Teleport(forcedPosition[remoteClient.AgentId]); |
200 | forcedPosition = null; | 201 | forcedPosition.Remove(remoteClient.AgentId); |
201 | } | 202 | } |
202 | else | 203 | else |
203 | { | 204 | { |
204 | //Forces them toward the forced position we want if they aren't there yet | 205 | //Forces them toward the forced position we want if they aren't there yet |
205 | agentData.UseClientAgentPosition = true; | 206 | agentData.UseClientAgentPosition = true; |
206 | agentData.ClientAgentPosition = forcedPosition.Value; | 207 | agentData.ClientAgentPosition = forcedPosition[remoteClient.AgentId]; |
207 | } | 208 | } |
208 | } | 209 | } |
209 | } | 210 | } |
@@ -326,7 +327,7 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
326 | if (m_scene.Permissions.IsGod(avatar.UUID)) return; | 327 | if (m_scene.Permissions.IsGod(avatar.UUID)) return; |
327 | if (position.HasValue) | 328 | if (position.HasValue) |
328 | { | 329 | { |
329 | forcedPosition = position; | 330 | forcedPosition[avatar.ControllingClient.AgentId] = (Vector3)position; |
330 | } | 331 | } |
331 | } | 332 | } |
332 | 333 | ||
@@ -457,7 +458,7 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
457 | parcel.IsBannedFromLand(clientAvatar.UUID)) | 458 | parcel.IsBannedFromLand(clientAvatar.UUID)) |
458 | { | 459 | { |
459 | //once we've sent the message once, keep going toward the target until we are done | 460 | //once we've sent the message once, keep going toward the target until we are done |
460 | if (forcedPosition == null) | 461 | if (forcedPosition.ContainsKey(clientAvatar.ControllingClient.AgentId)) |
461 | { | 462 | { |
462 | SendYouAreBannedNotice(clientAvatar); | 463 | SendYouAreBannedNotice(clientAvatar); |
463 | ForceAvatarToPosition(clientAvatar, m_scene.GetNearestAllowedPosition(clientAvatar)); | 464 | ForceAvatarToPosition(clientAvatar, m_scene.GetNearestAllowedPosition(clientAvatar)); |
@@ -466,7 +467,7 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
466 | else if (parcel.IsRestrictedFromLand(clientAvatar.UUID)) | 467 | else if (parcel.IsRestrictedFromLand(clientAvatar.UUID)) |
467 | { | 468 | { |
468 | //once we've sent the message once, keep going toward the target until we are done | 469 | //once we've sent the message once, keep going toward the target until we are done |
469 | if (forcedPosition == null) | 470 | if (forcedPosition.ContainsKey(clientAvatar.ControllingClient.AgentId)) |
470 | { | 471 | { |
471 | SendYouAreRestrictedNotice(clientAvatar); | 472 | SendYouAreRestrictedNotice(clientAvatar); |
472 | ForceAvatarToPosition(clientAvatar, m_scene.GetNearestAllowedPosition(clientAvatar)); | 473 | ForceAvatarToPosition(clientAvatar, m_scene.GetNearestAllowedPosition(clientAvatar)); |
@@ -475,7 +476,7 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
475 | else | 476 | else |
476 | { | 477 | { |
477 | //when we are finally in a safe place, lets release the forced position lock | 478 | //when we are finally in a safe place, lets release the forced position lock |
478 | forcedPosition = null; | 479 | forcedPosition.Remove(clientAvatar.ControllingClient.AgentId); |
479 | } | 480 | } |
480 | } | 481 | } |
481 | } | 482 | } |
diff --git a/OpenSim/Region/CoreModules/World/Sound/SoundModule.cs b/OpenSim/Region/CoreModules/World/Sound/SoundModule.cs index 8df645d..abd28c8 100644 --- a/OpenSim/Region/CoreModules/World/Sound/SoundModule.cs +++ b/OpenSim/Region/CoreModules/World/Sound/SoundModule.cs | |||
@@ -97,7 +97,6 @@ namespace OpenSim.Region.CoreModules.World.Sound | |||
97 | else | 97 | else |
98 | gain = (float)((double)gain * ((radius - dis) / radius)); | 98 | gain = (float)((double)gain * ((radius - dis) / radius)); |
99 | 99 | ||
100 | m_log.DebugFormat("Play sound, gain {0}", gain); | ||
101 | sp.ControllingClient.SendPlayAttachedSound(soundID, objectID, ownerID, (float)gain, flags); | 100 | sp.ControllingClient.SendPlayAttachedSound(soundID, objectID, ownerID, (float)gain, flags); |
102 | }); | 101 | }); |
103 | } | 102 | } |
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 3c6bab8..3eb4f3e 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs | |||
@@ -174,6 +174,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
174 | private bool m_firstHeartbeat = true; | 174 | private bool m_firstHeartbeat = true; |
175 | 175 | ||
176 | private object m_deleting_scene_object = new object(); | 176 | private object m_deleting_scene_object = new object(); |
177 | private object m_cleaningAttachments = new object(); | ||
177 | 178 | ||
178 | private UpdatePrioritizationSchemes m_priorityScheme = UpdatePrioritizationSchemes.Time; | 179 | private UpdatePrioritizationSchemes m_priorityScheme = UpdatePrioritizationSchemes.Time; |
179 | private bool m_reprioritizationEnabled = true; | 180 | private bool m_reprioritizationEnabled = true; |
@@ -3162,6 +3163,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
3162 | } | 3163 | } |
3163 | 3164 | ||
3164 | m_eventManager.TriggerOnRemovePresence(agentID); | 3165 | m_eventManager.TriggerOnRemovePresence(agentID); |
3166 | |||
3165 | ForEachClient( | 3167 | ForEachClient( |
3166 | delegate(IClientAPI client) | 3168 | delegate(IClientAPI client) |
3167 | { | 3169 | { |
@@ -3194,6 +3196,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
3194 | } | 3196 | } |
3195 | 3197 | ||
3196 | m_authenticateHandler.RemoveCircuit(avatar.ControllingClient.CircuitCode); | 3198 | m_authenticateHandler.RemoveCircuit(avatar.ControllingClient.CircuitCode); |
3199 | CleanDroppedAttachments(); | ||
3197 | //m_log.InfoFormat("[SCENE] Memory pre GC {0}", System.GC.GetTotalMemory(false)); | 3200 | //m_log.InfoFormat("[SCENE] Memory pre GC {0}", System.GC.GetTotalMemory(false)); |
3198 | //m_log.InfoFormat("[SCENE] Memory post GC {0}", System.GC.GetTotalMemory(true)); | 3201 | //m_log.InfoFormat("[SCENE] Memory post GC {0}", System.GC.GetTotalMemory(true)); |
3199 | } | 3202 | } |
@@ -3408,6 +3411,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
3408 | 3411 | ||
3409 | if (vialogin) | 3412 | if (vialogin) |
3410 | { | 3413 | { |
3414 | CleanDroppedAttachments(); | ||
3415 | |||
3411 | if (TestBorderCross(agent.startpos, Cardinals.E)) | 3416 | if (TestBorderCross(agent.startpos, Cardinals.E)) |
3412 | { | 3417 | { |
3413 | Border crossedBorder = GetCrossedBorder(agent.startpos, Cardinals.E); | 3418 | Border crossedBorder = GetCrossedBorder(agent.startpos, Cardinals.E); |
@@ -3756,7 +3761,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
3756 | 3761 | ||
3757 | // We have to wait until the viewer contacts this region after receiving EAC. | 3762 | // We have to wait until the viewer contacts this region after receiving EAC. |
3758 | // That calls AddNewClient, which finally creates the ScenePresence | 3763 | // That calls AddNewClient, which finally creates the ScenePresence |
3759 | m_log.Debug("ICADU -> pre wait"); | 3764 | ILandObject nearestParcel = GetNearestAllowedParcel(cAgentData.AgentID, Constants.RegionSize / 2, Constants.RegionSize / 2); |
3765 | if (nearestParcel == null) | ||
3766 | { | ||
3767 | m_log.DebugFormat("[SCENE]: Denying root agent entry to {0}: no allowed parcel", cAgentData.AgentID); | ||
3768 | return false; | ||
3769 | } | ||
3770 | |||
3760 | ScenePresence childAgentUpdate = WaitGetScenePresence(cAgentData.AgentID); | 3771 | ScenePresence childAgentUpdate = WaitGetScenePresence(cAgentData.AgentID); |
3761 | m_log.Debug("ICADU -> post wait"); | 3772 | m_log.Debug("ICADU -> post wait"); |
3762 | if (childAgentUpdate != null) | 3773 | if (childAgentUpdate != null) |
@@ -4738,7 +4749,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
4738 | Vector3 nearestRegionEdgePoint = GetNearestRegionEdgePosition(avatar); | 4749 | Vector3 nearestRegionEdgePoint = GetNearestRegionEdgePosition(avatar); |
4739 | //Debug.WriteLine("They are really in a place they don't belong, sending them to: " + nearestRegionEdgePoint.ToString()); | 4750 | //Debug.WriteLine("They are really in a place they don't belong, sending them to: " + nearestRegionEdgePoint.ToString()); |
4740 | return nearestRegionEdgePoint; | 4751 | return nearestRegionEdgePoint; |
4741 | return null; | ||
4742 | } | 4752 | } |
4743 | 4753 | ||
4744 | private Vector3 GetParcelCenterAtGround(ILandObject parcel) | 4754 | private Vector3 GetParcelCenterAtGround(ILandObject parcel) |
@@ -4987,5 +4997,40 @@ namespace OpenSim.Region.Framework.Scenes | |||
4987 | throw new Exception(error); | 4997 | throw new Exception(error); |
4988 | } | 4998 | } |
4989 | } | 4999 | } |
5000 | |||
5001 | public void CleanDroppedAttachments() | ||
5002 | { | ||
5003 | List<SceneObjectGroup> objectsToDelete = | ||
5004 | new List<SceneObjectGroup>(); | ||
5005 | |||
5006 | lock (m_cleaningAttachments) | ||
5007 | { | ||
5008 | ForEachSOG(delegate (SceneObjectGroup grp) | ||
5009 | { | ||
5010 | if (grp.RootPart.Shape.PCode == 0 && grp.RootPart.Shape.State != 0 && (!objectsToDelete.Contains(grp))) | ||
5011 | { | ||
5012 | UUID agentID = grp.OwnerID; | ||
5013 | if (agentID == UUID.Zero) | ||
5014 | { | ||
5015 | objectsToDelete.Add(grp); | ||
5016 | return; | ||
5017 | } | ||
5018 | |||
5019 | ScenePresence sp = GetScenePresence(agentID); | ||
5020 | if (sp == null) | ||
5021 | { | ||
5022 | objectsToDelete.Add(grp); | ||
5023 | return; | ||
5024 | } | ||
5025 | } | ||
5026 | }); | ||
5027 | } | ||
5028 | |||
5029 | foreach (SceneObjectGroup grp in objectsToDelete) | ||
5030 | { | ||
5031 | m_log.InfoFormat("[SCENE]: Deleting dropped attachment {0} of user {1}", grp.UUID, grp.OwnerID); | ||
5032 | DeleteSceneObject(grp, true); | ||
5033 | } | ||
5034 | } | ||
4990 | } | 5035 | } |
4991 | } | 5036 | } |
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index fe9dc56..2e58a46 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs | |||
@@ -1133,7 +1133,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1133 | 1133 | ||
1134 | m_log.DebugFormat( | 1134 | m_log.DebugFormat( |
1135 | "[SCENE PRESENCE]: Completing movement of {0} into region {1} took {2}ms", | 1135 | "[SCENE PRESENCE]: Completing movement of {0} into region {1} took {2}ms", |
1136 | client.Name, Scene.RegionInfo.RegionName, (DateTime.Now - startTime).Milliseconds); | 1136 | client.Name, Scene.RegionInfo.RegionName, (DateTime.Now - startTime).Milliseconds); |
1137 | } | 1137 | } |
1138 | 1138 | ||
1139 | /// <summary> | 1139 | /// <summary> |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 1a13dea..c251a49 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | |||
@@ -9882,6 +9882,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
9882 | case "4": | 9882 | case "4": |
9883 | ret = ret + new LSL_List(land.Area); | 9883 | ret = ret + new LSL_List(land.Area); |
9884 | break; | 9884 | break; |
9885 | case "5": | ||
9886 | ret = ret + new LSL_List(land.GlobalID); | ||
9887 | break; | ||
9885 | default: | 9888 | default: |
9886 | ret = ret + new LSL_List(0); | 9889 | ret = ret + new LSL_List(0); |
9887 | break; | 9890 | break; |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs index b96e977..b3c4d95 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs | |||
@@ -507,6 +507,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase | |||
507 | public const int PARCEL_DETAILS_OWNER = 2; | 507 | public const int PARCEL_DETAILS_OWNER = 2; |
508 | public const int PARCEL_DETAILS_GROUP = 3; | 508 | public const int PARCEL_DETAILS_GROUP = 3; |
509 | public const int PARCEL_DETAILS_AREA = 4; | 509 | public const int PARCEL_DETAILS_AREA = 4; |
510 | public const int PARCEL_DETAILS_ID = 5; | ||
510 | 511 | ||
511 | // constants for llSetClickAction | 512 | // constants for llSetClickAction |
512 | public const int CLICK_ACTION_NONE = 0; | 513 | public const int CLICK_ACTION_NONE = 0; |