aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs
diff options
context:
space:
mode:
authorUbitUmarov2015-08-24 17:05:16 +0100
committerUbitUmarov2015-08-24 17:05:16 +0100
commit3829df10595911de9ed1ce2f7b6cdd205828f8d0 (patch)
treed95d15c35695f6fa4dc4a6623294b307a7aee493 /OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs
parent rename ImapTileModule as IMAPImageUploadModule to match core (diff)
downloadopensim-SC_OLD-3829df10595911de9ed1ce2f7b6cdd205828f8d0.zip
opensim-SC_OLD-3829df10595911de9ed1ce2f7b6cdd205828f8d0.tar.gz
opensim-SC_OLD-3829df10595911de9ed1ce2f7b6cdd205828f8d0.tar.bz2
opensim-SC_OLD-3829df10595911de9ed1ce2f7b6cdd205828f8d0.tar.xz
try to implement core load oar options
Diffstat (limited to '')
-rw-r--r--OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs198
1 files changed, 125 insertions, 73 deletions
diff --git a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs
index 4aee6a5..83bbf79 100644
--- a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs
+++ b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs
@@ -570,17 +570,54 @@ namespace OpenSim.Region.CoreModules.World.Land
570 new_land.LandData.LocalID = newLandLocalID; 570 new_land.LandData.LocalID = newLandLocalID;
571 571
572 bool[,] landBitmap = new_land.GetLandBitmap(); 572 bool[,] landBitmap = new_land.GetLandBitmap();
573 for (int x = 0; x < landBitmap.GetLength(0); x++) 573 if (landBitmap.GetLength(0) != m_landIDList.GetLength(0) || landBitmap.GetLength(1) != m_landIDList.GetLength(1))
574 { 574 {
575 for (int y = 0; y < landBitmap.GetLength(1); y++) 575 // Going to variable sized regions can cause mismatches
576 m_log.ErrorFormat("{0} AddLandObject. Added land bitmap different size than region ID map. bitmapSize=({1},{2}), landIDSize=({3},{4})",
577 LogHeader, landBitmap.GetLength(0), landBitmap.GetLength(1), m_landIDList.GetLength(0), m_landIDList.GetLength(1));
578 }
579 else
580 {
581 // If other land objects still believe that they occupy any parts of the same space,
582 // then do not allow the add to proceed.
583 for (int x = 0; x < landBitmap.GetLength(0); x++)
584 {
585 for (int y = 0; y < landBitmap.GetLength(1); y++)
586 {
587 if (landBitmap[x, y])
588 {
589 int lastRecordedLandId = m_landIDList[x, y];
590
591 if (lastRecordedLandId > 0)
592 {
593 ILandObject lastRecordedLo = m_landList[lastRecordedLandId];
594
595 if (lastRecordedLo.LandBitmap[x, y])
596 {
597 m_log.ErrorFormat(
598 "{0}: Cannot add parcel \"{1}\", local ID {2} at tile {3},{4} because this is still occupied by parcel \"{5}\", local ID {6} in {7}",
599 LogHeader, new_land.LandData.Name, new_land.LandData.LocalID, x, y,
600 lastRecordedLo.LandData.Name, lastRecordedLo.LandData.LocalID, m_scene.Name);
601
602 return null;
603 }
604 }
605 }
606 }
607 }
608
609 for (int x = 0; x < landBitmap.GetLength(0); x++)
576 { 610 {
577 if (landBitmap[x, y]) 611 for (int y = 0; y < landBitmap.GetLength(1); y++)
578 { 612 {
579// m_log.DebugFormat( 613 if (landBitmap[x, y])
580// "[LAND MANAGEMENT MODULE]: Registering parcel {0} for land co-ord ({1}, {2}) on {3}", 614 {
581// new_land.LandData.Name, x, y, m_scene.RegionInfo.RegionName); 615 // m_log.DebugFormat(
582 616 // "[LAND MANAGEMENT MODULE]: Registering parcel {0} for land co-ord ({1}, {2}) on {3}",
583 m_landIDList[x, y] = newLandLocalID; 617 // new_land.LandData.Name, x, y, m_scene.RegionInfo.RegionName);
618
619 m_landIDList[x, y] = newLandLocalID;
620 }
584 } 621 }
585 } 622 }
586 } 623 }
@@ -693,47 +730,7 @@ namespace OpenSim.Region.CoreModules.World.Land
693 /// <returns>Land object at the point supplied</returns> 730 /// <returns>Land object at the point supplied</returns>
694 public ILandObject GetLandObject(float x_float, float y_float) 731 public ILandObject GetLandObject(float x_float, float y_float)
695 { 732 {
696 int x; 733 return GetLandObject((int)x_float, (int)y_float, true);
697 int y;
698
699 if (x_float >= m_scene.RegionInfo.RegionSizeX || x_float < 0 || y_float >= m_scene.RegionInfo.RegionSizeX || y_float < 0)
700 return null;
701
702 try
703 {
704 x = Convert.ToInt32(Math.Floor(Convert.ToDouble(x_float) / (float)landUnit));
705 y = Convert.ToInt32(Math.Floor(Convert.ToDouble(y_float) / (float)landUnit));
706 }
707 catch (OverflowException)
708 {
709 return null;
710 }
711
712 if (x >= (m_scene.RegionInfo.RegionSizeX / landUnit)
713 || y >= (m_scene.RegionInfo.RegionSizeY / landUnit)
714 || x < 0
715 || y < 0)
716 {
717 return null;
718 }
719
720 lock (m_landList)
721 {
722 // Corner case. If an autoreturn happens during sim startup
723 // we will come here with the list uninitialized
724 //
725// int landId = m_landIDList[x, y];
726
727// if (landId == 0)
728// m_log.DebugFormat(
729// "[LAND MANAGEMENT MODULE]: No land object found at ({0}, {1}) on {2}",
730// x, y, m_scene.RegionInfo.RegionName);
731
732 if (m_landList.ContainsKey(m_landIDList[x, y]))
733 return m_landList[m_landIDList[x, y]];
734
735 return null;
736 }
737 } 734 }
738 735
739 // if x,y is off region this will return the parcel at cliped x,y 736 // if x,y is off region this will return the parcel at cliped x,y
@@ -768,29 +765,47 @@ namespace OpenSim.Region.CoreModules.World.Land
768 765
769 public ILandObject GetLandObject(int x, int y) 766 public ILandObject GetLandObject(int x, int y)
770 { 767 {
768 return GetLandObject(x, y, false /* returnNullIfLandObjectNotFound */);
769 }
770
771 public ILandObject GetLandObject(int x, int y, bool returnNullIfLandObjectOutsideBounds)
772 {
771 if (x >= m_scene.RegionInfo.RegionSizeX || y >= m_scene.RegionInfo.RegionSizeY || x < 0 || y < 0) 773 if (x >= m_scene.RegionInfo.RegionSizeX || y >= m_scene.RegionInfo.RegionSizeY || x < 0 || y < 0)
772 { 774 {
773 // These exceptions here will cause a lot of complaints from the users specifically because 775 // These exceptions here will cause a lot of complaints from the users specifically because
774 // they happen every time at border crossings 776 // they happen every time at border crossings
775 throw new Exception("Error: Parcel not found at point " + x + ", " + y); 777 if (returnNullIfLandObjectOutsideBounds)
778 return null;
779 else
780 throw new Exception("Error: Parcel not found at point " + x + ", " + y);
776 } 781 }
777 782
778 lock (m_landIDList) 783 lock (m_landIDList)
779 { 784 {
780 try 785 try
781 { 786 {
782 //if (m_landList.ContainsKey(m_landIDList[x / 4, y / 4]))
783 return m_landList[m_landIDList[x / 4, y / 4]]; 787 return m_landList[m_landIDList[x / 4, y / 4]];
784 //else
785 // return null;
786 } 788 }
787 catch (IndexOutOfRangeException) 789 catch (IndexOutOfRangeException)
788 { 790 {
789 return null; 791 return null;
790 } 792 }
791 } 793 }
792 } 794 }
793 795
796 // Create a 'parcel is here' bitmap for the parcel identified by the passed landID
797 private bool[,] CreateBitmapForID(int landID)
798 {
799 bool[,] ret = new bool[m_landIDList.GetLength(0), m_landIDList.GetLength(1)];
800
801 for (int xx = 0; xx < m_landIDList.GetLength(0); xx++)
802 for (int yy = 0; yy < m_landIDList.GetLength(0); yy++)
803 if (m_landIDList[xx, yy] == landID)
804 ret[xx, yy] = true;
805
806 return ret;
807 }
808
794 #endregion 809 #endregion
795 810
796 #region Parcel Modification 811 #region Parcel Modification
@@ -1432,29 +1447,66 @@ namespace OpenSim.Region.CoreModules.World.Land
1432 1447
1433 public void EventManagerOnIncomingLandDataFromStorage(List<LandData> data) 1448 public void EventManagerOnIncomingLandDataFromStorage(List<LandData> data)
1434 { 1449 {
1435 Dictionary<int, ILandObject> landworkList;
1436 // move to work pointer since we are deleting it all
1437 lock (m_landList) 1450 lock (m_landList)
1438 { 1451 {
1439 landworkList = m_landList; 1452 for (int i = 0; i < data.Count; i++)
1440 m_landList = new Dictionary<int, ILandObject>(); 1453 IncomingLandObjectFromStorage(data[i]);
1441 }
1442 1454
1443 //Remove all the land objects in the sim and then process our new data 1455 // Layer data is in landUnit (4m) chunks
1444 foreach (int n in landworkList.Keys) 1456 for (int y = 0; y < m_scene.RegionInfo.RegionSizeY / Constants.TerrainPatchSize * (Constants.TerrainPatchSize / landUnit); y++)
1445 { 1457 {
1446 m_scene.EventManager.TriggerLandObjectRemoved(landworkList[n].LandData.GlobalID); 1458 for (int x = 0; x < m_scene.RegionInfo.RegionSizeX / Constants.TerrainPatchSize * (Constants.TerrainPatchSize / landUnit); x++)
1447 } 1459 {
1448 landworkList.Clear(); 1460 if (m_landIDList[x, y] == 0)
1461 {
1462 if (m_landList.Count == 1)
1463 {
1464 m_log.DebugFormat(
1465 "[{0}]: Auto-extending land parcel as landID at {1},{2} is 0 and only one land parcel is present in {3}",
1466 LogHeader, x, y, m_scene.Name);
1449 1467
1450 lock (m_landList) 1468 int onlyParcelID = 0;
1451 { 1469 ILandObject onlyLandObject = null;
1452 m_landIDList.Initialize(); 1470 foreach (KeyValuePair<int, ILandObject> kvp in m_landList)
1453 m_landList.Clear(); 1471 {
1454 } 1472 onlyParcelID = kvp.Key;
1473 onlyLandObject = kvp.Value;
1474 break;
1475 }
1455 1476
1456 for (int i = 0; i < data.Count; i++) 1477 // There is only one parcel. Grow it to fill all the unallocated spaces.
1457 IncomingLandObjectFromStorage(data[i]); 1478 for (int xx = 0; xx < m_landIDList.GetLength(0); xx++)
1479 for (int yy = 0; yy < m_landIDList.GetLength(1); yy++)
1480 if (m_landIDList[xx, yy] == 0)
1481 m_landIDList[xx, yy] = onlyParcelID;
1482
1483 onlyLandObject.LandBitmap = CreateBitmapForID(onlyParcelID);
1484 }
1485 else if (m_landList.Count > 1)
1486 {
1487 m_log.DebugFormat(
1488 "{0}: Auto-creating land parcel as landID at {1},{2} is 0 and more than one land parcel is present in {3}",
1489 LogHeader, x, y, m_scene.Name);
1490
1491 // There are several other parcels so we must create a new one for the unassigned space
1492 ILandObject newLand = new LandObject(UUID.Zero, false, m_scene);
1493 // Claim all the unclaimed "0" ids
1494 newLand.SetLandBitmap(CreateBitmapForID(0));
1495 newLand.LandData.OwnerID = m_scene.RegionInfo.EstateSettings.EstateOwner;
1496 newLand.LandData.ClaimDate = Util.UnixTimeSinceEpoch();
1497 newLand = AddLandObject(newLand);
1498 }
1499 else
1500 {
1501 // We should never reach this point as the separate code path when no land data exists should have fired instead.
1502 m_log.WarnFormat(
1503 "{0}: Ignoring request to auto-create parcel in {1} as there are no other parcels present",
1504 LogHeader, m_scene.Name);
1505 }
1506 }
1507 }
1508 }
1509 }
1458 } 1510 }
1459 1511
1460 public void IncomingLandObjectFromStorage(LandData data) 1512 public void IncomingLandObjectFromStorage(LandData data)
@@ -1464,7 +1516,7 @@ namespace OpenSim.Region.CoreModules.World.Land
1464 new_land.LandData = data.Copy(); 1516 new_land.LandData = data.Copy();
1465 new_land.SetLandBitmapFromByteArray(); 1517 new_land.SetLandBitmapFromByteArray();
1466 AddLandObject(new_land); 1518 AddLandObject(new_land);
1467 new_land.SendLandUpdateToAvatarsOverMe(); 1519// new_land.SendLandUpdateToAvatarsOverMe();
1468 } 1520 }
1469 1521
1470 public void ReturnObjectsInParcel(int localID, uint returnType, UUID[] agentIDs, UUID[] taskIDs, IClientAPI remoteClient) 1522 public void ReturnObjectsInParcel(int localID, uint returnType, UUID[] agentIDs, UUID[] taskIDs, IClientAPI remoteClient)