aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs')
-rw-r--r--OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs266
1 files changed, 140 insertions, 126 deletions
diff --git a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs
index 76ff6da..d2b5cb1 100644
--- a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs
+++ b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs
@@ -36,18 +36,20 @@ using OpenSim.Framework;
36using OpenSim.Framework.Capabilities; 36using OpenSim.Framework.Capabilities;
37using OpenSim.Framework.Servers; 37using OpenSim.Framework.Servers;
38using OpenSim.Framework.Servers.HttpServer; 38using OpenSim.Framework.Servers.HttpServer;
39using OpenSim.Services.Interfaces;
39using OpenSim.Region.Framework.Interfaces; 40using OpenSim.Region.Framework.Interfaces;
40using OpenSim.Region.Framework.Scenes; 41using OpenSim.Region.Framework.Scenes;
41using OpenSim.Region.Physics.Manager; 42using OpenSim.Region.Physics.Manager;
42using Caps=OpenSim.Framework.Capabilities.Caps; 43using Caps=OpenSim.Framework.Capabilities.Caps;
44using GridRegion = OpenSim.Services.Interfaces.GridRegion;
43 45
44namespace OpenSim.Region.CoreModules.World.Land 46namespace OpenSim.Region.CoreModules.World.Land
45{ 47{
46 // used for caching 48 // used for caching
47 internal class ExtendedLandData { 49 internal class ExtendedLandData {
48 public LandData landData; 50 public LandData LandData;
49 public ulong regionHandle; 51 public ulong RegionHandle;
50 public uint x, y; 52 public uint X, Y;
51 } 53 }
52 54
53 public class LandManagementModule : INonSharedRegionModule 55 public class LandManagementModule : INonSharedRegionModule
@@ -189,7 +191,7 @@ namespace OpenSim.Region.CoreModules.World.Land
189 { 191 {
190 if (m_landList.ContainsKey(local_id)) 192 if (m_landList.ContainsKey(local_id))
191 { 193 {
192 m_landList[local_id].landData = newData; 194 m_landList[local_id].LandData = newData;
193 m_scene.EventManager.TriggerLandObjectUpdated((uint)local_id, m_landList[local_id]); 195 m_scene.EventManager.TriggerLandObjectUpdated((uint)local_id, m_landList[local_id]);
194 } 196 }
195 } 197 }
@@ -216,12 +218,12 @@ namespace OpenSim.Region.CoreModules.World.Land
216 218
217 ILandObject fullSimParcel = new LandObject(UUID.Zero, false, m_scene); 219 ILandObject fullSimParcel = new LandObject(UUID.Zero, false, m_scene);
218 220
219 fullSimParcel.setLandBitmap(fullSimParcel.getSquareLandBitmap(0, 0, (int)Constants.RegionSize, (int)Constants.RegionSize)); 221 fullSimParcel.SetLandBitmap(fullSimParcel.GetSquareLandBitmap(0, 0, (int)Constants.RegionSize, (int)Constants.RegionSize));
220 if (m_scene.RegionInfo.EstateSettings.EstateOwner != UUID.Zero) 222 if (m_scene.RegionInfo.EstateSettings.EstateOwner != UUID.Zero)
221 fullSimParcel.landData.OwnerID = m_scene.RegionInfo.EstateSettings.EstateOwner; 223 fullSimParcel.LandData.OwnerID = m_scene.RegionInfo.EstateSettings.EstateOwner;
222 else 224 else
223 fullSimParcel.landData.OwnerID = m_scene.RegionInfo.MasterAvatarAssignedUUID; 225 fullSimParcel.LandData.OwnerID = m_scene.RegionInfo.MasterAvatarAssignedUUID;
224 fullSimParcel.landData.ClaimDate = Util.UnixTimeSinceEpoch(); 226 fullSimParcel.LandData.ClaimDate = Util.UnixTimeSinceEpoch();
225 AddLandObject(fullSimParcel); 227 AddLandObject(fullSimParcel);
226 } 228 }
227 229
@@ -287,11 +289,11 @@ namespace OpenSim.Region.CoreModules.World.Land
287 { 289 {
288 if (avatar.AbsolutePosition.Z < LandChannel.BAN_LINE_SAFETY_HIEGHT) 290 if (avatar.AbsolutePosition.Z < LandChannel.BAN_LINE_SAFETY_HIEGHT)
289 { 291 {
290 if (parcelAvatarIsEntering.isBannedFromLand(avatar.UUID)) 292 if (parcelAvatarIsEntering.IsBannedFromLand(avatar.UUID))
291 { 293 {
292 SendYouAreBannedNotice(avatar); 294 SendYouAreBannedNotice(avatar);
293 } 295 }
294 else if (parcelAvatarIsEntering.isRestrictedFromLand(avatar.UUID)) 296 else if (parcelAvatarIsEntering.IsRestrictedFromLand(avatar.UUID))
295 { 297 {
296 avatar.ControllingClient.SendAlertMessage( 298 avatar.ControllingClient.SendAlertMessage(
297 "You are not allowed on this parcel because the land owner has restricted access. For now, you can enter, but please respect the land owner's decisions (or he can ban you!)."); 299 "You are not allowed on this parcel because the land owner has restricted access. For now, you can enter, but please respect the land owner's decisions (or he can ban you!).");
@@ -319,14 +321,14 @@ namespace OpenSim.Region.CoreModules.World.Land
319 List<ILandObject> checkLandParcels = ParcelsNearPoint(presence.AbsolutePosition); 321 List<ILandObject> checkLandParcels = ParcelsNearPoint(presence.AbsolutePosition);
320 foreach (ILandObject checkBan in checkLandParcels) 322 foreach (ILandObject checkBan in checkLandParcels)
321 { 323 {
322 if (checkBan.isBannedFromLand(avatar.AgentId)) 324 if (checkBan.IsBannedFromLand(avatar.AgentId))
323 { 325 {
324 checkBan.sendLandProperties((int)ParcelPropertiesStatus.CollisionBanned, false, (int)ParcelResult.Single, avatar); 326 checkBan.SendLandProperties((int)ParcelPropertiesStatus.CollisionBanned, false, (int)ParcelResult.Single, avatar);
325 return; //Only send one 327 return; //Only send one
326 } 328 }
327 if (checkBan.isRestrictedFromLand(avatar.AgentId)) 329 if (checkBan.IsRestrictedFromLand(avatar.AgentId))
328 { 330 {
329 checkBan.sendLandProperties((int)ParcelPropertiesStatus.CollisionNotOnAccessList, false, (int)ParcelResult.Single, avatar); 331 checkBan.SendLandProperties((int)ParcelPropertiesStatus.CollisionNotOnAccessList, false, (int)ParcelResult.Single, avatar);
330 return; //Only send one 332 return; //Only send one
331 } 333 }
332 } 334 }
@@ -346,19 +348,19 @@ namespace OpenSim.Region.CoreModules.World.Land
346 { 348 {
347 if (!avatar.IsChildAgent) 349 if (!avatar.IsChildAgent)
348 { 350 {
349 over.sendLandUpdateToClient(avatar.ControllingClient); 351 over.SendLandUpdateToClient(avatar.ControllingClient);
350 m_scene.EventManager.TriggerAvatarEnteringNewParcel(avatar, over.landData.LocalID, 352 m_scene.EventManager.TriggerAvatarEnteringNewParcel(avatar, over.LandData.LocalID,
351 m_scene.RegionInfo.RegionID); 353 m_scene.RegionInfo.RegionID);
352 } 354 }
353 } 355 }
354 356
355 if (avatar.currentParcelUUID != over.landData.GlobalID) 357 if (avatar.currentParcelUUID != over.LandData.GlobalID)
356 { 358 {
357 if (!avatar.IsChildAgent) 359 if (!avatar.IsChildAgent)
358 { 360 {
359 over.sendLandUpdateToClient(avatar.ControllingClient); 361 over.SendLandUpdateToClient(avatar.ControllingClient);
360 avatar.currentParcelUUID = over.landData.GlobalID; 362 avatar.currentParcelUUID = over.LandData.GlobalID;
361 m_scene.EventManager.TriggerAvatarEnteringNewParcel(avatar, over.landData.LocalID, 363 m_scene.EventManager.TriggerAvatarEnteringNewParcel(avatar, over.LandData.LocalID,
362 m_scene.RegionInfo.RegionID); 364 m_scene.RegionInfo.RegionID);
363 } 365 }
364 } 366 }
@@ -384,16 +386,16 @@ namespace OpenSim.Region.CoreModules.World.Land
384 if (clientAvatar.AbsolutePosition.Z < LandChannel.BAN_LINE_SAFETY_HIEGHT && 386 if (clientAvatar.AbsolutePosition.Z < LandChannel.BAN_LINE_SAFETY_HIEGHT &&
385 clientAvatar.sentMessageAboutRestrictedParcelFlyingDown) 387 clientAvatar.sentMessageAboutRestrictedParcelFlyingDown)
386 { 388 {
387 EventManagerOnAvatarEnteringNewParcel(clientAvatar, parcel.landData.LocalID, 389 EventManagerOnAvatarEnteringNewParcel(clientAvatar, parcel.LandData.LocalID,
388 m_scene.RegionInfo.RegionID); 390 m_scene.RegionInfo.RegionID);
389 //They are going under the safety line! 391 //They are going under the safety line!
390 if (!parcel.isBannedFromLand(clientAvatar.UUID)) 392 if (!parcel.IsBannedFromLand(clientAvatar.UUID))
391 { 393 {
392 clientAvatar.sentMessageAboutRestrictedParcelFlyingDown = false; 394 clientAvatar.sentMessageAboutRestrictedParcelFlyingDown = false;
393 } 395 }
394 } 396 }
395 else if (clientAvatar.AbsolutePosition.Z < LandChannel.BAN_LINE_SAFETY_HIEGHT && 397 else if (clientAvatar.AbsolutePosition.Z < LandChannel.BAN_LINE_SAFETY_HIEGHT &&
396 parcel.isBannedFromLand(clientAvatar.UUID)) 398 parcel.IsBannedFromLand(clientAvatar.UUID))
397 { 399 {
398 SendYouAreBannedNotice(clientAvatar); 400 SendYouAreBannedNotice(clientAvatar);
399 } 401 }
@@ -407,7 +409,7 @@ namespace OpenSim.Region.CoreModules.World.Land
407 ILandObject over = GetLandObject(avatar.AbsolutePosition.X, avatar.AbsolutePosition.Y); 409 ILandObject over = GetLandObject(avatar.AbsolutePosition.X, avatar.AbsolutePosition.Y);
408 if (over != null) 410 if (over != null)
409 { 411 {
410 if (!over.isBannedFromLand(avatar.UUID) || avatar.AbsolutePosition.Z >= LandChannel.BAN_LINE_SAFETY_HIEGHT) 412 if (!over.IsBannedFromLand(avatar.UUID) || avatar.AbsolutePosition.Z >= LandChannel.BAN_LINE_SAFETY_HIEGHT)
411 { 413 {
412 avatar.lastKnownAllowedPosition = 414 avatar.lastKnownAllowedPosition =
413 new Vector3(avatar.AbsolutePosition.X, avatar.AbsolutePosition.Y, avatar.AbsolutePosition.Z); 415 new Vector3(avatar.AbsolutePosition.X, avatar.AbsolutePosition.Y, avatar.AbsolutePosition.Z);
@@ -427,7 +429,7 @@ namespace OpenSim.Region.CoreModules.World.Land
427 429
428 if (land != null) 430 if (land != null)
429 { 431 {
430 m_landList[landLocalID].sendAccessList(agentID, sessionID, flags, sequenceID, remote_client); 432 m_landList[landLocalID].SendAccessList(agentID, sessionID, flags, sequenceID, remote_client);
431 } 433 }
432 } 434 }
433 435
@@ -443,9 +445,9 @@ namespace OpenSim.Region.CoreModules.World.Land
443 445
444 if (land != null) 446 if (land != null)
445 { 447 {
446 if (agentID == land.landData.OwnerID) 448 if (agentID == land.LandData.OwnerID)
447 { 449 {
448 land.updateAccessList(flags, entries, remote_client); 450 land.UpdateAccessList(flags, entries, remote_client);
449 } 451 }
450 } 452 }
451 else 453 else
@@ -474,9 +476,9 @@ namespace OpenSim.Region.CoreModules.World.Land
474 lock (m_landList) 476 lock (m_landList)
475 { 477 {
476 int newLandLocalID = ++m_lastLandLocalID; 478 int newLandLocalID = ++m_lastLandLocalID;
477 new_land.landData.LocalID = newLandLocalID; 479 new_land.LandData.LocalID = newLandLocalID;
478 480
479 bool[,] landBitmap = new_land.getLandBitmap(); 481 bool[,] landBitmap = new_land.GetLandBitmap();
480 for (int x = 0; x < landArrayMax; x++) 482 for (int x = 0; x < landArrayMax; x++)
481 { 483 {
482 for (int y = 0; y < landArrayMax; y++) 484 for (int y = 0; y < landArrayMax; y++)
@@ -491,7 +493,7 @@ namespace OpenSim.Region.CoreModules.World.Land
491 m_landList.Add(newLandLocalID, new_land); 493 m_landList.Add(newLandLocalID, new_land);
492 } 494 }
493 495
494 new_land.forceUpdateLandInfo(); 496 new_land.ForceUpdateLandInfo();
495 m_scene.EventManager.TriggerLandObjectAdded(new_land); 497 m_scene.EventManager.TriggerLandObjectAdded(new_land);
496 return new_land; 498 return new_land;
497 } 499 }
@@ -518,14 +520,14 @@ namespace OpenSim.Region.CoreModules.World.Land
518 } 520 }
519 } 521 }
520 522
521 m_scene.EventManager.TriggerLandObjectRemoved(m_landList[local_id].landData.GlobalID); 523 m_scene.EventManager.TriggerLandObjectRemoved(m_landList[local_id].LandData.GlobalID);
522 m_landList.Remove(local_id); 524 m_landList.Remove(local_id);
523 } 525 }
524 } 526 }
525 527
526 private void performFinalLandJoin(ILandObject master, ILandObject slave) 528 private void performFinalLandJoin(ILandObject master, ILandObject slave)
527 { 529 {
528 bool[,] landBitmapSlave = slave.getLandBitmap(); 530 bool[,] landBitmapSlave = slave.GetLandBitmap();
529 lock (m_landList) 531 lock (m_landList)
530 { 532 {
531 for (int x = 0; x < 64; x++) 533 for (int x = 0; x < 64; x++)
@@ -534,14 +536,14 @@ namespace OpenSim.Region.CoreModules.World.Land
534 { 536 {
535 if (landBitmapSlave[x, y]) 537 if (landBitmapSlave[x, y])
536 { 538 {
537 m_landIDList[x, y] = master.landData.LocalID; 539 m_landIDList[x, y] = master.LandData.LocalID;
538 } 540 }
539 } 541 }
540 } 542 }
541 } 543 }
542 544
543 removeLandObject(slave.landData.LocalID); 545 removeLandObject(slave.LandData.LocalID);
544 UpdateLandObject(master.landData.LocalID, master.landData); 546 UpdateLandObject(master.LandData.LocalID, master.LandData);
545 } 547 }
546 548
547 public ILandObject GetLandObject(int parcelLocalID) 549 public ILandObject GetLandObject(int parcelLocalID)
@@ -628,7 +630,7 @@ namespace OpenSim.Region.CoreModules.World.Land
628 { 630 {
629 foreach (LandObject p in m_landList.Values) 631 foreach (LandObject p in m_landList.Values)
630 { 632 {
631 p.resetLandPrimCounts(); 633 p.ResetLandPrimCounts();
632 } 634 }
633 } 635 }
634 } 636 }
@@ -649,7 +651,7 @@ namespace OpenSim.Region.CoreModules.World.Land
649 ILandObject landUnderPrim = GetLandObject(position.X, position.Y); 651 ILandObject landUnderPrim = GetLandObject(position.X, position.Y);
650 if (landUnderPrim != null) 652 if (landUnderPrim != null)
651 { 653 {
652 landUnderPrim.addPrimToCount(obj); 654 landUnderPrim.AddPrimToCount(obj);
653 } 655 }
654 } 656 }
655 657
@@ -660,7 +662,7 @@ namespace OpenSim.Region.CoreModules.World.Land
660 { 662 {
661 foreach (LandObject p in m_landList.Values) 663 foreach (LandObject p in m_landList.Values)
662 { 664 {
663 p.removePrimFromCount(obj); 665 p.RemovePrimFromCount(obj);
664 } 666 }
665 } 667 }
666 } 668 }
@@ -673,15 +675,15 @@ namespace OpenSim.Region.CoreModules.World.Land
673 { 675 {
674 foreach (LandObject p in m_landList.Values) 676 foreach (LandObject p in m_landList.Values)
675 { 677 {
676 if (!landOwnersAndParcels.ContainsKey(p.landData.OwnerID)) 678 if (!landOwnersAndParcels.ContainsKey(p.LandData.OwnerID))
677 { 679 {
678 List<LandObject> tempList = new List<LandObject>(); 680 List<LandObject> tempList = new List<LandObject>();
679 tempList.Add(p); 681 tempList.Add(p);
680 landOwnersAndParcels.Add(p.landData.OwnerID, tempList); 682 landOwnersAndParcels.Add(p.LandData.OwnerID, tempList);
681 } 683 }
682 else 684 else
683 { 685 {
684 landOwnersAndParcels[p.landData.OwnerID].Add(p); 686 landOwnersAndParcels[p.LandData.OwnerID].Add(p);
685 } 687 }
686 } 688 }
687 } 689 }
@@ -692,15 +694,15 @@ namespace OpenSim.Region.CoreModules.World.Land
692 int simPrims = 0; 694 int simPrims = 0;
693 foreach (LandObject p in landOwnersAndParcels[owner]) 695 foreach (LandObject p in landOwnersAndParcels[owner])
694 { 696 {
695 simArea += p.landData.Area; 697 simArea += p.LandData.Area;
696 simPrims += p.landData.OwnerPrims + p.landData.OtherPrims + p.landData.GroupPrims + 698 simPrims += p.LandData.OwnerPrims + p.LandData.OtherPrims + p.LandData.GroupPrims +
697 p.landData.SelectedPrims; 699 p.LandData.SelectedPrims;
698 } 700 }
699 701
700 foreach (LandObject p in landOwnersAndParcels[owner]) 702 foreach (LandObject p in landOwnersAndParcels[owner])
701 { 703 {
702 p.landData.SimwideArea = simArea; 704 p.LandData.SimwideArea = simArea;
703 p.landData.SimwidePrims = simPrims; 705 p.LandData.SimwidePrims = simPrims;
704 } 706 }
705 } 707 }
706 } 708 }
@@ -777,26 +779,26 @@ namespace OpenSim.Region.CoreModules.World.Land
777 779
778 //Lets create a new land object with bitmap activated at that point (keeping the old land objects info) 780 //Lets create a new land object with bitmap activated at that point (keeping the old land objects info)
779 ILandObject newLand = startLandObject.Copy(); 781 ILandObject newLand = startLandObject.Copy();
780 newLand.landData.Name = newLand.landData.Name; 782 newLand.LandData.Name = newLand.LandData.Name;
781 newLand.landData.GlobalID = UUID.Random(); 783 newLand.LandData.GlobalID = UUID.Random();
782 784
783 newLand.setLandBitmap(newLand.getSquareLandBitmap(start_x, start_y, end_x, end_y)); 785 newLand.SetLandBitmap(newLand.GetSquareLandBitmap(start_x, start_y, end_x, end_y));
784 786
785 //Now, lets set the subdivision area of the original to false 787 //Now, lets set the subdivision area of the original to false
786 int startLandObjectIndex = startLandObject.landData.LocalID; 788 int startLandObjectIndex = startLandObject.LandData.LocalID;
787 lock (m_landList) 789 lock (m_landList)
788 { 790 {
789 m_landList[startLandObjectIndex].setLandBitmap( 791 m_landList[startLandObjectIndex].SetLandBitmap(
790 newLand.modifyLandBitmapSquare(startLandObject.getLandBitmap(), start_x, start_y, end_x, end_y, false)); 792 newLand.ModifyLandBitmapSquare(startLandObject.GetLandBitmap(), start_x, start_y, end_x, end_y, false));
791 m_landList[startLandObjectIndex].forceUpdateLandInfo(); 793 m_landList[startLandObjectIndex].ForceUpdateLandInfo();
792 } 794 }
793 795
794 EventManagerOnParcelPrimCountTainted(); 796 EventManagerOnParcelPrimCountTainted();
795 797
796 //Now add the new land object 798 //Now add the new land object
797 ILandObject result = AddLandObject(newLand); 799 ILandObject result = AddLandObject(newLand);
798 UpdateLandObject(startLandObject.landData.LocalID, startLandObject.landData); 800 UpdateLandObject(startLandObject.LandData.LocalID, startLandObject.LandData);
799 result.sendLandUpdateToAvatarsOverMe(); 801 result.SendLandUpdateToAvatarsOverMe();
800 } 802 }
801 803
802 /// <summary> 804 /// <summary>
@@ -844,7 +846,7 @@ namespace OpenSim.Region.CoreModules.World.Land
844 } 846 }
845 foreach (ILandObject p in selectedLandObjects) 847 foreach (ILandObject p in selectedLandObjects)
846 { 848 {
847 if (p.landData.OwnerID != masterLandObject.landData.OwnerID) 849 if (p.LandData.OwnerID != masterLandObject.LandData.OwnerID)
848 { 850 {
849 return; 851 return;
850 } 852 }
@@ -854,14 +856,14 @@ namespace OpenSim.Region.CoreModules.World.Land
854 { 856 {
855 foreach (ILandObject slaveLandObject in selectedLandObjects) 857 foreach (ILandObject slaveLandObject in selectedLandObjects)
856 { 858 {
857 m_landList[masterLandObject.landData.LocalID].setLandBitmap( 859 m_landList[masterLandObject.LandData.LocalID].SetLandBitmap(
858 slaveLandObject.mergeLandBitmaps(masterLandObject.getLandBitmap(), slaveLandObject.getLandBitmap())); 860 slaveLandObject.MergeLandBitmaps(masterLandObject.GetLandBitmap(), slaveLandObject.GetLandBitmap()));
859 performFinalLandJoin(masterLandObject, slaveLandObject); 861 performFinalLandJoin(masterLandObject, slaveLandObject);
860 } 862 }
861 } 863 }
862 EventManagerOnParcelPrimCountTainted(); 864 EventManagerOnParcelPrimCountTainted();
863 865
864 masterLandObject.sendLandUpdateToAvatarsOverMe(); 866 masterLandObject.SendLandUpdateToAvatarsOverMe();
865 } 867 }
866 868
867 #endregion 869 #endregion
@@ -892,19 +894,19 @@ namespace OpenSim.Region.CoreModules.World.Land
892 894
893 if (currentParcelBlock != null) 895 if (currentParcelBlock != null)
894 { 896 {
895 if (currentParcelBlock.landData.OwnerID == remote_client.AgentId) 897 if (currentParcelBlock.LandData.OwnerID == remote_client.AgentId)
896 { 898 {
897 //Owner Flag 899 //Owner Flag
898 tempByte = Convert.ToByte(tempByte | LandChannel.LAND_TYPE_OWNED_BY_REQUESTER); 900 tempByte = Convert.ToByte(tempByte | LandChannel.LAND_TYPE_OWNED_BY_REQUESTER);
899 } 901 }
900 else if (currentParcelBlock.landData.SalePrice > 0 && 902 else if (currentParcelBlock.LandData.SalePrice > 0 &&
901 (currentParcelBlock.landData.AuthBuyerID == UUID.Zero || 903 (currentParcelBlock.LandData.AuthBuyerID == UUID.Zero ||
902 currentParcelBlock.landData.AuthBuyerID == remote_client.AgentId)) 904 currentParcelBlock.LandData.AuthBuyerID == remote_client.AgentId))
903 { 905 {
904 //Sale Flag 906 //Sale Flag
905 tempByte = Convert.ToByte(tempByte | LandChannel.LAND_TYPE_IS_FOR_SALE); 907 tempByte = Convert.ToByte(tempByte | LandChannel.LAND_TYPE_IS_FOR_SALE);
906 } 908 }
907 else if (currentParcelBlock.landData.OwnerID == UUID.Zero) 909 else if (currentParcelBlock.LandData.OwnerID == UUID.Zero)
908 { 910 {
909 //Public Flag 911 //Public Flag
910 tempByte = Convert.ToByte(tempByte | LandChannel.LAND_TYPE_PUBLIC); 912 tempByte = Convert.ToByte(tempByte | LandChannel.LAND_TYPE_PUBLIC);
@@ -978,7 +980,7 @@ namespace OpenSim.Region.CoreModules.World.Land
978 { 980 {
979 if (!temp.Contains(currentParcel)) 981 if (!temp.Contains(currentParcel))
980 { 982 {
981 currentParcel.forceUpdateLandInfo(); 983 currentParcel.ForceUpdateLandInfo();
982 temp.Add(currentParcel); 984 temp.Add(currentParcel);
983 } 985 }
984 } 986 }
@@ -994,7 +996,7 @@ namespace OpenSim.Region.CoreModules.World.Land
994 996
995 for (int i = 0; i < temp.Count; i++) 997 for (int i = 0; i < temp.Count; i++)
996 { 998 {
997 temp[i].sendLandProperties(sequence_id, snap_selection, requestResult, remote_client); 999 temp[i].SendLandProperties(sequence_id, snap_selection, requestResult, remote_client);
998 } 1000 }
999 1001
1000 SendParcelOverlay(remote_client); 1002 SendParcelOverlay(remote_client);
@@ -1008,7 +1010,7 @@ namespace OpenSim.Region.CoreModules.World.Land
1008 m_landList.TryGetValue(localID, out land); 1010 m_landList.TryGetValue(localID, out land);
1009 } 1011 }
1010 1012
1011 if (land != null) land.updateLandProperties(args, remote_client); 1013 if (land != null) land.UpdateLandProperties(args, remote_client);
1012 } 1014 }
1013 1015
1014 public void ClientOnParcelDivideRequest(int west, int south, int east, int north, IClientAPI remote_client) 1016 public void ClientOnParcelDivideRequest(int west, int south, int east, int north, IClientAPI remote_client)
@@ -1024,7 +1026,7 @@ namespace OpenSim.Region.CoreModules.World.Land
1024 public void ClientOnParcelSelectObjects(int local_id, int request_type, 1026 public void ClientOnParcelSelectObjects(int local_id, int request_type,
1025 List<UUID> returnIDs, IClientAPI remote_client) 1027 List<UUID> returnIDs, IClientAPI remote_client)
1026 { 1028 {
1027 m_landList[local_id].sendForceObjectSelect(local_id, request_type, returnIDs, remote_client); 1029 m_landList[local_id].SendForceObjectSelect(local_id, request_type, returnIDs, remote_client);
1028 } 1030 }
1029 1031
1030 public void ClientOnParcelObjectOwnerRequest(int local_id, IClientAPI remote_client) 1032 public void ClientOnParcelObjectOwnerRequest(int local_id, IClientAPI remote_client)
@@ -1037,7 +1039,7 @@ namespace OpenSim.Region.CoreModules.World.Land
1037 1039
1038 if (land != null) 1040 if (land != null)
1039 { 1041 {
1040 m_landList[local_id].sendLandObjectOwners(remote_client); 1042 m_landList[local_id].SendLandObjectOwners(remote_client);
1041 } 1043 }
1042 else 1044 else
1043 { 1045 {
@@ -1057,10 +1059,10 @@ namespace OpenSim.Region.CoreModules.World.Land
1057 { 1059 {
1058 if (m_scene.Permissions.IsGod(remote_client.AgentId)) 1060 if (m_scene.Permissions.IsGod(remote_client.AgentId))
1059 { 1061 {
1060 land.landData.OwnerID = ownerID; 1062 land.LandData.OwnerID = ownerID;
1061 1063
1062 m_scene.Broadcast(SendParcelOverlay); 1064 m_scene.Broadcast(SendParcelOverlay);
1063 land.sendLandUpdateToClient(remote_client); 1065 land.SendLandUpdateToClient(remote_client);
1064 } 1066 }
1065 } 1067 }
1066 } 1068 }
@@ -1078,11 +1080,11 @@ namespace OpenSim.Region.CoreModules.World.Land
1078 if (m_scene.Permissions.CanAbandonParcel(remote_client.AgentId, land)) 1080 if (m_scene.Permissions.CanAbandonParcel(remote_client.AgentId, land))
1079 { 1081 {
1080 if (m_scene.RegionInfo.EstateSettings.EstateOwner != UUID.Zero) 1082 if (m_scene.RegionInfo.EstateSettings.EstateOwner != UUID.Zero)
1081 land.landData.OwnerID = m_scene.RegionInfo.EstateSettings.EstateOwner; 1083 land.LandData.OwnerID = m_scene.RegionInfo.EstateSettings.EstateOwner;
1082 else 1084 else
1083 land.landData.OwnerID = m_scene.RegionInfo.MasterAvatarAssignedUUID; 1085 land.LandData.OwnerID = m_scene.RegionInfo.MasterAvatarAssignedUUID;
1084 m_scene.Broadcast(SendParcelOverlay); 1086 m_scene.Broadcast(SendParcelOverlay);
1085 land.sendLandUpdateToClient(remote_client); 1087 land.SendLandUpdateToClient(remote_client);
1086 } 1088 }
1087 } 1089 }
1088 } 1090 }
@@ -1100,13 +1102,13 @@ namespace OpenSim.Region.CoreModules.World.Land
1100 if (m_scene.Permissions.CanReclaimParcel(remote_client.AgentId, land)) 1102 if (m_scene.Permissions.CanReclaimParcel(remote_client.AgentId, land))
1101 { 1103 {
1102 if (m_scene.RegionInfo.EstateSettings.EstateOwner != UUID.Zero) 1104 if (m_scene.RegionInfo.EstateSettings.EstateOwner != UUID.Zero)
1103 land.landData.OwnerID = m_scene.RegionInfo.EstateSettings.EstateOwner; 1105 land.LandData.OwnerID = m_scene.RegionInfo.EstateSettings.EstateOwner;
1104 else 1106 else
1105 land.landData.OwnerID = m_scene.RegionInfo.MasterAvatarAssignedUUID; 1107 land.LandData.OwnerID = m_scene.RegionInfo.MasterAvatarAssignedUUID;
1106 land.landData.ClaimDate = Util.UnixTimeSinceEpoch(); 1108 land.LandData.ClaimDate = Util.UnixTimeSinceEpoch();
1107 land.landData.IsGroupOwned = false; 1109 land.LandData.IsGroupOwned = false;
1108 m_scene.Broadcast(SendParcelOverlay); 1110 m_scene.Broadcast(SendParcelOverlay);
1109 land.sendLandUpdateToClient(remote_client); 1111 land.SendLandUpdateToClient(remote_client);
1110 } 1112 }
1111 } 1113 }
1112 } 1114 }
@@ -1128,7 +1130,7 @@ namespace OpenSim.Region.CoreModules.World.Land
1128 1130
1129 if (land != null) 1131 if (land != null)
1130 { 1132 {
1131 land.updateLandSold(e.agentId, e.groupId, e.groupOwned, (uint)e.transactionID, e.parcelPrice, e.parcelArea); 1133 land.UpdateLandSold(e.agentId, e.groupId, e.groupOwned, (uint)e.transactionID, e.parcelPrice, e.parcelArea);
1132 } 1134 }
1133 } 1135 }
1134 } 1136 }
@@ -1149,11 +1151,11 @@ namespace OpenSim.Region.CoreModules.World.Land
1149 1151
1150 if (lob != null) 1152 if (lob != null)
1151 { 1153 {
1152 UUID AuthorizedID = lob.landData.AuthBuyerID; 1154 UUID AuthorizedID = lob.LandData.AuthBuyerID;
1153 int saleprice = lob.landData.SalePrice; 1155 int saleprice = lob.LandData.SalePrice;
1154 UUID pOwnerID = lob.landData.OwnerID; 1156 UUID pOwnerID = lob.LandData.OwnerID;
1155 1157
1156 bool landforsale = ((lob.landData.Flags & 1158 bool landforsale = ((lob.LandData.Flags &
1157 (uint)(ParcelFlags.ForSale | ParcelFlags.ForSaleObjects | ParcelFlags.SellParcelObjects)) != 0); 1159 (uint)(ParcelFlags.ForSale | ParcelFlags.ForSaleObjects | ParcelFlags.SellParcelObjects)) != 0);
1158 if ((AuthorizedID == UUID.Zero || AuthorizedID == e.agentId) && e.parcelPrice >= saleprice && landforsale) 1160 if ((AuthorizedID == UUID.Zero || AuthorizedID == e.agentId) && e.parcelPrice >= saleprice && landforsale)
1159 { 1161 {
@@ -1182,7 +1184,7 @@ namespace OpenSim.Region.CoreModules.World.Land
1182 1184
1183 if (land != null) 1185 if (land != null)
1184 { 1186 {
1185 land.deedToGroup(groupID); 1187 land.DeedToGroup(groupID);
1186 } 1188 }
1187 1189
1188 } 1190 }
@@ -1201,8 +1203,8 @@ namespace OpenSim.Region.CoreModules.World.Land
1201 public void IncomingLandObjectFromStorage(LandData data) 1203 public void IncomingLandObjectFromStorage(LandData data)
1202 { 1204 {
1203 ILandObject new_land = new LandObject(data.OwnerID, data.IsGroupOwned, m_scene); 1205 ILandObject new_land = new LandObject(data.OwnerID, data.IsGroupOwned, m_scene);
1204 new_land.landData = data.Copy(); 1206 new_land.LandData = data.Copy();
1205 new_land.setLandBitmapFromByteArray(); 1207 new_land.SetLandBitmapFromByteArray();
1206 AddLandObject(new_land); 1208 AddLandObject(new_land);
1207 } 1209 }
1208 1210
@@ -1216,7 +1218,7 @@ namespace OpenSim.Region.CoreModules.World.Land
1216 1218
1217 if (selectedParcel == null) return; 1219 if (selectedParcel == null) return;
1218 1220
1219 selectedParcel.returnLandObjects(returnType, agentIDs, taskIDs, remoteClient); 1221 selectedParcel.ReturnLandObjects(returnType, agentIDs, taskIDs, remoteClient);
1220 } 1222 }
1221 1223
1222 public void EventManagerOnNoLandDataFromStorage() 1224 public void EventManagerOnNoLandDataFromStorage()
@@ -1232,7 +1234,7 @@ namespace OpenSim.Region.CoreModules.World.Land
1232 { 1234 {
1233 foreach (LandObject obj in m_landList.Values) 1235 foreach (LandObject obj in m_landList.Values)
1234 { 1236 {
1235 obj.setParcelObjectMaxOverride(overrideDel); 1237 obj.SetParcelObjectMaxOverride(overrideDel);
1236 } 1238 }
1237 } 1239 }
1238 } 1240 }
@@ -1301,7 +1303,7 @@ namespace OpenSim.Region.CoreModules.World.Land
1301 else 1303 else
1302 { 1304 {
1303 // a parcel request for a parcel in another region. Ask the grid about the region 1305 // a parcel request for a parcel in another region. Ask the grid about the region
1304 RegionInfo info = m_scene.CommsManager.GridService.RequestNeighbourInfo(regionID); 1306 GridRegion info = m_scene.GridService.GetRegionByUUID(UUID.Zero, regionID);
1305 if (info != null) 1307 if (info != null)
1306 parcelID = Util.BuildFakeParcelID(info.RegionHandle, x, y); 1308 parcelID = Util.BuildFakeParcelID(info.RegionHandle, x, y);
1307 } 1309 }
@@ -1335,7 +1337,7 @@ namespace OpenSim.Region.CoreModules.World.Land
1335 return; 1337 return;
1336 } 1338 }
1337 1339
1338 remoteClient.SendParcelDwellReply(localID, selectedParcel.landData.GlobalID, selectedParcel.landData.Dwell); 1340 remoteClient.SendParcelDwellReply(localID, selectedParcel.LandData.GlobalID, selectedParcel.LandData.Dwell);
1339 } 1341 }
1340 1342
1341 private void ClientOnParcelInfoRequest(IClientAPI remoteClient, UUID parcelID) 1343 private void ClientOnParcelInfoRequest(IClientAPI remoteClient, UUID parcelID)
@@ -1343,50 +1345,62 @@ namespace OpenSim.Region.CoreModules.World.Land
1343 if (parcelID == UUID.Zero) 1345 if (parcelID == UUID.Zero)
1344 return; 1346 return;
1345 1347
1346 ExtendedLandData data = (ExtendedLandData)parcelInfoCache.Get(parcelID.ToString(), delegate(string id) { 1348 ExtendedLandData data =
1347 UUID parcel = UUID.Zero; 1349 (ExtendedLandData)parcelInfoCache.Get(parcelID.ToString(),
1348 UUID.TryParse(id, out parcel); 1350 delegate(string id)
1349 // assume we've got the parcelID we just computed in RemoteParcelRequest 1351 {
1350 ExtendedLandData extLandData = new ExtendedLandData(); 1352 UUID parcel = UUID.Zero;
1351 Util.ParseFakeParcelID(parcel, out extLandData.regionHandle, out extLandData.x, out extLandData.y); 1353 UUID.TryParse(id, out parcel);
1352 m_log.DebugFormat("[LAND] got parcelinfo request for regionHandle {0}, x/y {1}/{2}", 1354 // assume we've got the parcelID we just computed in RemoteParcelRequest
1353 extLandData.regionHandle, extLandData.x, extLandData.y); 1355 ExtendedLandData extLandData = new ExtendedLandData();
1354 1356 Util.ParseFakeParcelID(parcel, out extLandData.RegionHandle,
1355 // for this region or for somewhere else? 1357 out extLandData.X, out extLandData.Y);
1356 if (extLandData.regionHandle == m_scene.RegionInfo.RegionHandle) 1358 m_log.DebugFormat("[LAND] got parcelinfo request for regionHandle {0}, x/y {1}/{2}",
1357 { 1359 extLandData.RegionHandle, extLandData.X, extLandData.Y);
1358 extLandData.landData = this.GetLandObject(extLandData.x, extLandData.y).landData; 1360
1359 } 1361 // for this region or for somewhere else?
1360 else 1362 if (extLandData.RegionHandle == m_scene.RegionInfo.RegionHandle)
1361 { 1363 {
1362 extLandData.landData = m_scene.CommsManager.GridService.RequestLandData(extLandData.regionHandle, 1364 extLandData.LandData = this.GetLandObject(extLandData.X, extLandData.Y).LandData;
1363 extLandData.x, 1365 }
1364 extLandData.y); 1366 else
1365 if (extLandData.landData == null) 1367 {
1366 { 1368 ILandService landService = m_scene.RequestModuleInterface<ILandService>();
1367 // we didn't find the region/land => don't cache 1369 extLandData.LandData = landService.GetLandData(extLandData.RegionHandle,
1368 return null; 1370 extLandData.X,
1369 } 1371 extLandData.Y);
1370 } 1372 if (extLandData.LandData == null)
1371 return extLandData; 1373 {
1372 }); 1374 // we didn't find the region/land => don't cache
1375 return null;
1376 }
1377 }
1378 return extLandData;
1379 });
1373 1380
1374 if (data != null) // if we found some data, send it 1381 if (data != null) // if we found some data, send it
1375 { 1382 {
1376 RegionInfo info; 1383 GridRegion info;
1377 if (data.regionHandle == m_scene.RegionInfo.RegionHandle) 1384 if (data.RegionHandle == m_scene.RegionInfo.RegionHandle)
1378 { 1385 {
1379 info = m_scene.RegionInfo; 1386 info = new GridRegion(m_scene.RegionInfo);
1380 } 1387 }
1381 else 1388 else
1382 { 1389 {
1383 // most likely still cached from building the extLandData entry 1390 // most likely still cached from building the extLandData entry
1384 info = m_scene.CommsManager.GridService.RequestNeighbourInfo(data.regionHandle); 1391 uint x = 0, y = 0;
1392 Utils.LongToUInts(data.RegionHandle, out x, out y);
1393 info = m_scene.GridService.GetRegionByPosition(UUID.Zero, (int)x, (int)y);
1385 } 1394 }
1386 // we need to transfer the fake parcelID, not the one in landData, so the viewer can match it to the landmark. 1395 // we need to transfer the fake parcelID, not the one in landData, so the viewer can match it to the landmark.
1387 m_log.DebugFormat("[LAND] got parcelinfo for parcel {0} in region {1}; sending...", 1396 m_log.DebugFormat("[LAND] got parcelinfo for parcel {0} in region {1}; sending...",
1388 data.landData.Name, data.regionHandle); 1397 data.LandData.Name, data.RegionHandle);
1389 remoteClient.SendParcelInfo(info, data.landData, parcelID, data.x, data.y); 1398 // HACK for now
1399 RegionInfo r = new RegionInfo();
1400 r.RegionName = info.RegionName;
1401 r.RegionLocX = (uint)info.RegionLocX;
1402 r.RegionLocY = (uint)info.RegionLocY;
1403 remoteClient.SendParcelInfo(r, data.LandData, parcelID, data.X, data.Y);
1390 } 1404 }
1391 else 1405 else
1392 m_log.Debug("[LAND] got no parcelinfo; not sending"); 1406 m_log.Debug("[LAND] got no parcelinfo; not sending");
@@ -1405,9 +1419,9 @@ namespace OpenSim.Region.CoreModules.World.Land
1405 if (!m_scene.Permissions.CanEditParcel(remoteClient.AgentId, land)) 1419 if (!m_scene.Permissions.CanEditParcel(remoteClient.AgentId, land))
1406 return; 1420 return;
1407 1421
1408 land.landData.OtherCleanTime = otherCleanTime; 1422 land.LandData.OtherCleanTime = otherCleanTime;
1409 1423
1410 UpdateLandObject(localID, land.landData); 1424 UpdateLandObject(localID, land.LandData);
1411 } 1425 }
1412 } 1426 }
1413} 1427}