diff options
Diffstat (limited to 'OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs')
-rw-r--r-- | OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | 72 |
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 6af3c1e..713f832 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | |||
@@ -4564,10 +4564,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
4564 | ScriptSleep(5000); | 4564 | ScriptSleep(5000); |
4565 | } | 4565 | } |
4566 | 4566 | ||
4567 | public void llTeleportAgent(string agent, string simname, LSL_Vector pos, LSL_Vector lookAt) | 4567 | public void llTeleportAgent(string agent, string destination, LSL_Vector pos, LSL_Vector lookAt) |
4568 | { | 4568 | { |
4569 | m_host.AddScriptLPS(1); | 4569 | m_host.AddScriptLPS(1); |
4570 | UUID agentId = new UUID(); | 4570 | UUID agentId = new UUID(); |
4571 | |||
4572 | Vector3 targetPos = new Vector3((float)pos.x, (float)pos.y, (float)pos.z); | ||
4573 | Vector3 targetLookAt = new Vector3((float)lookAt.x, (float)lookAt.y, (float)lookAt.z); | ||
4574 | |||
4571 | if (UUID.TryParse(agent, out agentId)) | 4575 | if (UUID.TryParse(agent, out agentId)) |
4572 | { | 4576 | { |
4573 | ScenePresence presence = World.GetScenePresence(agentId); | 4577 | ScenePresence presence = World.GetScenePresence(agentId); |
@@ -4576,26 +4580,84 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
4576 | // agent must not be a god | 4580 | // agent must not be a god |
4577 | if (presence.GodLevel >= 200) return; | 4581 | if (presence.GodLevel >= 200) return; |
4578 | 4582 | ||
4579 | if (simname == String.Empty) | 4583 | if (destination == String.Empty) |
4580 | simname = World.RegionInfo.RegionName; | 4584 | destination = World.RegionInfo.RegionName; |
4585 | |||
4586 | // agent must be over the owners land | ||
4587 | if (m_host.OwnerID == World.LandChannel.GetLandObject( | ||
4588 | presence.AbsolutePosition.X, presence.AbsolutePosition.Y).LandData.OwnerID) | ||
4589 | { | ||
4590 | DoLLTeleport(presence, destination, targetPos, targetLookAt); | ||
4591 | } | ||
4592 | else // or must be wearing the prim | ||
4593 | { | ||
4594 | if (m_host.ParentGroup.AttachmentPoint != 0 && m_host.OwnerID == presence.UUID) | ||
4595 | { | ||
4596 | DoLLTeleport(presence, destination, targetPos, targetLookAt); | ||
4597 | } | ||
4598 | } | ||
4599 | } | ||
4600 | } | ||
4601 | } | ||
4602 | |||
4603 | public void llTeleportAgentGlobalCoords(string agent, LSL_Vector global_coords, LSL_Vector pos, LSL_Vector lookAt) | ||
4604 | { | ||
4605 | m_host.AddScriptLPS(1); | ||
4606 | UUID agentId = new UUID(); | ||
4607 | |||
4608 | ulong regionHandle = Utils.UIntsToLong((uint)global_coords.x, (uint)global_coords.y); | ||
4609 | |||
4610 | Vector3 targetPos = new Vector3((float)pos.x, (float)pos.y, (float)pos.z); | ||
4611 | Vector3 targetLookAt = new Vector3((float)lookAt.x, (float)lookAt.y, (float)lookAt.z); | ||
4612 | if (UUID.TryParse(agent, out agentId)) | ||
4613 | { | ||
4614 | ScenePresence presence = World.GetScenePresence(agentId); | ||
4615 | if (presence != null && presence.PresenceType != PresenceType.Npc) | ||
4616 | { | ||
4617 | // agent must not be a god | ||
4618 | if (presence.GodLevel >= 200) return; | ||
4581 | 4619 | ||
4582 | // agent must be over the owners land | 4620 | // agent must be over the owners land |
4583 | if (m_host.OwnerID == World.LandChannel.GetLandObject( | 4621 | if (m_host.OwnerID == World.LandChannel.GetLandObject( |
4584 | presence.AbsolutePosition.X, presence.AbsolutePosition.Y).LandData.OwnerID) | 4622 | presence.AbsolutePosition.X, presence.AbsolutePosition.Y).LandData.OwnerID) |
4585 | { | 4623 | { |
4586 | 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); | 4624 | World.RequestTeleportLocation(presence.ControllingClient, regionHandle, targetPos, targetLookAt, (uint)TeleportFlags.ViaLocation); |
4587 | } | 4625 | } |
4588 | else // or must be wearing the prim | 4626 | else // or must be wearing the prim |
4589 | { | 4627 | { |
4590 | if (m_host.ParentGroup.AttachmentPoint != 0 && m_host.OwnerID == presence.UUID) | 4628 | if (m_host.ParentGroup.AttachmentPoint != 0 && m_host.OwnerID == presence.UUID) |
4591 | { | 4629 | { |
4592 | 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); | 4630 | World.RequestTeleportLocation(presence.ControllingClient, regionHandle, targetPos, targetLookAt, (uint)TeleportFlags.ViaLocation); |
4593 | } | 4631 | } |
4594 | } | 4632 | } |
4595 | } | 4633 | } |
4596 | } | 4634 | } |
4597 | } | 4635 | } |
4598 | 4636 | ||
4637 | private void DoLLTeleport(ScenePresence sp, string destination, Vector3 targetPos, Vector3 targetLookAt) | ||
4638 | { | ||
4639 | UUID assetID = KeyOrName(destination); | ||
4640 | |||
4641 | // The destinaion is not an asset ID and also doesn't name a landmark. | ||
4642 | // Use it as a sim name | ||
4643 | if (assetID == UUID.Zero) | ||
4644 | { | ||
4645 | World.RequestTeleportLocation(sp.ControllingClient, destination, targetPos, targetLookAt, (uint)TeleportFlags.ViaLocation); | ||
4646 | return; | ||
4647 | } | ||
4648 | |||
4649 | AssetBase lma = World.AssetService.Get(assetID.ToString()); | ||
4650 | if (lma == null) | ||
4651 | return; | ||
4652 | |||
4653 | if (lma.Type != (sbyte)AssetType.Landmark) | ||
4654 | return; | ||
4655 | |||
4656 | AssetLandmark lm = new AssetLandmark(lma); | ||
4657 | |||
4658 | World.RequestTeleportLocation(sp.ControllingClient, lm.RegionHandle, targetPos, targetLookAt, (uint)TeleportFlags.ViaLocation); | ||
4659 | } | ||
4660 | |||
4599 | public void llTextBox(string agent, string message, int chatChannel) | 4661 | public void llTextBox(string agent, string message, int chatChannel) |
4600 | { | 4662 | { |
4601 | IDialogModule dm = World.RequestModuleInterface<IDialogModule>(); | 4663 | IDialogModule dm = World.RequestModuleInterface<IDialogModule>(); |