aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rwxr-xr-xOpenSim/Region/Framework/Scenes/Scene.cs31
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs85
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs46
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs2
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs4
5 files changed, 161 insertions, 7 deletions
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index c5b082c..3b9f551 100755
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -808,6 +808,8 @@ namespace OpenSim.Region.Framework.Scenes
808 private float m_minReprioritizationDistance = 32f; 808 private float m_minReprioritizationDistance = 32f;
809 public bool ObjectsCullingByDistance = false; 809 public bool ObjectsCullingByDistance = false;
810 810
811 private ExpiringCache<UUID, UUID> TeleportTargetsCoolDown = new ExpiringCache<UUID, UUID>();
812
811 public AgentCircuitManager AuthenticateHandler 813 public AgentCircuitManager AuthenticateHandler
812 { 814 {
813 get { return m_authenticateHandler; } 815 get { return m_authenticateHandler; }
@@ -2983,15 +2985,14 @@ namespace OpenSim.Region.Framework.Scenes
2983 // Return 'true' if position inside region. 2985 // Return 'true' if position inside region.
2984 public bool PositionIsInCurrentRegion(Vector3 pos) 2986 public bool PositionIsInCurrentRegion(Vector3 pos)
2985 { 2987 {
2986 bool ret = false; 2988 int xx = (int)pos.X;
2987 int xx = (int)Math.Floor(pos.X); 2989 if (xx < 0 || xx >= RegionInfo.RegionSizeX)
2988 int yy = (int)Math.Floor(pos.Y);
2989 if (xx < 0 || yy < 0)
2990 return false; 2990 return false;
2991 2991
2992 if (xx < RegionInfo.RegionSizeX && yy < RegionInfo.RegionSizeY ) 2992 int yy = (int)pos.Y;
2993 ret = true; 2993 if (yy < 0 || yy >= RegionInfo.RegionSizeX)
2994 return ret; 2994 return false;
2995 return true;
2995 } 2996 }
2996 2997
2997 /// <summary> 2998 /// <summary>
@@ -6526,5 +6527,21 @@ Environment.Exit(1);
6526 6527
6527 m_eventManager.TriggerExtraSettingChanged(this, name, String.Empty); 6528 m_eventManager.TriggerExtraSettingChanged(this, name, String.Empty);
6528 } 6529 }
6530
6531 public bool InTeleportTargetsCoolDown(UUID sourceID, UUID targetID, double timeout)
6532 {
6533 lock(TeleportTargetsCoolDown)
6534 {
6535 UUID lastSource = UUID.Zero;
6536 TeleportTargetsCoolDown.TryGetValue(targetID, out lastSource);
6537 if(lastSource == UUID.Zero)
6538 {
6539 TeleportTargetsCoolDown.Add(targetID, sourceID, timeout);
6540 return false;
6541 }
6542 TeleportTargetsCoolDown.AddOrUpdate(targetID, sourceID, timeout);
6543 return lastSource == sourceID;
6544 }
6545 }
6529 } 6546 }
6530} 6547}
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 719a5dd..402e5f7 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -853,6 +853,91 @@ namespace OpenSim.Region.Framework.Scenes
853 m_log.DebugFormat("[SCENE OBJECT]: Crossing agent {0} {1} completed.", agent.Firstname, agent.Lastname); 853 m_log.DebugFormat("[SCENE OBJECT]: Crossing agent {0} {1} completed.", agent.Firstname, agent.Lastname);
854 } 854 }
855*/ 855*/
856 public void ObjectTeleport(UUID sourceID, Vector3 targetPosition, Quaternion rotation, bool stop)
857 {
858 if(inTransit || IsDeleted || IsAttachmentCheckFull() || IsSelected || Scene == null)
859 return;
860
861 inTransit = true;
862
863 PhysicsActor pa = RootPart.PhysActor;
864 if(pa == null || RootPart.KeyframeMotion != null /*|| m_sittingAvatars.Count == 0*/)
865 {
866 inTransit = false;
867 return;
868 }
869
870 if(Scene.PositionIsInCurrentRegion(targetPosition))
871 {
872 if(Scene.InTeleportTargetsCoolDown(UUID, sourceID, 1.0))
873 {
874 inTransit = false;
875 return;
876 }
877
878 Vector3 curPos = AbsolutePosition;
879 ILandObject curLand = Scene.LandChannel.GetLandObject(curPos.X, curPos.Y);
880 float posX = targetPosition.X;
881 float posY = targetPosition.Y;
882 ILandObject land = Scene.LandChannel.GetLandObject(posX, posY);
883 if(land != null && land != curLand)
884 {
885 if(!Scene.Permissions.CanObjectEnterWithScripts(this, land))
886 {
887 inTransit = false;
888 return;
889 }
890
891 UUID agentID;
892 foreach (ScenePresence av in m_sittingAvatars)
893 {
894 agentID = av.UUID;
895 if(land.IsRestrictedFromLand(agentID) || land.IsBannedFromLand(agentID))
896 {
897 inTransit = false;
898 return;
899 }
900 }
901 }
902
903 if(stop)
904 RootPart.Stop();
905 else
906 {
907 rotation.Normalize();
908 if(Math.Abs(rotation.W) < 0.999)
909 {
910 Quaternion rot = RootPart.RotationOffset;
911 Vector3 vel = RootPart.Velocity;
912 Vector3 avel = RootPart.AngularVelocity;
913 Vector3 acc = RootPart.Acceleration;
914
915 rot *= rotation;
916 vel *= rotation;
917 avel *= rotation;
918 acc *= rotation;
919
920 RootPart.RotationOffset = rot;
921 RootPart.Velocity = vel;
922 RootPart.AngularVelocity = avel;
923 RootPart.Acceleration = acc;
924 }
925 }
926
927 Vector3 s = RootPart.Scale * RootPart.RotationOffset;
928 float h = Scene.GetGroundHeight(posX, posY) + 0.5f * (float)Math.Abs(s.Z) + 0.01f;
929 if(targetPosition.Z < h)
930 targetPosition.Z = h;
931
932 inTransit = false;
933 AbsolutePosition = targetPosition;
934 RootPart.ScheduleTerseUpdate();
935 return;
936 }
937
938 inTransit = false;
939 }
940
856 public override Vector3 Velocity 941 public override Vector3 Velocity
857 { 942 {
858 get { return RootPart.Velocity; } 943 get { return RootPart.Velocity; }
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
index 6c094ee..ddf5078 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
@@ -4418,6 +4418,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4418 /// </returns> 4418 /// </returns>
4419 public LSL_List osGetInertiaData() 4419 public LSL_List osGetInertiaData()
4420 { 4420 {
4421 m_host.AddScriptLPS(1);
4422
4421 LSL_List result = new LSL_List(); 4423 LSL_List result = new LSL_List();
4422 float TotalMass; 4424 float TotalMass;
4423 Vector3 CenterOfMass; 4425 Vector3 CenterOfMass;
@@ -4463,6 +4465,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4463 4465
4464 public void osSetInertia(LSL_Float mass, LSL_Vector centerOfMass, LSL_Vector principalInertiaScaled, LSL_Rotation lslrot) 4466 public void osSetInertia(LSL_Float mass, LSL_Vector centerOfMass, LSL_Vector principalInertiaScaled, LSL_Rotation lslrot)
4465 { 4467 {
4468 m_host.AddScriptLPS(1);
4466 SceneObjectGroup sog = m_host.ParentGroup; 4469 SceneObjectGroup sog = m_host.ParentGroup;
4467 if(sog== null || sog.IsDeleted) 4470 if(sog== null || sog.IsDeleted)
4468 return; 4471 return;
@@ -4499,6 +4502,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4499 /// </remarks> 4502 /// </remarks>
4500 public void osSetInertiaAsBox(LSL_Float mass, LSL_Vector boxSize, LSL_Vector centerOfMass, LSL_Rotation lslrot) 4503 public void osSetInertiaAsBox(LSL_Float mass, LSL_Vector boxSize, LSL_Vector centerOfMass, LSL_Rotation lslrot)
4501 { 4504 {
4505 m_host.AddScriptLPS(1);
4506
4502 SceneObjectGroup sog = m_host.ParentGroup; 4507 SceneObjectGroup sog = m_host.ParentGroup;
4503 if(sog== null || sog.IsDeleted) 4508 if(sog== null || sog.IsDeleted)
4504 return; 4509 return;
@@ -4538,6 +4543,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4538 /// </remarks> 4543 /// </remarks>
4539 public void osSetInertiaAsSphere(LSL_Float mass, LSL_Float radius, LSL_Vector centerOfMass) 4544 public void osSetInertiaAsSphere(LSL_Float mass, LSL_Float radius, LSL_Vector centerOfMass)
4540 { 4545 {
4546 m_host.AddScriptLPS(1);
4541 SceneObjectGroup sog = m_host.ParentGroup; 4547 SceneObjectGroup sog = m_host.ParentGroup;
4542 if(sog== null || sog.IsDeleted) 4548 if(sog== null || sog.IsDeleted)
4543 return; 4549 return;
@@ -4575,6 +4581,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4575 /// </remarks> 4581 /// </remarks>
4576 public void osSetInertiaAsCylinder(LSL_Float mass, LSL_Float radius, LSL_Float lenght, LSL_Vector centerOfMass, LSL_Rotation lslrot) 4582 public void osSetInertiaAsCylinder(LSL_Float mass, LSL_Float radius, LSL_Float lenght, LSL_Vector centerOfMass, LSL_Rotation lslrot)
4577 { 4583 {
4584 m_host.AddScriptLPS(1);
4578 SceneObjectGroup sog = m_host.ParentGroup; 4585 SceneObjectGroup sog = m_host.ParentGroup;
4579 if(sog== null || sog.IsDeleted) 4586 if(sog== null || sog.IsDeleted)
4580 return; 4587 return;
@@ -4611,11 +4618,50 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4611 /// </summary> 4618 /// </summary>
4612 public void osClearInertia() 4619 public void osClearInertia()
4613 { 4620 {
4621 m_host.AddScriptLPS(1);
4614 SceneObjectGroup sog = m_host.ParentGroup; 4622 SceneObjectGroup sog = m_host.ParentGroup;
4615 if(sog== null || sog.IsDeleted) 4623 if(sog== null || sog.IsDeleted)
4616 return; 4624 return;
4617 4625
4618 sog.SetInertiaData(-1, Vector3.Zero, Vector3.Zero, Vector4.Zero ); 4626 sog.SetInertiaData(-1, Vector3.Zero, Vector3.Zero, Vector4.Zero );
4619 } 4627 }
4628
4629 /// <summary>
4630 /// teleports a object (full linkset)
4631 /// </summary>
4632 /// <param name="objectUUID">the id of the linkset to teleport</param>
4633 /// <param name="targetPos">target position</param>
4634 /// <param name="rotation"> a rotation to apply</param>
4635 /// <param name="stop">if TRUE (!=0) stop at destination</param>
4636 /// <remarks>
4637 /// only does teleport local to region
4638 /// object owner must have rights to run scripts on target location
4639 /// object owner must have rights to enter ojects on target location
4640 /// target location parcel must have enought free prims capacity for the linkset prims
4641 /// all avatars siting on the object must have access to target location
4642 /// has a cool down time. retries before expire reset it
4643 /// fail conditions are silent ignored
4644 /// </remarks>
4645 public void osObjectTeleport(LSL_Key objectUUID, LSL_Vector targetPos, LSL_Rotation rotation, LSL_Integer stop)
4646 {
4647 CheckThreatLevel(ThreatLevel.Severe, "osTeleportAgent");
4648 m_host.AddScriptLPS(1);
4649
4650 UUID objUUID;
4651 if (!UUID.TryParse(objectUUID, out objUUID))
4652 {
4653 OSSLShoutError("osObjectTeleport() invalid object Key");
4654 return;
4655 }
4656
4657 SceneObjectGroup sog = World.GetSceneObjectGroup(objUUID);
4658 if(sog== null || sog.IsDeleted)
4659 return;
4660
4661 UUID myid = m_host.ParentGroup.UUID;
4662
4663 sog.ObjectTeleport(myid, targetPos, rotation, stop != 0);
4664 // a delay here may break vehicles
4665 }
4620 } 4666 }
4621} 4667}
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs
index f76ff7f..4722fed 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs
@@ -495,5 +495,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
495 void osSetInertiaAsBox(LSL_Float mass, vector boxSize, vector centerOfMass, rotation rot); 495 void osSetInertiaAsBox(LSL_Float mass, vector boxSize, vector centerOfMass, rotation rot);
496 void osSetInertiaAsSphere(LSL_Float mass, LSL_Float radius, vector centerOfMass); 496 void osSetInertiaAsSphere(LSL_Float mass, LSL_Float radius, vector centerOfMass);
497 void osSetInertiaAsCylinder(LSL_Float mass, LSL_Float radius, LSL_Float lenght, vector centerOfMass,rotation lslrot); 497 void osSetInertiaAsCylinder(LSL_Float mass, LSL_Float radius, LSL_Float lenght, vector centerOfMass,rotation lslrot);
498
499 void osObjectTeleport(LSL_Key objectUUID, vector targetPos, rotation targetrotation, LSL_Integer stop);
498 } 500 }
499} 501}
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs
index 09337e5..37e7a17 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs
@@ -1140,5 +1140,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
1140 m_OSSL_Functions.osClearInertia(); 1140 m_OSSL_Functions.osClearInertia();
1141 } 1141 }
1142 1142
1143 public void osObjectTeleport(LSL_Key objectUUID, vector targetPos, rotation targetrotation, LSL_Integer stop)
1144 {
1145 m_OSSL_Functions.osObjectTeleport(objectUUID, targetPos, targetrotation, stop);
1146 }
1143 } 1147 }
1144} 1148}