diff options
author | Charles Krinke | 2008-08-16 19:20:14 +0000 |
---|---|---|
committer | Charles Krinke | 2008-08-16 19:20:14 +0000 |
commit | d9cc908471922a1239bb8a757e07084072852982 (patch) | |
tree | 3390870e039a51194efa9c2e1e20142c9266dddd /OpenSim/Region | |
parent | * Fix a rare maptile shading error, terrain difference mod 1 = 0 + abs = oops. (diff) | |
download | opensim-SC-d9cc908471922a1239bb8a757e07084072852982.zip opensim-SC-d9cc908471922a1239bb8a757e07084072852982.tar.gz opensim-SC-d9cc908471922a1239bb8a757e07084072852982.tar.bz2 opensim-SC-d9cc908471922a1239bb8a757e07084072852982.tar.xz |
Mantis#1965. Thank you kindly, HomerHorwitz for a patch that:
Places touched:
- Added two events for in-packets to LLCLientView: RegionHandleRequest and
ParcelInfoRequest
- Added sending of two out-packets to LLCLientView: RegionIDAndHandleReply and
ParcelInfoReply.
- Scene handles the RegionHandleRequest, LandManagementModule the
ParcelInfoRequest
- Added inter-region request for LandData by RegionHandle and local position.
This was implemented as XML-RPC request. The returned LandData isn't
complete, it only contains the data necessary for answering the
ParcelInfoRequest
- Added new CAPS (0009) for RemoteParcelRequest and some methods for LandData
handling to LandManagementModule
- Added methods for fake parcelID creation and parsing to Util
- Fixed missing implementation of interface methods.
- Added new file:
OpenSim/Framework/Communications/Capabilities/LLSDRemoteParcelResponse.cs
NOTE: This is part of the patch, too.
Due to the many places touched, I would consider this patch as experimental.
Diffstat (limited to '')
8 files changed, 356 insertions, 2 deletions
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs index 69c1dac..b616acb 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs | |||
@@ -229,6 +229,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
229 | // private RequestAsset handlerRequestAsset = null; // OnRequestAsset; | 229 | // private RequestAsset handlerRequestAsset = null; // OnRequestAsset; |
230 | private UUIDNameRequest handlerTeleportHomeRequest = null; | 230 | private UUIDNameRequest handlerTeleportHomeRequest = null; |
231 | 231 | ||
232 | private RegionHandleRequest handlerRegionHandleRequest = null; // OnRegionHandleRequest | ||
233 | private ParcelInfoRequest handlerParcelInfoRequest = null; // OnParcelInfoRequest | ||
234 | |||
232 | private ScriptAnswer handlerScriptAnswer = null; | 235 | private ScriptAnswer handlerScriptAnswer = null; |
233 | private RequestPayPrice handlerRequestPayPrice = null; | 236 | private RequestPayPrice handlerRequestPayPrice = null; |
234 | private ObjectDeselect handlerObjectDetach = null; | 237 | private ObjectDeselect handlerObjectDetach = null; |
@@ -916,6 +919,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
916 | public event EstateBlueBoxMessageRequest OnEstateBlueBoxMessageRequest; | 919 | public event EstateBlueBoxMessageRequest OnEstateBlueBoxMessageRequest; |
917 | public event EstateDebugRegionRequest OnEstateDebugRegionRequest; | 920 | public event EstateDebugRegionRequest OnEstateDebugRegionRequest; |
918 | public event EstateTeleportOneUserHomeRequest OnEstateTeleportOneUserHomeRequest; | 921 | public event EstateTeleportOneUserHomeRequest OnEstateTeleportOneUserHomeRequest; |
922 | public event RegionHandleRequest OnRegionHandleRequest; | ||
923 | public event ParcelInfoRequest OnParcelInfoRequest; | ||
919 | public event ScriptReset OnScriptReset; | 924 | public event ScriptReset OnScriptReset; |
920 | public event GetScriptRunning OnGetScriptRunning; | 925 | public event GetScriptRunning OnGetScriptRunning; |
921 | public event SetScriptRunning OnSetScriptRunning; | 926 | public event SetScriptRunning OnSetScriptRunning; |
@@ -5296,6 +5301,26 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
5296 | 5301 | ||
5297 | #region Parcel related packets | 5302 | #region Parcel related packets |
5298 | 5303 | ||
5304 | case PacketType.RegionHandleRequest: | ||
5305 | RegionHandleRequestPacket rhrPack = (RegionHandleRequestPacket)Pack; | ||
5306 | |||
5307 | handlerRegionHandleRequest = OnRegionHandleRequest; | ||
5308 | if (handlerRegionHandleRequest != null) | ||
5309 | { | ||
5310 | handlerRegionHandleRequest(this, rhrPack.RequestBlock.RegionID); | ||
5311 | } | ||
5312 | break; | ||
5313 | |||
5314 | case PacketType.ParcelInfoRequest: | ||
5315 | ParcelInfoRequestPacket pirPack = (ParcelInfoRequestPacket)Pack; | ||
5316 | |||
5317 | handlerParcelInfoRequest = OnParcelInfoRequest; | ||
5318 | if (handlerParcelInfoRequest != null) | ||
5319 | { | ||
5320 | handlerParcelInfoRequest(this, pirPack.Data.ParcelID); | ||
5321 | } | ||
5322 | break; | ||
5323 | |||
5299 | case PacketType.ParcelAccessListRequest: | 5324 | case PacketType.ParcelAccessListRequest: |
5300 | ParcelAccessListRequestPacket requestPacket = (ParcelAccessListRequestPacket)Pack; | 5325 | ParcelAccessListRequestPacket requestPacket = (ParcelAccessListRequestPacket)Pack; |
5301 | 5326 | ||
@@ -6294,5 +6319,45 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
6294 | } | 6319 | } |
6295 | 6320 | ||
6296 | #endregion | 6321 | #endregion |
6322 | |||
6323 | public void SendRegionHandle(LLUUID regionID, ulong handle) { | ||
6324 | RegionIDAndHandleReplyPacket reply = (RegionIDAndHandleReplyPacket)PacketPool.Instance.GetPacket(PacketType.RegionIDAndHandleReply); | ||
6325 | reply.ReplyBlock.RegionID = regionID; | ||
6326 | reply.ReplyBlock.RegionHandle = handle; | ||
6327 | OutPacket(reply, ThrottleOutPacketType.Land); | ||
6328 | } | ||
6329 | |||
6330 | public void SendParcelInfo(RegionInfo info, LandData land, LLUUID parcelID, uint x, uint y) | ||
6331 | { | ||
6332 | ParcelInfoReplyPacket reply = (ParcelInfoReplyPacket)PacketPool.Instance.GetPacket(PacketType.ParcelInfoReply); | ||
6333 | reply.AgentData.AgentID = m_agentId; | ||
6334 | reply.Data.ParcelID = parcelID; | ||
6335 | reply.Data.OwnerID = land.OwnerID; | ||
6336 | reply.Data.Name = Helpers.StringToField(land.Name); | ||
6337 | reply.Data.Desc = Helpers.StringToField(land.Description); | ||
6338 | reply.Data.ActualArea = land.Area; | ||
6339 | reply.Data.BillableArea = land.Area; // TODO: what is this? | ||
6340 | |||
6341 | // Bit 0: Mature, bit 7: on sale, other bits: no idea | ||
6342 | reply.Data.Flags = (byte)( | ||
6343 | ((land.Flags & (uint)Parcel.ParcelFlags.MaturePublish) != 0 ? (1 << 0) : 0) + | ||
6344 | ((land.Flags & (uint)Parcel.ParcelFlags.ForSale) != 0 ? (1 << 7) : 0)); | ||
6345 | |||
6346 | LLVector3 pos = land.UserLocation; | ||
6347 | if (pos.Equals(LLVector3.Zero)) | ||
6348 | { | ||
6349 | pos = (land.AABBMax + land.AABBMin) * 0.5f; | ||
6350 | } | ||
6351 | reply.Data.GlobalX = info.RegionLocX * Constants.RegionSize + x; | ||
6352 | reply.Data.GlobalY = info.RegionLocY * Constants.RegionSize + y; | ||
6353 | reply.Data.GlobalZ = pos.Z; | ||
6354 | reply.Data.SimName = Helpers.StringToField(info.RegionName); | ||
6355 | reply.Data.SnapshotID = land.SnapshotID; | ||
6356 | reply.Data.Dwell = 0; // TODO: not implemented yet | ||
6357 | reply.Data.SalePrice = land.SalePrice; | ||
6358 | reply.Data.AuctionID = (int)land.AuctionID; | ||
6359 | |||
6360 | OutPacket(reply, ThrottleOutPacketType.Land); | ||
6361 | } | ||
6297 | } | 6362 | } |
6298 | } | 6363 | } |
diff --git a/OpenSim/Region/Communications/Local/LocalBackEndServices.cs b/OpenSim/Region/Communications/Local/LocalBackEndServices.cs index 5cf62f3..8149bcc 100644 --- a/OpenSim/Region/Communications/Local/LocalBackEndServices.cs +++ b/OpenSim/Region/Communications/Local/LocalBackEndServices.cs | |||
@@ -491,5 +491,20 @@ namespace OpenSim.Region.Communications.Local | |||
491 | 491 | ||
492 | return false; | 492 | return false; |
493 | } | 493 | } |
494 | |||
495 | public LandData RequestLandData (ulong regionHandle, uint x, uint y) | ||
496 | { | ||
497 | m_log.DebugFormat("[INTERREGION STANDALONE] requests land data in {0}, at {1}, {2}", | ||
498 | regionHandle, x, y); | ||
499 | |||
500 | if (m_regionListeners.ContainsKey(regionHandle)) | ||
501 | { | ||
502 | LandData land = m_regionListeners[regionHandle].TriggerGetLandData(x, y); | ||
503 | return land; | ||
504 | } | ||
505 | |||
506 | m_log.Debug("[INTERREGION STANDALONE] didn't find land data locally."); | ||
507 | return null; | ||
508 | } | ||
494 | } | 509 | } |
495 | } | 510 | } |
diff --git a/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs b/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs index 65b8763..9a4c166 100644 --- a/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs +++ b/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs | |||
@@ -28,6 +28,7 @@ | |||
28 | using System; | 28 | using System; |
29 | using System.Collections; | 29 | using System.Collections; |
30 | using System.Collections.Generic; | 30 | using System.Collections.Generic; |
31 | using System.IO; | ||
31 | using System.Net; | 32 | using System.Net; |
32 | using System.Net.Sockets; | 33 | using System.Net.Sockets; |
33 | using System.Reflection; | 34 | using System.Reflection; |
@@ -92,6 +93,7 @@ namespace OpenSim.Region.Communications.OGS1 | |||
92 | httpServer.AddXmlRPCHandler("expect_user", ExpectUser); | 93 | httpServer.AddXmlRPCHandler("expect_user", ExpectUser); |
93 | httpServer.AddXmlRPCHandler("logoff_user", LogOffUser); | 94 | httpServer.AddXmlRPCHandler("logoff_user", LogOffUser); |
94 | httpServer.AddXmlRPCHandler("check", PingCheckReply); | 95 | httpServer.AddXmlRPCHandler("check", PingCheckReply); |
96 | httpServer.AddXmlRPCHandler("land_data", LandData); | ||
95 | 97 | ||
96 | StartRemoting(); | 98 | StartRemoting(); |
97 | } | 99 | } |
@@ -1624,5 +1626,104 @@ namespace OpenSim.Region.Communications.OGS1 | |||
1624 | } | 1626 | } |
1625 | } | 1627 | } |
1626 | } | 1628 | } |
1629 | |||
1630 | public LandData RequestLandData (ulong regionHandle, uint x, uint y) | ||
1631 | { | ||
1632 | m_log.DebugFormat("[OGS1 GRID SERVICES] requests land data in {0}, at {1}, {2}", | ||
1633 | regionHandle, x, y); | ||
1634 | LandData landData = m_localBackend.RequestLandData(regionHandle, x, y); | ||
1635 | if (landData == null) | ||
1636 | { | ||
1637 | Hashtable hash = new Hashtable(); | ||
1638 | hash["region_handle"] = regionHandle.ToString(); | ||
1639 | hash["x"] = x.ToString(); | ||
1640 | hash["y"] = y.ToString(); | ||
1641 | |||
1642 | IList paramList = new ArrayList(); | ||
1643 | paramList.Add(hash); | ||
1644 | |||
1645 | // this might be cached, as we probably requested it just a moment ago... | ||
1646 | RegionInfo info = RequestNeighbourInfo(regionHandle); | ||
1647 | |||
1648 | try | ||
1649 | { | ||
1650 | XmlRpcRequest request = new XmlRpcRequest("land_data", paramList); | ||
1651 | string uri = "http://" + info.ExternalEndPoint.Address + ":" + info.HttpPort + "/"; | ||
1652 | XmlRpcResponse response = request.Send(uri, 10000); | ||
1653 | if (response.IsFault) | ||
1654 | { | ||
1655 | m_log.ErrorFormat("[OGS1 GRID SERVICES] remote call returned an error: {0}", response.FaultString); | ||
1656 | } | ||
1657 | else | ||
1658 | { | ||
1659 | hash = (Hashtable)response.Value; | ||
1660 | try { | ||
1661 | landData = new LandData(); | ||
1662 | landData.AABBMax = LLVector3.Parse((string)hash["AABBMax"]); | ||
1663 | landData.AABBMin = LLVector3.Parse((string)hash["AABBMin"]); | ||
1664 | landData.Area = Convert.ToInt32(hash["Area"]); | ||
1665 | landData.AuctionID = Convert.ToUInt32(hash["AuctionID"]); | ||
1666 | landData.Description = (string)hash["Description"]; | ||
1667 | landData.Flags = Convert.ToUInt32(hash["Flags"]); | ||
1668 | landData.GlobalID = new LLUUID((string)hash["GlobalID"]); | ||
1669 | landData.Name = (string)hash["Name"]; | ||
1670 | landData.OwnerID = new LLUUID((string)hash["OwnerID"]); | ||
1671 | landData.SalePrice = Convert.ToInt32(hash["SalePrice"]); | ||
1672 | landData.SnapshotID = new LLUUID((string)hash["SnapshotID"]); | ||
1673 | landData.UserLocation = LLVector3.Parse((string)hash["UserLocation"]); | ||
1674 | m_log.DebugFormat("[OGS1 GRID SERVICES] Got land data for parcel {0}", landData.Name); | ||
1675 | } | ||
1676 | catch (Exception e) | ||
1677 | { | ||
1678 | m_log.Error("[OGS1 GRID SERVICES] Got exception while parsing land-data:", e); | ||
1679 | } | ||
1680 | } | ||
1681 | } | ||
1682 | catch (Exception e) | ||
1683 | { | ||
1684 | m_log.ErrorFormat("[OGS1 GRID SERVICES] Couldn't contact region {0}: {1}", regionHandle, e); | ||
1685 | } | ||
1686 | } | ||
1687 | return landData; | ||
1688 | } | ||
1689 | |||
1690 | // Grid Request Processing | ||
1691 | /// <summary> | ||
1692 | /// Someone asked us about parcel-information | ||
1693 | /// </summary> | ||
1694 | /// <param name="request"></param> | ||
1695 | /// <returns></returns> | ||
1696 | public XmlRpcResponse LandData(XmlRpcRequest request) | ||
1697 | { | ||
1698 | Hashtable requestData = (Hashtable)request.Params[0]; | ||
1699 | ulong regionHandle = Convert.ToUInt64(requestData["region_handle"]); | ||
1700 | uint x = Convert.ToUInt32(requestData["x"]); | ||
1701 | uint y = Convert.ToUInt32(requestData["y"]); | ||
1702 | m_log.DebugFormat("[OGS1 GRID SERVICES]: Got XML reqeuest for land data at {0}, {1} in region {2}", x, y, regionHandle); | ||
1703 | |||
1704 | LandData landData = m_localBackend.RequestLandData(regionHandle, x, y); | ||
1705 | Hashtable hash = new Hashtable(); | ||
1706 | if (landData != null) | ||
1707 | { | ||
1708 | // for now, only push out the data we need for answering a ParcelInfoReqeust | ||
1709 | // FIXME: these Replace calls are necessary as LLVector3.Parse can't parse vectors with spaces in them. Can be removed as soon as we switch to a newer version | ||
1710 | hash["AABBMax"] = landData.AABBMax.ToString().Replace(" ", ""); | ||
1711 | hash["AABBMin"] = landData.AABBMin.ToString().Replace(" ", ""); | ||
1712 | hash["Area"] = landData.Area.ToString(); | ||
1713 | hash["AuctionID"] = landData.AuctionID.ToString(); | ||
1714 | hash["Description"] = landData.Description; | ||
1715 | hash["Flags"] = landData.Flags.ToString(); | ||
1716 | hash["GlobalID"] = landData.GlobalID.ToString(); | ||
1717 | hash["Name"] = landData.Name; | ||
1718 | hash["OwnerID"] = landData.OwnerID.ToString(); | ||
1719 | hash["SalePrice"] = landData.SalePrice.ToString(); | ||
1720 | hash["SnapshotID"] = landData.SnapshotID.ToString(); | ||
1721 | hash["UserLocation"] = landData.UserLocation.ToString().Replace(" ", ""); | ||
1722 | } | ||
1723 | |||
1724 | XmlRpcResponse response = new XmlRpcResponse(); | ||
1725 | response.Value = hash; | ||
1726 | return response; | ||
1727 | } | ||
1627 | } | 1728 | } |
1628 | } | 1729 | } |
diff --git a/OpenSim/Region/Environment/Modules/World/Land/LandManagementModule.cs b/OpenSim/Region/Environment/Modules/World/Land/LandManagementModule.cs index 92eda80..46f108e 100644 --- a/OpenSim/Region/Environment/Modules/World/Land/LandManagementModule.cs +++ b/OpenSim/Region/Environment/Modules/World/Land/LandManagementModule.cs | |||
@@ -26,19 +26,30 @@ | |||
26 | */ | 26 | */ |
27 | 27 | ||
28 | using System; | 28 | using System; |
29 | using System.Collections; | ||
29 | using System.Collections.Generic; | 30 | using System.Collections.Generic; |
31 | using System.Reflection; | ||
30 | using libsecondlife; | 32 | using libsecondlife; |
33 | using log4net; | ||
31 | using Nini.Config; | 34 | using Nini.Config; |
32 | using OpenSim.Region.Environment.Interfaces; | 35 | using OpenSim.Region.Environment.Interfaces; |
33 | using OpenSim.Region.Environment.Scenes; | 36 | using OpenSim.Region.Environment.Scenes; |
34 | using OpenSim.Framework; | 37 | using OpenSim.Framework; |
38 | using OpenSim.Framework.Servers; | ||
39 | using OpenSim.Framework.Communications.Capabilities; | ||
35 | using OpenSim.Region.Physics.Manager; | 40 | using OpenSim.Region.Physics.Manager; |
36 | using Axiom.Math; | 41 | using Axiom.Math; |
42 | using Caps = OpenSim.Framework.Communications.Capabilities.Caps; | ||
37 | 43 | ||
38 | namespace OpenSim.Region.Environment.Modules.World.Land | 44 | namespace OpenSim.Region.Environment.Modules.World.Land |
39 | { | 45 | { |
40 | public class LandManagementModule : IRegionModule | 46 | public class LandManagementModule : IRegionModule |
41 | { | 47 | { |
48 | private static readonly ILog m_log = | ||
49 | LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
50 | |||
51 | private static readonly string remoteParcelRequestPath = "0009/"; | ||
52 | |||
42 | private LandChannel landChannel; | 53 | private LandChannel landChannel; |
43 | private Scene m_scene; | 54 | private Scene m_scene; |
44 | 55 | ||
@@ -75,6 +86,7 @@ namespace OpenSim.Region.Environment.Modules.World.Land | |||
75 | m_scene.EventManager.OnSetAllowForcefulBan += this.SetAllowedForcefulBans; | 86 | m_scene.EventManager.OnSetAllowForcefulBan += this.SetAllowedForcefulBans; |
76 | m_scene.EventManager.OnRequestParcelPrimCountUpdate += this.PerformParcelPrimCountUpdate; | 87 | m_scene.EventManager.OnRequestParcelPrimCountUpdate += this.PerformParcelPrimCountUpdate; |
77 | m_scene.EventManager.OnParcelPrimCountTainted += this.SetPrimsTainted; | 88 | m_scene.EventManager.OnParcelPrimCountTainted += this.SetPrimsTainted; |
89 | m_scene.EventManager.OnRegisterCaps += this.OnRegisterCaps; | ||
78 | 90 | ||
79 | lock (m_scene) | 91 | lock (m_scene) |
80 | { | 92 | { |
@@ -95,7 +107,7 @@ namespace OpenSim.Region.Environment.Modules.World.Land | |||
95 | client.OnParcelAccessListUpdateRequest += new ParcelAccessListUpdateRequest(handleParcelAccessUpdateRequest); | 107 | client.OnParcelAccessListUpdateRequest += new ParcelAccessListUpdateRequest(handleParcelAccessUpdateRequest); |
96 | client.OnParcelAbandonRequest += new ParcelAbandonRequest(handleParcelAbandonRequest); | 108 | client.OnParcelAbandonRequest += new ParcelAbandonRequest(handleParcelAbandonRequest); |
97 | client.OnParcelReclaim += new ParcelReclaim(handleParcelReclaim); | 109 | client.OnParcelReclaim += new ParcelReclaim(handleParcelReclaim); |
98 | 110 | client.OnParcelInfoRequest += new ParcelInfoRequest(handleParcelInfo); | |
99 | if (m_scene.Entities.ContainsKey(client.AgentId)) | 111 | if (m_scene.Entities.ContainsKey(client.AgentId)) |
100 | { | 112 | { |
101 | SendLandUpdate((ScenePresence)m_scene.Entities[client.AgentId], true); | 113 | SendLandUpdate((ScenePresence)m_scene.Entities[client.AgentId], true); |
@@ -1084,6 +1096,112 @@ namespace OpenSim.Region.Environment.Modules.World.Land | |||
1084 | public void setSimulatorObjectMaxOverride(overrideSimulatorMaxPrimCountDelegate overrideDel) | 1096 | public void setSimulatorObjectMaxOverride(overrideSimulatorMaxPrimCountDelegate overrideDel) |
1085 | { | 1097 | { |
1086 | } | 1098 | } |
1099 | |||
1100 | #region CAPS handler | ||
1101 | private void OnRegisterCaps(LLUUID agentID, Caps caps) | ||
1102 | { | ||
1103 | string capsBase = "/CAPS/" + caps.CapsObjectPath; | ||
1104 | caps.RegisterHandler("RemoteParcelRequest", | ||
1105 | new RestStreamHandler("POST", capsBase + remoteParcelRequestPath, | ||
1106 | delegate(string request, string path, string param, | ||
1107 | OSHttpRequest httpRequest, OSHttpResponse httpResponse) | ||
1108 | { | ||
1109 | return RemoteParcelRequest(request, path, param, agentID, caps); | ||
1110 | })); | ||
1111 | } | ||
1112 | |||
1113 | // we cheat here: As we don't have (and want) a grid-global parcel-store, we can't return the | ||
1114 | // "real" parcelID, because we wouldn't be able to map that to the region the parcel belongs to. | ||
1115 | // So, we create a "fake" parcelID by using the regionHandle (64 bit), and the local (integer) x | ||
1116 | // and y coordinate (each 8 bit), encoded in a LLUUID (128 bit). | ||
1117 | // | ||
1118 | // Request format: | ||
1119 | // <llsd> | ||
1120 | // <map> | ||
1121 | // <key>location</key> | ||
1122 | // <array> | ||
1123 | // <real>1.23</real> | ||
1124 | // <real>45..6</real> | ||
1125 | // <real>78.9</real> | ||
1126 | // </array> | ||
1127 | // <key>region_id</key> | ||
1128 | // <uuid>xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx</uuid> | ||
1129 | // </map> | ||
1130 | // </llsd> | ||
1131 | private string RemoteParcelRequest(string request, string path, string param, LLUUID agentID, Caps caps) | ||
1132 | { | ||
1133 | LLUUID parcelID = LLUUID.Zero; | ||
1134 | try | ||
1135 | { | ||
1136 | Hashtable hash = new Hashtable(); | ||
1137 | hash = (Hashtable)LLSD.LLSDDeserialize(Helpers.StringToField(request)); | ||
1138 | if(hash.ContainsKey("region_id") && hash.ContainsKey("location")) | ||
1139 | { | ||
1140 | LLUUID regionID = (LLUUID)hash["region_id"]; | ||
1141 | ArrayList list = (ArrayList)hash["location"]; | ||
1142 | uint x = (uint)(double)list[0]; | ||
1143 | uint y = (uint)(double)list[1]; | ||
1144 | if(hash.ContainsKey("region_handle")) | ||
1145 | { | ||
1146 | // if you do a "About Landmark" on a landmark a second time, the viewer sends the | ||
1147 | // region_handle it got earlier via RegionHandleRequest | ||
1148 | ulong regionHandle = Helpers.BytesToUInt64((byte[])hash["region_handle"]); | ||
1149 | parcelID = Util.BuildFakeParcelID(regionHandle, x, y); | ||
1150 | } | ||
1151 | else if(regionID == m_scene.RegionInfo.RegionID) | ||
1152 | { | ||
1153 | // a parcel request for a local parcel => no need to query the grid | ||
1154 | parcelID = Util.BuildFakeParcelID(m_scene.RegionInfo.RegionHandle, x, y); | ||
1155 | } | ||
1156 | else | ||
1157 | { | ||
1158 | // a parcel request for a parcel in another region. Ask the grid about the region | ||
1159 | RegionInfo info = m_scene.CommsManager.GridService.RequestNeighbourInfo(regionID); | ||
1160 | if(info != null) parcelID = Util.BuildFakeParcelID(info.RegionHandle, x, y); | ||
1161 | } | ||
1162 | } | ||
1163 | } | ||
1164 | catch (LLSD.LLSDParseException e) | ||
1165 | { | ||
1166 | m_log.ErrorFormat("[LAND] Fetch error: {0}", e.Message); | ||
1167 | m_log.ErrorFormat("[LAND] ... in request {0}", request); | ||
1168 | } | ||
1169 | catch(InvalidCastException) | ||
1170 | { | ||
1171 | m_log.ErrorFormat("[LAND] Wrong type in request {0}", request); | ||
1172 | } | ||
1173 | |||
1174 | LLSDRemoteParcelResponse response = new LLSDRemoteParcelResponse(); | ||
1175 | response.parcel_id = parcelID; | ||
1176 | m_log.DebugFormat("[LAND] got parcelID {0}", parcelID); | ||
1177 | |||
1178 | return LLSDHelpers.SerialiseLLSDReply(response); | ||
1179 | } | ||
1180 | |||
1181 | #endregion | ||
1182 | |||
1183 | private void handleParcelInfo(IClientAPI remoteClient, LLUUID parcelID) | ||
1184 | { | ||
1185 | if(parcelID == LLUUID.Zero) return; | ||
1186 | |||
1187 | // assume we've got the parcelID we just computed in RemoteParcelRequest | ||
1188 | ulong regionHandle; | ||
1189 | uint x, y; | ||
1190 | Util.ParseFakeParcelID(parcelID, out regionHandle, out x, out y); | ||
1191 | m_log.DebugFormat("[LAND] got parcelinfo request for regionHandle {0}, x/y {1}/{2}", regionHandle, x, y); | ||
1192 | |||
1193 | LandData landData; | ||
1194 | if(regionHandle == m_scene.RegionInfo.RegionHandle) landData = this.GetLandObject(x, y).landData; | ||
1195 | else landData = m_scene.CommsManager.GridService.RequestLandData(regionHandle, x, y); | ||
1196 | |||
1197 | if(landData != null) | ||
1198 | { | ||
1199 | // we need to transfer the fake parcelID, not the one in landData, so the viewer can match it to the landmark. | ||
1200 | m_log.Debug("[LAND] got parcelinfo; sending"); | ||
1201 | remoteClient.SendParcelInfo(m_scene.RegionInfo, landData, parcelID, x, y); | ||
1202 | } | ||
1203 | else m_log.Debug("[LAND] got no parcelinfo; not sending"); | ||
1204 | } | ||
1087 | } | 1205 | } |
1088 | 1206 | ||
1089 | } | 1207 | } |
diff --git a/OpenSim/Region/Environment/Modules/World/NPC/NPCAvatar.cs b/OpenSim/Region/Environment/Modules/World/NPC/NPCAvatar.cs index 5853b87..7b05027 100644 --- a/OpenSim/Region/Environment/Modules/World/NPC/NPCAvatar.cs +++ b/OpenSim/Region/Environment/Modules/World/NPC/NPCAvatar.cs | |||
@@ -302,6 +302,10 @@ namespace OpenSim.Region.Environment.Modules.World.NPC | |||
302 | public event UpdateVector OnAutoPilotGo; | 302 | public event UpdateVector OnAutoPilotGo; |
303 | 303 | ||
304 | public event TerrainUnacked OnUnackedTerrain; | 304 | public event TerrainUnacked OnUnackedTerrain; |
305 | |||
306 | public event RegionHandleRequest OnRegionHandleRequest; | ||
307 | public event ParcelInfoRequest OnParcelInfoRequest; | ||
308 | |||
305 | #pragma warning restore 67 | 309 | #pragma warning restore 67 |
306 | 310 | ||
307 | #endregion | 311 | #endregion |
@@ -832,5 +836,13 @@ namespace OpenSim.Region.Environment.Modules.World.NPC | |||
832 | public void SendClearFollowCamProperties (LLUUID objectID) | 836 | public void SendClearFollowCamProperties (LLUUID objectID) |
833 | { | 837 | { |
834 | } | 838 | } |
839 | |||
840 | public void SendRegionHandle (LLUUID regoinID, ulong handle) | ||
841 | { | ||
842 | } | ||
843 | |||
844 | public void SendParcelInfo (RegionInfo info, LandData land, LLUUID parcelID, uint x, uint y) | ||
845 | { | ||
846 | } | ||
835 | } | 847 | } |
836 | } | 848 | } |
diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs index 2e89e4b..9b0b53a 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.cs | |||
@@ -2170,6 +2170,8 @@ namespace OpenSim.Region.Environment.Scenes | |||
2170 | client.OnScriptReset += ProcessScriptReset; | 2170 | client.OnScriptReset += ProcessScriptReset; |
2171 | client.OnGetScriptRunning += GetScriptRunning; | 2171 | client.OnGetScriptRunning += GetScriptRunning; |
2172 | client.OnSetScriptRunning += SetScriptRunning; | 2172 | client.OnSetScriptRunning += SetScriptRunning; |
2173 | |||
2174 | client.OnRegionHandleRequest += RegionHandleRequest; | ||
2173 | 2175 | ||
2174 | client.OnUnackedTerrain += TerrainUnAcked; | 2176 | client.OnUnackedTerrain += TerrainUnAcked; |
2175 | 2177 | ||
@@ -2502,6 +2504,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
2502 | m_sceneGridService.OnRemoveKnownRegionFromAvatar += HandleRemoveKnownRegionsFromAvatar; | 2504 | m_sceneGridService.OnRemoveKnownRegionFromAvatar += HandleRemoveKnownRegionsFromAvatar; |
2503 | m_sceneGridService.OnLogOffUser += HandleLogOffUserFromGrid; | 2505 | m_sceneGridService.OnLogOffUser += HandleLogOffUserFromGrid; |
2504 | m_sceneGridService.KillObject += SendKillObject; | 2506 | m_sceneGridService.KillObject += SendKillObject; |
2507 | m_sceneGridService.OnGetLandData += GetLandData; | ||
2505 | } | 2508 | } |
2506 | 2509 | ||
2507 | /// <summary> | 2510 | /// <summary> |
@@ -2518,6 +2521,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
2518 | m_sceneGridService.OnExpectUser -= NewUserConnection; | 2521 | m_sceneGridService.OnExpectUser -= NewUserConnection; |
2519 | m_sceneGridService.OnAvatarCrossingIntoRegion -= AgentCrossing; | 2522 | m_sceneGridService.OnAvatarCrossingIntoRegion -= AgentCrossing; |
2520 | m_sceneGridService.OnCloseAgentConnection -= CloseConnection; | 2523 | m_sceneGridService.OnCloseAgentConnection -= CloseConnection; |
2524 | m_sceneGridService.OnGetLandData -= GetLandData; | ||
2521 | 2525 | ||
2522 | m_sceneGridService.Close(); | 2526 | m_sceneGridService.Close(); |
2523 | } | 2527 | } |
@@ -3436,6 +3440,12 @@ namespace OpenSim.Region.Environment.Scenes | |||
3436 | return LandChannel.GetLandObject(x, y).landData; | 3440 | return LandChannel.GetLandObject(x, y).landData; |
3437 | } | 3441 | } |
3438 | 3442 | ||
3443 | public LandData GetLandData(uint x, uint y) | ||
3444 | { | ||
3445 | m_log.DebugFormat("[SCENE] returning land for {0},{1}", x, y); | ||
3446 | return LandChannel.GetLandObject((int)x, (int)y).landData; | ||
3447 | } | ||
3448 | |||
3439 | public void SetLandMusicURL(float x, float y, string url) | 3449 | public void SetLandMusicURL(float x, float y, string url) |
3440 | { | 3450 | { |
3441 | ILandObject land = LandChannel.GetLandObject(x, y); | 3451 | ILandObject land = LandChannel.GetLandObject(x, y); |
@@ -3833,6 +3843,14 @@ namespace OpenSim.Region.Environment.Scenes | |||
3833 | // client.SendParcelMediaCommand((uint)(4), ParcelMediaCommandEnum.Play, 0); | 3843 | // client.SendParcelMediaCommand((uint)(4), ParcelMediaCommandEnum.Play, 0); |
3834 | // }); | 3844 | // }); |
3835 | } | 3845 | } |
3846 | |||
3847 | public void RegionHandleRequest(IClientAPI client, LLUUID regionID) | ||
3848 | { | ||
3849 | RegionInfo info; | ||
3850 | if(regionID == RegionInfo.RegionID) info = RegionInfo; | ||
3851 | else info = CommsManager.GridService.RequestNeighbourInfo(regionID); | ||
3852 | if(info != null) client.SendRegionHandle(regionID, info.RegionHandle); | ||
3853 | } | ||
3836 | 3854 | ||
3837 | 3855 | ||
3838 | public void TerrainUnAcked(IClientAPI client, int patchX, int patchY) | 3856 | public void TerrainUnAcked(IClientAPI client, int patchX, int patchY) |
diff --git a/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs index 008d67a..35a7434 100644 --- a/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs +++ b/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs | |||
@@ -59,7 +59,8 @@ namespace OpenSim.Region.Environment.Scenes | |||
59 | public event ChildAgentUpdate OnChildAgentUpdate; | 59 | public event ChildAgentUpdate OnChildAgentUpdate; |
60 | public event RemoveKnownRegionsFromAvatarList OnRemoveKnownRegionFromAvatar; | 60 | public event RemoveKnownRegionsFromAvatarList OnRemoveKnownRegionFromAvatar; |
61 | public event LogOffUser OnLogOffUser; | 61 | public event LogOffUser OnLogOffUser; |
62 | 62 | public event GetLandData OnGetLandData; | |
63 | |||
63 | private AgentCrossing handlerAvatarCrossingIntoRegion = null; // OnAvatarCrossingIntoRegion; | 64 | private AgentCrossing handlerAvatarCrossingIntoRegion = null; // OnAvatarCrossingIntoRegion; |
64 | private ExpectUserDelegate handlerExpectUser = null; // OnExpectUser; | 65 | private ExpectUserDelegate handlerExpectUser = null; // OnExpectUser; |
65 | private ExpectPrimDelegate handlerExpectPrim = null; // OnExpectPrim; | 66 | private ExpectPrimDelegate handlerExpectPrim = null; // OnExpectPrim; |
@@ -69,6 +70,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
69 | private ChildAgentUpdate handlerChildAgentUpdate = null; // OnChildAgentUpdate; | 70 | private ChildAgentUpdate handlerChildAgentUpdate = null; // OnChildAgentUpdate; |
70 | private RemoveKnownRegionsFromAvatarList handlerRemoveKnownRegionFromAvatar = null; // OnRemoveKnownRegionFromAvatar; | 71 | private RemoveKnownRegionsFromAvatarList handlerRemoveKnownRegionFromAvatar = null; // OnRemoveKnownRegionFromAvatar; |
71 | private LogOffUser handlerLogOffUser = null; | 72 | private LogOffUser handlerLogOffUser = null; |
73 | private GetLandData handlerGetLandData = null; // OnGetLandData | ||
72 | 74 | ||
73 | public KillObjectDelegate KillObject; | 75 | public KillObjectDelegate KillObject; |
74 | public string _debugRegionName = String.Empty; | 76 | public string _debugRegionName = String.Empty; |
@@ -108,6 +110,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
108 | regionCommsHost.OnRegionUp += newRegionUp; | 110 | regionCommsHost.OnRegionUp += newRegionUp; |
109 | regionCommsHost.OnChildAgentUpdate += ChildAgentUpdate; | 111 | regionCommsHost.OnChildAgentUpdate += ChildAgentUpdate; |
110 | regionCommsHost.OnLogOffUser += GridLogOffUser; | 112 | regionCommsHost.OnLogOffUser += GridLogOffUser; |
113 | regionCommsHost.OnGetLandData += FetchLandData; | ||
111 | } | 114 | } |
112 | else | 115 | else |
113 | { | 116 | { |
@@ -131,6 +134,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
131 | regionCommsHost.OnExpectPrim -= IncomingPrimCrossing; | 134 | regionCommsHost.OnExpectPrim -= IncomingPrimCrossing; |
132 | regionCommsHost.OnAvatarCrossingIntoRegion -= AgentCrossing; | 135 | regionCommsHost.OnAvatarCrossingIntoRegion -= AgentCrossing; |
133 | regionCommsHost.OnCloseAgentConnection -= CloseConnection; | 136 | regionCommsHost.OnCloseAgentConnection -= CloseConnection; |
137 | regionCommsHost.OnGetLandData -= FetchLandData; | ||
134 | m_commsProvider.GridService.DeregisterRegion(m_regionInfo); | 138 | m_commsProvider.GridService.DeregisterRegion(m_regionInfo); |
135 | regionCommsHost = null; | 139 | regionCommsHost = null; |
136 | } | 140 | } |
@@ -227,6 +231,16 @@ namespace OpenSim.Region.Environment.Scenes | |||
227 | return false; | 231 | return false; |
228 | } | 232 | } |
229 | 233 | ||
234 | protected LandData FetchLandData(uint x, uint y) | ||
235 | { | ||
236 | handlerGetLandData = OnGetLandData; | ||
237 | if (handlerGetLandData != null) | ||
238 | { | ||
239 | return handlerGetLandData(x, y); | ||
240 | } | ||
241 | return null; | ||
242 | } | ||
243 | |||
230 | #endregion | 244 | #endregion |
231 | 245 | ||
232 | #region Inform Client of Neighbours | 246 | #region Inform Client of Neighbours |
diff --git a/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs b/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs index a7d2ef3..61ea966 100644 --- a/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs +++ b/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs | |||
@@ -204,6 +204,9 @@ namespace OpenSim.Region.Examples.SimpleModule | |||
204 | 204 | ||
205 | public event TerrainUnacked OnUnackedTerrain; | 205 | public event TerrainUnacked OnUnackedTerrain; |
206 | 206 | ||
207 | public event RegionHandleRequest OnRegionHandleRequest; | ||
208 | public event ParcelInfoRequest OnParcelInfoRequest; | ||
209 | |||
207 | #pragma warning restore 67 | 210 | #pragma warning restore 67 |
208 | 211 | ||
209 | private LLUUID myID = LLUUID.Random(); | 212 | private LLUUID myID = LLUUID.Random(); |
@@ -832,5 +835,13 @@ namespace OpenSim.Region.Examples.SimpleModule | |||
832 | public void SendClearFollowCamProperties (LLUUID objectID) | 835 | public void SendClearFollowCamProperties (LLUUID objectID) |
833 | { | 836 | { |
834 | } | 837 | } |
838 | |||
839 | public void SendRegionHandle (LLUUID regoinID, ulong handle) | ||
840 | { | ||
841 | } | ||
842 | |||
843 | public void SendParcelInfo (RegionInfo info, LandData land, LLUUID parcelID, uint x, uint y) | ||
844 | { | ||
845 | } | ||
835 | } | 846 | } |
836 | } | 847 | } |