diff options
Diffstat (limited to 'OpenSim/Region')
6 files changed, 139 insertions, 78 deletions
diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index 0707119..5d50a83 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs | |||
@@ -180,6 +180,9 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
180 | 180 | ||
181 | sp.ControllingClient.SendLocalTeleport(position, lookAt, teleportFlags); | 181 | sp.ControllingClient.SendLocalTeleport(position, lookAt, teleportFlags); |
182 | sp.Teleport(position); | 182 | sp.Teleport(position); |
183 | |||
184 | foreach (SceneObjectGroup grp in sp.Attachments) | ||
185 | sp.Scene.EventManager.TriggerOnScriptChangedEvent(grp.LocalId, (uint)Changed.TELEPORT); | ||
183 | } | 186 | } |
184 | else // Another region possibly in another simulator | 187 | else // Another region possibly in another simulator |
185 | { | 188 | { |
@@ -393,7 +396,12 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
393 | agent.Position = position; | 396 | agent.Position = position; |
394 | SetCallbackURL(agent, sp.Scene.RegionInfo); | 397 | SetCallbackURL(agent, sp.Scene.RegionInfo); |
395 | 398 | ||
396 | UpdateAgent(reg, finalDestination, agent); | 399 | if (!UpdateAgent(reg, finalDestination, agent)) |
400 | { | ||
401 | // Region doesn't take it | ||
402 | Fail(sp, finalDestination); | ||
403 | return; | ||
404 | } | ||
397 | 405 | ||
398 | m_log.DebugFormat( | 406 | m_log.DebugFormat( |
399 | "[ENTITY TRANSFER MODULE]: Sending new CAPS seed url {0} to client {1}", capsPath, sp.UUID); | 407 | "[ENTITY TRANSFER MODULE]: Sending new CAPS seed url {0} to client {1}", capsPath, sp.UUID); |
@@ -418,21 +426,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
418 | // that the client contacted the destination before we send the attachments and close things here. | 426 | // that the client contacted the destination before we send the attachments and close things here. |
419 | if (!WaitForCallback(sp.UUID)) | 427 | if (!WaitForCallback(sp.UUID)) |
420 | { | 428 | { |
421 | // Client never contacted destination. Let's restore everything back | 429 | Fail(sp, finalDestination); |
422 | sp.ControllingClient.SendTeleportFailed("Problems connecting to destination."); | ||
423 | |||
424 | // Fail. Reset it back | ||
425 | sp.IsChildAgent = false; | ||
426 | |||
427 | ResetFromTransit(sp.UUID); | ||
428 | |||
429 | // Yikes! We should just have a ref to scene here. | ||
430 | //sp.Scene.InformClientOfNeighbours(sp); | ||
431 | EnableChildAgents(sp); | ||
432 | |||
433 | // Finally, kill the agent we just created at the destination. | ||
434 | m_aScene.SimulationService.CloseAgent(finalDestination, sp.UUID); | ||
435 | |||
436 | return; | 430 | return; |
437 | } | 431 | } |
438 | 432 | ||
@@ -472,6 +466,22 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
472 | } | 466 | } |
473 | } | 467 | } |
474 | 468 | ||
469 | private void Fail(ScenePresence sp, GridRegion finalDestination) | ||
470 | { | ||
471 | // Client never contacted destination. Let's restore everything back | ||
472 | sp.ControllingClient.SendTeleportFailed("Problems connecting to destination."); | ||
473 | |||
474 | // Fail. Reset it back | ||
475 | sp.IsChildAgent = false; | ||
476 | |||
477 | ResetFromTransit(sp.UUID); | ||
478 | |||
479 | EnableChildAgents(sp); | ||
480 | |||
481 | // Finally, kill the agent we just created at the destination. | ||
482 | m_aScene.SimulationService.CloseAgent(finalDestination, sp.UUID); | ||
483 | |||
484 | } | ||
475 | 485 | ||
476 | protected virtual bool CreateAgent(ScenePresence sp, GridRegion reg, GridRegion finalDestination, AgentCircuitData agentCircuit, uint teleportFlags, out string reason) | 486 | protected virtual bool CreateAgent(ScenePresence sp, GridRegion reg, GridRegion finalDestination, AgentCircuitData agentCircuit, uint teleportFlags, out string reason) |
477 | { | 487 | { |
@@ -810,7 +820,12 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
810 | cAgent.CallbackURI = "http://" + m_scene.RegionInfo.ExternalHostName + ":" + m_scene.RegionInfo.HttpPort + | 820 | cAgent.CallbackURI = "http://" + m_scene.RegionInfo.ExternalHostName + ":" + m_scene.RegionInfo.HttpPort + |
811 | "/agent/" + agent.UUID.ToString() + "/" + m_scene.RegionInfo.RegionID.ToString() + "/release/"; | 821 | "/agent/" + agent.UUID.ToString() + "/" + m_scene.RegionInfo.RegionID.ToString() + "/release/"; |
812 | 822 | ||
813 | m_scene.SimulationService.UpdateAgent(neighbourRegion, cAgent); | 823 | if (!m_scene.SimulationService.UpdateAgent(neighbourRegion, cAgent)) |
824 | { | ||
825 | // region doesn't take it | ||
826 | ResetFromTransit(agent.UUID); | ||
827 | return agent; | ||
828 | } | ||
814 | 829 | ||
815 | // Next, let's close the child agent connections that are too far away. | 830 | // Next, let's close the child agent connections that are too far away. |
816 | agent.CloseChildAgents(neighbourx, neighboury); | 831 | agent.CloseChildAgents(neighbourx, neighboury); |
@@ -1120,7 +1135,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1120 | string reason = String.Empty; | 1135 | string reason = String.Empty; |
1121 | 1136 | ||
1122 | 1137 | ||
1123 | bool regionAccepted = m_scene.SimulationService.CreateAgent(reg, a, 0, out reason); // m_interregionCommsOut.SendCreateChildAgent(reg.RegionHandle, a, 0, out reason); | 1138 | bool regionAccepted = m_scene.SimulationService.CreateAgent(reg, a, (uint)TeleportFlags.Default, out reason); |
1124 | 1139 | ||
1125 | if (regionAccepted && newAgent) | 1140 | if (regionAccepted && newAgent) |
1126 | { | 1141 | { |
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 9594e6b..55060c3 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs | |||
@@ -2480,7 +2480,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2480 | 2480 | ||
2481 | 2481 | ||
2482 | /// <summary> | 2482 | /// <summary> |
2483 | /// Called when objects or attachments cross the border between regions. | 2483 | /// Called when objects or attachments cross the border, or teleport, between regions. |
2484 | /// </summary> | 2484 | /// </summary> |
2485 | /// <param name="sog"></param> | 2485 | /// <param name="sog"></param> |
2486 | /// <returns></returns> | 2486 | /// <returns></returns> |
@@ -2510,6 +2510,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
2510 | 2510 | ||
2511 | // Do this as late as possible so that listeners have full access to the incoming object | 2511 | // Do this as late as possible so that listeners have full access to the incoming object |
2512 | EventManager.TriggerOnIncomingSceneObject(newObject); | 2512 | EventManager.TriggerOnIncomingSceneObject(newObject); |
2513 | |||
2514 | TriggerChangedTeleport(newObject); | ||
2513 | 2515 | ||
2514 | return true; | 2516 | return true; |
2515 | } | 2517 | } |
@@ -2577,22 +2579,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
2577 | // Fix up attachment Parent Local ID | 2579 | // Fix up attachment Parent Local ID |
2578 | ScenePresence sp = GetScenePresence(sceneObject.OwnerID); | 2580 | ScenePresence sp = GetScenePresence(sceneObject.OwnerID); |
2579 | 2581 | ||
2580 | //uint parentLocalID = 0; | ||
2581 | if (sp != null) | 2582 | if (sp != null) |
2582 | { | 2583 | { |
2583 | //parentLocalID = sp.LocalId; | ||
2584 | |||
2585 | //sceneObject.RootPart.IsAttachment = true; | ||
2586 | //sceneObject.RootPart.SetParentLocalId(parentLocalID); | ||
2587 | 2584 | ||
2588 | SceneObjectGroup grp = sceneObject; | 2585 | SceneObjectGroup grp = sceneObject; |
2589 | 2586 | ||
2590 | //RootPrim.SetParentLocalId(parentLocalID); | ||
2591 | |||
2592 | m_log.DebugFormat( | 2587 | m_log.DebugFormat( |
2593 | "[ATTACHMENT]: Received attachment {0}, inworld asset id {1}", grp.GetFromItemID(), grp.UUID); | 2588 | "[ATTACHMENT]: Received attachment {0}, inworld asset id {1}", grp.GetFromItemID(), grp.UUID); |
2594 | |||
2595 | //grp.SetFromAssetID(grp.RootPart.LastOwnerID); | ||
2596 | m_log.DebugFormat( | 2589 | m_log.DebugFormat( |
2597 | "[ATTACHMENT]: Attach to avatar {0} at position {1}", sp.UUID, grp.AbsolutePosition); | 2590 | "[ATTACHMENT]: Attach to avatar {0} at position {1}", sp.UUID, grp.AbsolutePosition); |
2598 | 2591 | ||
@@ -2602,7 +2595,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
2602 | AttachmentsModule.AttachObject( | 2595 | AttachmentsModule.AttachObject( |
2603 | sp.ControllingClient, grp.LocalId, (uint)0, grp.GroupRotation, grp.AbsolutePosition, false); | 2596 | sp.ControllingClient, grp.LocalId, (uint)0, grp.GroupRotation, grp.AbsolutePosition, false); |
2604 | 2597 | ||
2605 | //grp.SendGroupFullUpdate(); | ||
2606 | } | 2598 | } |
2607 | else | 2599 | else |
2608 | { | 2600 | { |
@@ -2630,6 +2622,27 @@ namespace OpenSim.Region.Framework.Scenes | |||
2630 | 2622 | ||
2631 | return true; | 2623 | return true; |
2632 | } | 2624 | } |
2625 | |||
2626 | private void TriggerChangedTeleport(SceneObjectGroup sog) | ||
2627 | { | ||
2628 | ScenePresence sp = GetScenePresence(sog.OwnerID); | ||
2629 | |||
2630 | if (sp != null) | ||
2631 | { | ||
2632 | AgentCircuitData aCircuit = m_authenticateHandler.GetAgentCircuitData(sp.UUID); | ||
2633 | |||
2634 | if (aCircuit != null && (aCircuit.teleportFlags != (uint)TeleportFlags.Default)) | ||
2635 | { | ||
2636 | // This will get your attention | ||
2637 | //m_log.Error("[XXX] Triggering "); | ||
2638 | |||
2639 | // Trigger CHANGED_TELEPORT | ||
2640 | sp.Scene.EventManager.TriggerOnScriptChangedEvent(sog.LocalId, (uint)Changed.TELEPORT); | ||
2641 | } | ||
2642 | |||
2643 | } | ||
2644 | } | ||
2645 | |||
2633 | #endregion | 2646 | #endregion |
2634 | 2647 | ||
2635 | #region Add/Remove Avatar Methods | 2648 | #region Add/Remove Avatar Methods |
@@ -3437,6 +3450,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
3437 | public bool NewUserConnection(AgentCircuitData agent, uint teleportFlags, out string reason) | 3450 | public bool NewUserConnection(AgentCircuitData agent, uint teleportFlags, out string reason) |
3438 | { | 3451 | { |
3439 | TeleportFlags tp = (TeleportFlags)teleportFlags; | 3452 | TeleportFlags tp = (TeleportFlags)teleportFlags; |
3453 | reason = String.Empty; | ||
3454 | |||
3440 | //Teleport flags: | 3455 | //Teleport flags: |
3441 | // | 3456 | // |
3442 | // TeleportFlags.ViaGodlikeLure - Border Crossing | 3457 | // TeleportFlags.ViaGodlikeLure - Border Crossing |
@@ -3444,52 +3459,34 @@ namespace OpenSim.Region.Framework.Scenes | |||
3444 | // TeleportFlags.TeleportFlags.ViaLure - Teleport request sent by another user | 3459 | // TeleportFlags.TeleportFlags.ViaLure - Teleport request sent by another user |
3445 | // TeleportFlags.ViaLandmark | TeleportFlags.ViaLocation | TeleportFlags.ViaLandmark | TeleportFlags.Default - Regular Teleport | 3460 | // TeleportFlags.ViaLandmark | TeleportFlags.ViaLocation | TeleportFlags.ViaLandmark | TeleportFlags.Default - Regular Teleport |
3446 | 3461 | ||
3447 | |||
3448 | if (LoginsDisabled) | ||
3449 | { | ||
3450 | reason = "Logins Disabled"; | ||
3451 | return false; | ||
3452 | } | ||
3453 | // Don't disable this log message - it's too helpful | 3462 | // Don't disable this log message - it's too helpful |
3454 | m_log.InfoFormat( | 3463 | m_log.InfoFormat( |
3455 | "[CONNECTION BEGIN]: Region {0} told of incoming {1} agent {2} {3} {4} (circuit code {5}, teleportflags {6})", | 3464 | "[CONNECTION BEGIN]: Region {0} told of incoming {1} agent {2} {3} {4} (circuit code {5}, teleportflags {6})", |
3456 | RegionInfo.RegionName, (agent.child ? "child" : "root"), agent.firstname, agent.lastname, | 3465 | RegionInfo.RegionName, (agent.child ? "child" : "root"), agent.firstname, agent.lastname, |
3457 | agent.AgentID, agent.circuitcode, teleportFlags); | 3466 | agent.AgentID, agent.circuitcode, teleportFlags); |
3458 | 3467 | ||
3459 | reason = String.Empty; | 3468 | if (LoginsDisabled) |
3460 | try | ||
3461 | { | ||
3462 | if (!VerifyUserPresence(agent, out reason)) | ||
3463 | return false; | ||
3464 | } | ||
3465 | catch (Exception e) | ||
3466 | { | 3469 | { |
3467 | m_log.DebugFormat("[CONNECTION BEGIN]: Exception verifying presence {0}", e.Message); | 3470 | reason = "Logins Disabled"; |
3468 | return false; | 3471 | return false; |
3469 | } | 3472 | } |
3470 | 3473 | ||
3471 | try | 3474 | ScenePresence sp = GetScenePresence(agent.AgentID); |
3472 | { | 3475 | |
3473 | if (!AuthorizeUser(agent, out reason)) | 3476 | if (sp != null && !sp.IsChildAgent) |
3474 | return false; | ||
3475 | } | ||
3476 | catch (Exception e) | ||
3477 | { | 3477 | { |
3478 | m_log.DebugFormat("[CONNECTION BEGIN]: Exception authorizing user {0}", e.Message); | 3478 | // We have a zombie from a crashed session. |
3479 | return false; | 3479 | // Or the same user is trying to be root twice here, won't work. |
3480 | // Kill it. | ||
3481 | m_log.DebugFormat("[SCENE]: Zombie scene presence detected for {0} in {1}", agent.AgentID, RegionInfo.RegionName); | ||
3482 | sp.ControllingClient.Close(); | ||
3483 | sp = null; | ||
3480 | } | 3484 | } |
3481 | 3485 | ||
3482 | m_log.InfoFormat( | ||
3483 | "[CONNECTION BEGIN]: Region {0} authenticated and authorized incoming {1} agent {2} {3} {4} (circuit code {5})", | ||
3484 | RegionInfo.RegionName, (agent.child ? "child" : "root"), agent.firstname, agent.lastname, | ||
3485 | agent.AgentID, agent.circuitcode); | ||
3486 | |||
3487 | CapsModule.NewUserConnection(agent); | ||
3488 | |||
3489 | ILandObject land = LandChannel.GetLandObject(agent.startpos.X, agent.startpos.Y); | 3486 | ILandObject land = LandChannel.GetLandObject(agent.startpos.X, agent.startpos.Y); |
3490 | 3487 | ||
3491 | //On login or border crossing test land permisions | 3488 | //On login test land permisions |
3492 | if (tp != TeleportFlags.Default) | 3489 | if (tp == TeleportFlags.ViaLogin) |
3493 | { | 3490 | { |
3494 | if (land != null && !TestLandRestrictions(agent, land, out reason)) | 3491 | if (land != null && !TestLandRestrictions(agent, land, out reason)) |
3495 | { | 3492 | { |
@@ -3497,8 +3494,40 @@ namespace OpenSim.Region.Framework.Scenes | |||
3497 | } | 3494 | } |
3498 | } | 3495 | } |
3499 | 3496 | ||
3500 | ScenePresence sp = GetScenePresence(agent.AgentID); | 3497 | if (sp == null) // We don't have an [child] agent here already |
3501 | if (sp != null) | 3498 | { |
3499 | |||
3500 | try | ||
3501 | { | ||
3502 | if (!VerifyUserPresence(agent, out reason)) | ||
3503 | return false; | ||
3504 | } | ||
3505 | catch (Exception e) | ||
3506 | { | ||
3507 | m_log.DebugFormat("[CONNECTION BEGIN]: Exception verifying presence {0}", e.Message); | ||
3508 | return false; | ||
3509 | } | ||
3510 | |||
3511 | try | ||
3512 | { | ||
3513 | if (!AuthorizeUser(agent, out reason)) | ||
3514 | return false; | ||
3515 | } | ||
3516 | catch (Exception e) | ||
3517 | { | ||
3518 | m_log.DebugFormat("[CONNECTION BEGIN]: Exception authorizing user {0}", e.Message); | ||
3519 | return false; | ||
3520 | } | ||
3521 | |||
3522 | m_log.InfoFormat( | ||
3523 | "[CONNECTION BEGIN]: Region {0} authenticated and authorized incoming {1} agent {2} {3} {4} (circuit code {5})", | ||
3524 | RegionInfo.RegionName, (agent.child ? "child" : "root"), agent.firstname, agent.lastname, | ||
3525 | agent.AgentID, agent.circuitcode); | ||
3526 | |||
3527 | CapsModule.NewUserConnection(agent); | ||
3528 | CapsModule.AddCapsHandler(agent.AgentID); | ||
3529 | } | ||
3530 | else | ||
3502 | { | 3531 | { |
3503 | if (sp.IsChildAgent) | 3532 | if (sp.IsChildAgent) |
3504 | { | 3533 | { |
@@ -3507,22 +3536,18 @@ namespace OpenSim.Region.Framework.Scenes | |||
3507 | agent.AgentID, RegionInfo.RegionName); | 3536 | agent.AgentID, RegionInfo.RegionName); |
3508 | 3537 | ||
3509 | sp.AdjustKnownSeeds(); | 3538 | sp.AdjustKnownSeeds(); |
3510 | 3539 | CapsModule.NewUserConnection(agent); | |
3511 | return true; | ||
3512 | } | ||
3513 | else | ||
3514 | { | ||
3515 | // We have a zombie from a crashed session. Kill it. | ||
3516 | m_log.DebugFormat("[SCENE]: Zombie scene presence detected for {0} in {1}", agent.AgentID, RegionInfo.RegionName); | ||
3517 | sp.ControllingClient.Close(); | ||
3518 | } | 3540 | } |
3519 | } | 3541 | } |
3520 | 3542 | ||
3521 | CapsModule.AddCapsHandler(agent.AgentID); | ||
3522 | 3543 | ||
3523 | if (!agent.child) | 3544 | // In all cases, add or update the circuit data with the new agent circuit data and teleport flags |
3545 | agent.teleportFlags = teleportFlags; | ||
3546 | m_authenticateHandler.AddNewCircuit(agent.circuitcode, agent); | ||
3547 | |||
3548 | if (tp == TeleportFlags.ViaLogin) | ||
3524 | { | 3549 | { |
3525 | if (TestBorderCross(agent.startpos,Cardinals.E)) | 3550 | if (TestBorderCross(agent.startpos, Cardinals.E)) |
3526 | { | 3551 | { |
3527 | Border crossedBorder = GetCrossedBorder(agent.startpos, Cardinals.E); | 3552 | Border crossedBorder = GetCrossedBorder(agent.startpos, Cardinals.E); |
3528 | agent.startpos.X = crossedBorder.BorderLine.Z - 1; | 3553 | agent.startpos.X = crossedBorder.BorderLine.Z - 1; |
@@ -3587,9 +3612,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
3587 | } | 3612 | } |
3588 | } | 3613 | } |
3589 | 3614 | ||
3590 | agent.teleportFlags = teleportFlags; | ||
3591 | m_authenticateHandler.AddNewCircuit(agent.circuitcode, agent); | ||
3592 | |||
3593 | return true; | 3615 | return true; |
3594 | } | 3616 | } |
3595 | 3617 | ||
@@ -3881,6 +3903,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
3881 | m_log.DebugFormat( | 3903 | m_log.DebugFormat( |
3882 | "[SCENE]: Incoming child agent update for {0} in {1}", cAgentData.AgentID, RegionInfo.RegionName); | 3904 | "[SCENE]: Incoming child agent update for {0} in {1}", cAgentData.AgentID, RegionInfo.RegionName); |
3883 | 3905 | ||
3906 | // XPTO: if this agent is not allowed here as root, always return false | ||
3907 | |||
3884 | // We have to wait until the viewer contacts this region after receiving EAC. | 3908 | // We have to wait until the viewer contacts this region after receiving EAC. |
3885 | // That calls AddNewClient, which finally creates the ScenePresence | 3909 | // That calls AddNewClient, which finally creates the ScenePresence |
3886 | ScenePresence childAgentUpdate = WaitGetScenePresence(cAgentData.AgentID); | 3910 | ScenePresence childAgentUpdate = WaitGetScenePresence(cAgentData.AgentID); |
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs index 8b83b06..866bb6e 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs | |||
@@ -555,7 +555,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
555 | foreach (TaskInventoryItem item in items) | 555 | foreach (TaskInventoryItem item in items) |
556 | { | 556 | { |
557 | m_items.Add(item.ItemID, item); | 557 | m_items.Add(item.ItemID, item); |
558 | m_part.TriggerScriptChangedEvent(Changed.INVENTORY); | 558 | // m_part.TriggerScriptChangedEvent(Changed.INVENTORY); |
559 | } | 559 | } |
560 | } | 560 | } |
561 | 561 | ||
diff --git a/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs b/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs index f7544ac..5bdaa17 100644 --- a/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs +++ b/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs | |||
@@ -221,7 +221,16 @@ namespace OpenSim.Region.Framework.Scenes.Serialization | |||
221 | sr = new StringReader(parts[i].OuterXml); | 221 | sr = new StringReader(parts[i].OuterXml); |
222 | reader = new XmlTextReader(sr); | 222 | reader = new XmlTextReader(sr); |
223 | SceneObjectPart part = SceneObjectPart.FromXml(reader); | 223 | SceneObjectPart part = SceneObjectPart.FromXml(reader); |
224 | |||
225 | int originalLinkNum = part.LinkNum; | ||
226 | |||
224 | sceneObject.AddPart(part); | 227 | sceneObject.AddPart(part); |
228 | |||
229 | // SceneObjectGroup.AddPart() tries to be smart and automatically set the LinkNum. | ||
230 | // We override that here | ||
231 | if (originalLinkNum != 0) | ||
232 | part.LinkNum = originalLinkNum; | ||
233 | |||
225 | part.StoreUndoState(); | 234 | part.StoreUndoState(); |
226 | reader.Close(); | 235 | reader.Close(); |
227 | sr.Close(); | 236 | sr.Close(); |
diff --git a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs index 7984bd9..a9e9f5c 100644 --- a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs +++ b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs | |||
@@ -1771,7 +1771,18 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1771 | IMesh mesh = null; | 1771 | IMesh mesh = null; |
1772 | 1772 | ||
1773 | if (needsMeshing(pbs)) | 1773 | if (needsMeshing(pbs)) |
1774 | mesh = mesher.CreateMesh(primName, pbs, size, 32f, isPhysical); | 1774 | { |
1775 | try | ||
1776 | { | ||
1777 | mesh = mesher.CreateMesh(primName, pbs, size, 32f, isPhysical); | ||
1778 | } | ||
1779 | catch(Exception e) | ||
1780 | { | ||
1781 | m_log.ErrorFormat("[PHYSICS]: Exception while meshing prim {0}."); | ||
1782 | m_log.Debug(e.ToString()); | ||
1783 | mesh = null; | ||
1784 | } | ||
1785 | } | ||
1775 | 1786 | ||
1776 | result = AddPrim(primName, position, size, rotation, mesh, pbs, isPhysical); | 1787 | result = AddPrim(primName, position, size, rotation, mesh, pbs, isPhysical); |
1777 | 1788 | ||
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 5400a4f..59ab26b 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | |||
@@ -2699,6 +2699,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2699 | // objects rezzed with this method are die_at_edge by default. | 2699 | // objects rezzed with this method are die_at_edge by default. |
2700 | new_group.RootPart.SetDieAtEdge(true); | 2700 | new_group.RootPart.SetDieAtEdge(true); |
2701 | 2701 | ||
2702 | new_group.ResumeScripts(); | ||
2703 | |||
2702 | m_ScriptEngine.PostObjectEvent(m_host.LocalId, new EventParams( | 2704 | m_ScriptEngine.PostObjectEvent(m_host.LocalId, new EventParams( |
2703 | "object_rez", new Object[] { | 2705 | "object_rez", new Object[] { |
2704 | new LSL_String( | 2706 | new LSL_String( |