diff --git a/OpenSim/Framework/AssetLandmark.cs b/OpenSim/Framework/AssetLandmark.cs index fe6f83540a..e0f541588d 100644 --- a/OpenSim/Framework/AssetLandmark.cs +++ b/OpenSim/Framework/AssetLandmark.cs @@ -35,6 +35,7 @@ namespace OpenSim.Framework public int Version; public LLVector3 Position; public LLUUID RegionID; + public ulong RegionHandle; public AssetLandmark(AssetBase a) { @@ -54,6 +55,7 @@ namespace OpenSim.Framework int.TryParse(parts[0].Substring(17, 1), out Version); LLUUID.TryParse(parts[1].Substring(10, 36), out RegionID); LLVector3.TryParse(parts[2].Substring(11, parts[2].Length - 11), out Position); + ulong.TryParse(parts[3].Substring(14, parts[3].Length - 14), out RegionHandle); } } } diff --git a/OpenSim/Framework/EstateSettings.cs b/OpenSim/Framework/EstateSettings.cs index 42154e9621..02b7f276b5 100644 --- a/OpenSim/Framework/EstateSettings.cs +++ b/OpenSim/Framework/EstateSettings.cs @@ -128,6 +128,7 @@ namespace OpenSim.Framework get { return m_regionFlags; } set { + //m_regionFlags = (Simulator.RegionFlags)0x400000; m_regionFlags = value; configMember.forceSetConfigurationOption("region_flags", ((uint)m_regionFlags).ToString()); } @@ -784,7 +785,7 @@ namespace OpenSim.Framework configMember.addConfigurationOption("redirect_grid_y", ConfigurationOption.ConfigurationTypes.TYPE_INT32, String.Empty, "0", true); configMember.addConfigurationOption("region_flags", ConfigurationOption.ConfigurationTypes.TYPE_UINT32, String.Empty, - "0", true); + "4194304", true); //The String value of RegionFlags.RestrictPushObject configMember.addConfigurationOption("sim_access", ConfigurationOption.ConfigurationTypes.TYPE_BYTE, String.Empty, "21", true); configMember.addConfigurationOption("sun_hour", ConfigurationOption.ConfigurationTypes.TYPE_FLOAT, String.Empty, "0", diff --git a/OpenSim/Framework/IClientAPI.cs b/OpenSim/Framework/IClientAPI.cs index c0f7fce167..75e6fcd5c4 100644 --- a/OpenSim/Framework/IClientAPI.cs +++ b/OpenSim/Framework/IClientAPI.cs @@ -260,6 +260,9 @@ namespace OpenSim.Framework public delegate void TeleportLocationRequest( IClientAPI remoteClient, ulong regionHandle, LLVector3 position, LLVector3 lookAt, uint flags); + public delegate void TeleportLandmarkRequest( + IClientAPI remoteClient, ulong regionHandle, LLVector3 position); + public delegate void DisconnectUser(); public delegate void RequestAvatarProperties(IClientAPI remoteClient, LLUUID avatarID); @@ -458,6 +461,7 @@ namespace OpenSim.Framework event DisconnectUser OnDisconnectUser; event RequestAvatarProperties OnRequestAvatarProperties; event SetAlwaysRun OnSetAlwaysRun; + event TeleportLandmarkRequest OnTeleportLandmarkRequest; event GenericCall4 OnDeRezObject; event Action OnRegionHandShakeReply; event GenericCall2 OnRequestWearables; diff --git a/OpenSim/Region/ClientStack/ClientView.cs b/OpenSim/Region/ClientStack/ClientView.cs index dba5b38110..9c56c52702 100644 --- a/OpenSim/Region/ClientStack/ClientView.cs +++ b/OpenSim/Region/ClientStack/ClientView.cs @@ -154,6 +154,7 @@ namespace OpenSim.Region.ClientStack private FetchInventory handlerAgentDataUpdateRequest = null; //OnAgentDataUpdateRequest; private FetchInventory handlerUserInfoRequest = null; //OnUserInfoRequest; private TeleportLocationRequest handlerSetStartLocationRequest = null; //OnSetStartLocationRequest; + private TeleportLandmarkRequest handlerTeleportLandmarkRequest = null; //OnTeleportLandmarkRequest; private LinkObjects handlerLinkObjects = null; //OnLinkObjects; private DelinkObjects handlerDelinkObjects = null; //OnDelinkObjects; private AddNewPrim handlerAddPrim = null; //OnAddPrim; @@ -716,6 +717,7 @@ namespace OpenSim.Region.ClientStack public event RequestMapBlocks OnRequestMapBlocks; public event RequestMapName OnMapNameRequest; public event TeleportLocationRequest OnTeleportLocationRequest; + public event TeleportLandmarkRequest OnTeleportLandmarkRequest; public event DisconnectUser OnDisconnectUser; public event RequestAvatarProperties OnRequestAvatarProperties; public event SetAlwaysRun OnSetAlwaysRun; @@ -4185,50 +4187,35 @@ namespace OpenSim.Region.ClientStack break; case PacketType.TeleportLandmarkRequest: TeleportLandmarkRequestPacket tpReq = (TeleportLandmarkRequestPacket)Pack; - - TeleportStartPacket tpStart = (TeleportStartPacket)PacketPool.Instance.GetPacket(PacketType.TeleportStart); - tpStart.Info.TeleportFlags = 8; // tp via lm - OutPacket(tpStart, ThrottleOutPacketType.Task); - - TeleportProgressPacket tpProgress = (TeleportProgressPacket)PacketPool.Instance.GetPacket(PacketType.TeleportProgress); - tpProgress.Info.Message = (new UTF8Encoding()).GetBytes("sending_landmark"); - tpProgress.Info.TeleportFlags = 8; - tpProgress.AgentData.AgentID = tpReq.Info.AgentID; - OutPacket(tpProgress, ThrottleOutPacketType.Task); - - // Fetch landmark LLUUID lmid = tpReq.Info.LandmarkID; AssetBase lma = m_assetCache.GetAsset(lmid, false); - if (lma != null) + + if(lma == null) { - AssetLandmark lm = new AssetLandmark(lma); + // Failed to find landmark + + TeleportCancelPacket tpCancel = (TeleportCancelPacket)PacketPool.Instance.GetPacket(PacketType.TeleportCancel); + tpCancel.Info.SessionID = tpReq.Info.SessionID; + tpCancel.Info.AgentID = tpReq.Info.AgentID; + OutPacket(tpCancel, ThrottleOutPacketType.Task); + } - if (lm.RegionID == m_scene.RegionInfo.RegionID) - { - TeleportLocalPacket tpLocal = (TeleportLocalPacket)PacketPool.Instance.GetPacket(PacketType.TeleportLocal); - - tpLocal.Info.AgentID = tpReq.Info.AgentID; - tpLocal.Info.TeleportFlags = 8; // Teleport via landmark - tpLocal.Info.LocationID = 2; - tpLocal.Info.Position = lm.Position; - OutPacket(tpLocal, ThrottleOutPacketType.Task); - } - else - { - TeleportCancelPacket tpCancel = (TeleportCancelPacket)PacketPool.Instance.GetPacket(PacketType.TeleportCancel); - tpCancel.Info.AgentID = tpReq.Info.AgentID; - tpCancel.Info.SessionID = tpReq.Info.SessionID; - OutPacket(tpCancel, ThrottleOutPacketType.Task); - } + AssetLandmark lm = new AssetLandmark(lma); + handlerTeleportLandmarkRequest = OnTeleportLandmarkRequest; + if (handlerTeleportLandmarkRequest != null) + { + handlerTeleportLandmarkRequest(this, lm.RegionHandle, lm.Position); } else { - Console.WriteLine("Cancelling Teleport - fetch asset not yet implemented"); + //no event handler so cancel request + TeleportCancelPacket tpCancel = (TeleportCancelPacket)PacketPool.Instance.GetPacket(PacketType.TeleportCancel); tpCancel.Info.AgentID = tpReq.Info.AgentID; tpCancel.Info.SessionID = tpReq.Info.SessionID; OutPacket(tpCancel, ThrottleOutPacketType.Task); + } break; case PacketType.TeleportLocationRequest: diff --git a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs index 97d09aa1cd..ff0f3a7f43 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs @@ -545,7 +545,20 @@ namespace OpenSim.Region.Environment.Scenes if (userInfo != null) { - AssetBase asset = CreateAsset(name, description, invType, assetType, null); + ScenePresence presence; + TryGetAvatar(remoteClient.AgentId, out presence); + byte[] data = null; + if(invType == 3 && presence != null) // libsecondlife.asset.assettype.landmark = 3 - needs to be turned into an enum + { + LLVector3 pos=presence.AbsolutePosition; + string strdata=String.Format("Landmark version 2\nregion_id {0}\nlocal_pos {1} {2} {3}\nregion_handle {4}\n", + presence.Scene.RegionInfo.RegionID, + pos.X, pos.Y, pos.Z, + presence.RegionHandle); + data=Encoding.ASCII.GetBytes(strdata); + } + + AssetBase asset = CreateAsset(name, description, invType, assetType, data); AssetCache.AddAsset(asset); CreateNewInventoryItem(remoteClient, folderID, callbackID, asset, nextOwnerMask); diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs index 464926d9f2..08cf3d86ce 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.cs @@ -1518,6 +1518,7 @@ namespace OpenSim.Region.Environment.Scenes client.OnRequestMapBlocks += RequestMapBlocks; client.OnUpdatePrimTexture += m_innerScene.UpdatePrimTexture; client.OnTeleportLocationRequest += RequestTeleportLocation; + client.OnTeleportLandmarkRequest += RequestTeleportLandmark; client.OnObjectSelect += SelectPrim; client.OnObjectDeselect += DeselectPrim; client.OnGrabUpdate += m_innerScene.MoveObject; @@ -2081,6 +2082,21 @@ namespace OpenSim.Region.Environment.Scenes } } + /// + /// Tries to teleport agent to landmark. + /// + /// + /// + /// + public void RequestTeleportLandmark(IClientAPI remoteClient, ulong regionHandle, LLVector3 position) + { + if (m_scenePresences.ContainsKey(remoteClient.AgentId)) + { + m_sceneGridService.RequestTeleportToLocation(m_scenePresences[remoteClient.AgentId], regionHandle, + position, LLVector3.Zero, 0); + } + } + /// /// Agent is crossing the border into a neighbouring region. Tell the neighbour about it! /// diff --git a/OpenSim/Region/Environment/Scenes/ScenePresence.cs b/OpenSim/Region/Environment/Scenes/ScenePresence.cs index 795224ebf1..8b8373d58c 100644 --- a/OpenSim/Region/Environment/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Environment/Scenes/ScenePresence.cs @@ -270,6 +270,7 @@ namespace OpenSim.Region.Environment.Scenes } m_pos = value; + m_parentPosition=new LLVector3(0, 0, 0); } } @@ -602,7 +603,10 @@ namespace OpenSim.Region.Environment.Scenes /// public void Teleport(LLVector3 pos) { + RemoveFromPhysicalScene(); + Velocity = new LLVector3(0, 0, 0); AbsolutePosition = pos; + AddToPhysicalScene(); SendTerseUpdateToAllClients(); } diff --git a/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs b/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs index d5dc9376cf..426ab7e62d 100644 --- a/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs +++ b/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs @@ -68,6 +68,7 @@ namespace OpenSim.Region.Examples.SimpleModule public event RequestMapBlocks OnRequestMapBlocks; public event RequestMapName OnMapNameRequest; public event TeleportLocationRequest OnTeleportLocationRequest; + public event TeleportLandmarkRequest OnTeleportLandmarkRequest; public event DisconnectUser OnDisconnectUser; public event RequestAvatarProperties OnRequestAvatarProperties; public event SetAlwaysRun OnSetAlwaysRun;