aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs')
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs72
1 files changed, 67 insertions, 5 deletions
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index 523a6ca..c3d4306 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -4732,10 +4732,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4732 ScriptSleep(5000); 4732 ScriptSleep(5000);
4733 } 4733 }
4734 4734
4735 public void llTeleportAgent(string agent, string simname, LSL_Vector pos, LSL_Vector lookAt) 4735 public void llTeleportAgent(string agent, string destination, LSL_Vector pos, LSL_Vector lookAt)
4736 { 4736 {
4737 m_host.AddScriptLPS(1); 4737 m_host.AddScriptLPS(1);
4738 UUID agentId = new UUID(); 4738 UUID agentId = new UUID();
4739
4740 Vector3 targetPos = new Vector3((float)pos.x, (float)pos.y, (float)pos.z);
4741 Vector3 targetLookAt = new Vector3((float)lookAt.x, (float)lookAt.y, (float)lookAt.z);
4742
4739 if (UUID.TryParse(agent, out agentId)) 4743 if (UUID.TryParse(agent, out agentId))
4740 { 4744 {
4741 ScenePresence presence = World.GetScenePresence(agentId); 4745 ScenePresence presence = World.GetScenePresence(agentId);
@@ -4744,26 +4748,84 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4744 // agent must not be a god 4748 // agent must not be a god
4745 if (presence.GodLevel >= 200) return; 4749 if (presence.GodLevel >= 200) return;
4746 4750
4747 if (simname == String.Empty) 4751 if (destination == String.Empty)
4748 simname = World.RegionInfo.RegionName; 4752 destination = World.RegionInfo.RegionName;
4753
4754 // agent must be over the owners land
4755 if (m_host.OwnerID == World.LandChannel.GetLandObject(
4756 presence.AbsolutePosition.X, presence.AbsolutePosition.Y).LandData.OwnerID)
4757 {
4758 DoLLTeleport(presence, destination, targetPos, targetLookAt);
4759 }
4760 else // or must be wearing the prim
4761 {
4762 if (m_host.ParentGroup.AttachmentPoint != 0 && m_host.OwnerID == presence.UUID)
4763 {
4764 DoLLTeleport(presence, destination, targetPos, targetLookAt);
4765 }
4766 }
4767 }
4768 }
4769 }
4770
4771 public void llTeleportAgentGlobalCoords(string agent, LSL_Vector global_coords, LSL_Vector pos, LSL_Vector lookAt)
4772 {
4773 m_host.AddScriptLPS(1);
4774 UUID agentId = new UUID();
4775
4776 ulong regionHandle = Utils.UIntsToLong((uint)global_coords.x, (uint)global_coords.y);
4777
4778 Vector3 targetPos = new Vector3((float)pos.x, (float)pos.y, (float)pos.z);
4779 Vector3 targetLookAt = new Vector3((float)lookAt.x, (float)lookAt.y, (float)lookAt.z);
4780 if (UUID.TryParse(agent, out agentId))
4781 {
4782 ScenePresence presence = World.GetScenePresence(agentId);
4783 if (presence != null && presence.PresenceType != PresenceType.Npc)
4784 {
4785 // agent must not be a god
4786 if (presence.GodLevel >= 200) return;
4749 4787
4750 // agent must be over the owners land 4788 // agent must be over the owners land
4751 if (m_host.OwnerID == World.LandChannel.GetLandObject( 4789 if (m_host.OwnerID == World.LandChannel.GetLandObject(
4752 presence.AbsolutePosition.X, presence.AbsolutePosition.Y).LandData.OwnerID) 4790 presence.AbsolutePosition.X, presence.AbsolutePosition.Y).LandData.OwnerID)
4753 { 4791 {
4754 World.RequestTeleportLocation(presence.ControllingClient, simname, new Vector3((float)pos.x, (float)pos.y, (float)pos.z), new Vector3((float)lookAt.x, (float)lookAt.y, (float)lookAt.z), (uint)TeleportFlags.ViaLocation); 4792 World.RequestTeleportLocation(presence.ControllingClient, regionHandle, targetPos, targetLookAt, (uint)TeleportFlags.ViaLocation);
4755 } 4793 }
4756 else // or must be wearing the prim 4794 else // or must be wearing the prim
4757 { 4795 {
4758 if (m_host.ParentGroup.AttachmentPoint != 0 && m_host.OwnerID == presence.UUID) 4796 if (m_host.ParentGroup.AttachmentPoint != 0 && m_host.OwnerID == presence.UUID)
4759 { 4797 {
4760 World.RequestTeleportLocation(presence.ControllingClient, simname, new Vector3((float)pos.x, (float)pos.y, (float)pos.z), new Vector3((float)lookAt.x, (float)lookAt.y, (float)lookAt.z), (uint)TeleportFlags.ViaLocation); 4798 World.RequestTeleportLocation(presence.ControllingClient, regionHandle, targetPos, targetLookAt, (uint)TeleportFlags.ViaLocation);
4761 } 4799 }
4762 } 4800 }
4763 } 4801 }
4764 } 4802 }
4765 } 4803 }
4766 4804
4805 private void DoLLTeleport(ScenePresence sp, string destination, Vector3 targetPos, Vector3 targetLookAt)
4806 {
4807 UUID assetID = KeyOrName(destination);
4808
4809 // The destinaion is not an asset ID and also doesn't name a landmark.
4810 // Use it as a sim name
4811 if (assetID == UUID.Zero)
4812 {
4813 World.RequestTeleportLocation(sp.ControllingClient, destination, targetPos, targetLookAt, (uint)TeleportFlags.ViaLocation);
4814 return;
4815 }
4816
4817 AssetBase lma = World.AssetService.Get(assetID.ToString());
4818 if (lma == null)
4819 return;
4820
4821 if (lma.Type != (sbyte)AssetType.Landmark)
4822 return;
4823
4824 AssetLandmark lm = new AssetLandmark(lma);
4825
4826 World.RequestTeleportLocation(sp.ControllingClient, lm.RegionHandle, targetPos, targetLookAt, (uint)TeleportFlags.ViaLocation);
4827 }
4828
4767 public void llTextBox(string agent, string message, int chatChannel) 4829 public void llTextBox(string agent, string message, int chatChannel)
4768 { 4830 {
4769 IDialogModule dm = World.RequestModuleInterface<IDialogModule>(); 4831 IDialogModule dm = World.RequestModuleInterface<IDialogModule>();