aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Framework/Scenes/Scene.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Framework/Scenes/Scene.cs')
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.cs139
1 files changed, 79 insertions, 60 deletions
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 7bea166..b58bfb8 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -2508,7 +2508,7 @@ namespace OpenSim.Region.Framework.Scenes
2508 2508
2509 2509
2510 /// <summary> 2510 /// <summary>
2511 /// Called when objects or attachments cross the border between regions. 2511 /// Called when objects or attachments cross the border, or teleport, between regions.
2512 /// </summary> 2512 /// </summary>
2513 /// <param name="sog"></param> 2513 /// <param name="sog"></param>
2514 /// <returns></returns> 2514 /// <returns></returns>
@@ -2538,6 +2538,8 @@ namespace OpenSim.Region.Framework.Scenes
2538 2538
2539 // Do this as late as possible so that listeners have full access to the incoming object 2539 // Do this as late as possible so that listeners have full access to the incoming object
2540 EventManager.TriggerOnIncomingSceneObject(newObject); 2540 EventManager.TriggerOnIncomingSceneObject(newObject);
2541
2542 TriggerChangedTeleport(newObject);
2541 2543
2542 return true; 2544 return true;
2543 } 2545 }
@@ -2605,22 +2607,13 @@ namespace OpenSim.Region.Framework.Scenes
2605 // Fix up attachment Parent Local ID 2607 // Fix up attachment Parent Local ID
2606 ScenePresence sp = GetScenePresence(sceneObject.OwnerID); 2608 ScenePresence sp = GetScenePresence(sceneObject.OwnerID);
2607 2609
2608 //uint parentLocalID = 0;
2609 if (sp != null) 2610 if (sp != null)
2610 { 2611 {
2611 //parentLocalID = sp.LocalId;
2612
2613 //sceneObject.RootPart.IsAttachment = true;
2614 //sceneObject.RootPart.SetParentLocalId(parentLocalID);
2615 2612
2616 SceneObjectGroup grp = sceneObject; 2613 SceneObjectGroup grp = sceneObject;
2617 2614
2618 //RootPrim.SetParentLocalId(parentLocalID);
2619
2620 m_log.DebugFormat( 2615 m_log.DebugFormat(
2621 "[ATTACHMENT]: Received attachment {0}, inworld asset id {1}", grp.GetFromItemID(), grp.UUID); 2616 "[ATTACHMENT]: Received attachment {0}, inworld asset id {1}", grp.GetFromItemID(), grp.UUID);
2622
2623 //grp.SetFromAssetID(grp.RootPart.LastOwnerID);
2624 m_log.DebugFormat( 2617 m_log.DebugFormat(
2625 "[ATTACHMENT]: Attach to avatar {0} at position {1}", sp.UUID, grp.AbsolutePosition); 2618 "[ATTACHMENT]: Attach to avatar {0} at position {1}", sp.UUID, grp.AbsolutePosition);
2626 2619
@@ -2630,7 +2623,6 @@ namespace OpenSim.Region.Framework.Scenes
2630 AttachmentsModule.AttachObject( 2623 AttachmentsModule.AttachObject(
2631 sp.ControllingClient, grp.LocalId, (uint)0, grp.GroupRotation, grp.AbsolutePosition, false); 2624 sp.ControllingClient, grp.LocalId, (uint)0, grp.GroupRotation, grp.AbsolutePosition, false);
2632 2625
2633 //grp.SendGroupFullUpdate();
2634 } 2626 }
2635 else 2627 else
2636 { 2628 {
@@ -2658,6 +2650,27 @@ namespace OpenSim.Region.Framework.Scenes
2658 2650
2659 return true; 2651 return true;
2660 } 2652 }
2653
2654 private void TriggerChangedTeleport(SceneObjectGroup sog)
2655 {
2656 ScenePresence sp = GetScenePresence(sog.OwnerID);
2657
2658 if (sp != null)
2659 {
2660 AgentCircuitData aCircuit = m_authenticateHandler.GetAgentCircuitData(sp.UUID);
2661
2662 if (aCircuit != null && (aCircuit.teleportFlags != (uint)TeleportFlags.Default))
2663 {
2664 // This will get your attention
2665 //m_log.Error("[XXX] Triggering ");
2666
2667 // Trigger CHANGED_TELEPORT
2668 sp.Scene.EventManager.TriggerOnScriptChangedEvent(sog.LocalId, (uint)Changed.TELEPORT);
2669 }
2670
2671 }
2672 }
2673
2661 #endregion 2674 #endregion
2662 2675
2663 #region Add/Remove Avatar Methods 2676 #region Add/Remove Avatar Methods
@@ -3465,6 +3478,8 @@ namespace OpenSim.Region.Framework.Scenes
3465 public bool NewUserConnection(AgentCircuitData agent, uint teleportFlags, out string reason) 3478 public bool NewUserConnection(AgentCircuitData agent, uint teleportFlags, out string reason)
3466 { 3479 {
3467 TeleportFlags tp = (TeleportFlags)teleportFlags; 3480 TeleportFlags tp = (TeleportFlags)teleportFlags;
3481 reason = String.Empty;
3482
3468 //Teleport flags: 3483 //Teleport flags:
3469 // 3484 //
3470 // TeleportFlags.ViaGodlikeLure - Border Crossing 3485 // TeleportFlags.ViaGodlikeLure - Border Crossing
@@ -3472,52 +3487,34 @@ namespace OpenSim.Region.Framework.Scenes
3472 // TeleportFlags.TeleportFlags.ViaLure - Teleport request sent by another user 3487 // TeleportFlags.TeleportFlags.ViaLure - Teleport request sent by another user
3473 // TeleportFlags.ViaLandmark | TeleportFlags.ViaLocation | TeleportFlags.ViaLandmark | TeleportFlags.Default - Regular Teleport 3488 // TeleportFlags.ViaLandmark | TeleportFlags.ViaLocation | TeleportFlags.ViaLandmark | TeleportFlags.Default - Regular Teleport
3474 3489
3475
3476 if (LoginsDisabled)
3477 {
3478 reason = "Logins Disabled";
3479 return false;
3480 }
3481 // Don't disable this log message - it's too helpful 3490 // Don't disable this log message - it's too helpful
3482 m_log.InfoFormat( 3491 m_log.InfoFormat(
3483 "[CONNECTION BEGIN]: Region {0} told of incoming {1} agent {2} {3} {4} (circuit code {5}, teleportflags {6})", 3492 "[CONNECTION BEGIN]: Region {0} told of incoming {1} agent {2} {3} {4} (circuit code {5}, teleportflags {6})",
3484 RegionInfo.RegionName, (agent.child ? "child" : "root"), agent.firstname, agent.lastname, 3493 RegionInfo.RegionName, (agent.child ? "child" : "root"), agent.firstname, agent.lastname,
3485 agent.AgentID, agent.circuitcode, teleportFlags); 3494 agent.AgentID, agent.circuitcode, teleportFlags);
3486 3495
3487 reason = String.Empty; 3496 if (LoginsDisabled)
3488 try
3489 {
3490 if (!VerifyUserPresence(agent, out reason))
3491 return false;
3492 }
3493 catch (Exception e)
3494 { 3497 {
3495 m_log.DebugFormat("[CONNECTION BEGIN]: Exception verifying presence {0}", e.Message); 3498 reason = "Logins Disabled";
3496 return false; 3499 return false;
3497 } 3500 }
3498 3501
3499 try 3502 ScenePresence sp = GetScenePresence(agent.AgentID);
3500 { 3503
3501 if (!AuthorizeUser(agent, out reason)) 3504 if (sp != null && !sp.IsChildAgent)
3502 return false;
3503 }
3504 catch (Exception e)
3505 { 3505 {
3506 m_log.DebugFormat("[CONNECTION BEGIN]: Exception authorizing user {0}", e.Message); 3506 // We have a zombie from a crashed session.
3507 return false; 3507 // Or the same user is trying to be root twice here, won't work.
3508 // Kill it.
3509 m_log.DebugFormat("[SCENE]: Zombie scene presence detected for {0} in {1}", agent.AgentID, RegionInfo.RegionName);
3510 sp.ControllingClient.Close();
3511 sp = null;
3508 } 3512 }
3509 3513
3510 m_log.InfoFormat(
3511 "[CONNECTION BEGIN]: Region {0} authenticated and authorized incoming {1} agent {2} {3} {4} (circuit code {5})",
3512 RegionInfo.RegionName, (agent.child ? "child" : "root"), agent.firstname, agent.lastname,
3513 agent.AgentID, agent.circuitcode);
3514
3515 CapsModule.NewUserConnection(agent);
3516
3517 ILandObject land = LandChannel.GetLandObject(agent.startpos.X, agent.startpos.Y); 3514 ILandObject land = LandChannel.GetLandObject(agent.startpos.X, agent.startpos.Y);
3518 3515
3519 //On login or border crossing test land permisions 3516 //On login test land permisions
3520 if (tp != TeleportFlags.Default) 3517 if (tp == TeleportFlags.ViaLogin)
3521 { 3518 {
3522 if (land != null && !TestLandRestrictions(agent, land, out reason)) 3519 if (land != null && !TestLandRestrictions(agent, land, out reason))
3523 { 3520 {
@@ -3525,8 +3522,40 @@ namespace OpenSim.Region.Framework.Scenes
3525 } 3522 }
3526 } 3523 }
3527 3524
3528 ScenePresence sp = GetScenePresence(agent.AgentID); 3525 if (sp == null) // We don't have an [child] agent here already
3529 if (sp != null) 3526 {
3527
3528 try
3529 {
3530 if (!VerifyUserPresence(agent, out reason))
3531 return false;
3532 }
3533 catch (Exception e)
3534 {
3535 m_log.DebugFormat("[CONNECTION BEGIN]: Exception verifying presence {0}", e.Message);
3536 return false;
3537 }
3538
3539 try
3540 {
3541 if (!AuthorizeUser(agent, out reason))
3542 return false;
3543 }
3544 catch (Exception e)
3545 {
3546 m_log.DebugFormat("[CONNECTION BEGIN]: Exception authorizing user {0}", e.Message);
3547 return false;
3548 }
3549
3550 m_log.InfoFormat(
3551 "[CONNECTION BEGIN]: Region {0} authenticated and authorized incoming {1} agent {2} {3} {4} (circuit code {5})",
3552 RegionInfo.RegionName, (agent.child ? "child" : "root"), agent.firstname, agent.lastname,
3553 agent.AgentID, agent.circuitcode);
3554
3555 CapsModule.NewUserConnection(agent);
3556 CapsModule.AddCapsHandler(agent.AgentID);
3557 }
3558 else
3530 { 3559 {
3531 if (sp.IsChildAgent) 3560 if (sp.IsChildAgent)
3532 { 3561 {
@@ -3535,25 +3564,18 @@ namespace OpenSim.Region.Framework.Scenes
3535 agent.AgentID, RegionInfo.RegionName); 3564 agent.AgentID, RegionInfo.RegionName);
3536 3565
3537 sp.AdjustKnownSeeds(); 3566 sp.AdjustKnownSeeds();
3538 3567 CapsModule.NewUserConnection(agent);
3539 return true;
3540 }
3541 else
3542 {
3543 // We have a zombie from a crashed session. Kill it.
3544 m_log.DebugFormat("[SCENE]: Zombie scene presence detected for {0} in {1}", agent.AgentID, RegionInfo.RegionName);
3545 sp.ControllingClient.Close(false);
3546 } 3568 }
3547 } 3569 }
3548 3570
3549 CapsModule.AddCapsHandler(agent.AgentID);
3550 3571
3551 if ((teleportFlags & ((uint)TeleportFlags.ViaLandmark | (uint)TeleportFlags.ViaLocation | (uint)TeleportFlags.ViaLandmark | (uint)TeleportFlags.Default)) != 0) 3572 // In all cases, add or update the circuit data with the new agent circuit data and teleport flags
3552 System.Threading.Thread.Sleep(2000); 3573 agent.teleportFlags = teleportFlags;
3574 m_authenticateHandler.AddNewCircuit(agent.circuitcode, agent);
3553 3575
3554 if (!agent.child) 3576 if (tp == TeleportFlags.ViaLogin)
3555 { 3577 {
3556 if (TestBorderCross(agent.startpos,Cardinals.E)) 3578 if (TestBorderCross(agent.startpos, Cardinals.E))
3557 { 3579 {
3558 Border crossedBorder = GetCrossedBorder(agent.startpos, Cardinals.E); 3580 Border crossedBorder = GetCrossedBorder(agent.startpos, Cardinals.E);
3559 agent.startpos.X = crossedBorder.BorderLine.Z - 1; 3581 agent.startpos.X = crossedBorder.BorderLine.Z - 1;
@@ -3621,9 +3643,6 @@ namespace OpenSim.Region.Framework.Scenes
3621 */// This is now handled properly in ScenePresence.MakeRootAgent 3643 */// This is now handled properly in ScenePresence.MakeRootAgent
3622 } 3644 }
3623 3645
3624 agent.teleportFlags = teleportFlags;
3625 m_authenticateHandler.AddNewCircuit(agent.circuitcode, agent);
3626
3627 return true; 3646 return true;
3628 } 3647 }
3629 3648