diff options
Diffstat (limited to 'OpenSim/Region/Environment/LandManagement')
-rw-r--r-- | OpenSim/Region/Environment/LandManagement/Land.cs | 20 | ||||
-rw-r--r-- | OpenSim/Region/Environment/LandManagement/LandManager.cs | 168 |
2 files changed, 111 insertions, 77 deletions
diff --git a/OpenSim/Region/Environment/LandManagement/Land.cs b/OpenSim/Region/Environment/LandManagement/Land.cs index da17a69..11ff0ee 100644 --- a/OpenSim/Region/Environment/LandManagement/Land.cs +++ b/OpenSim/Region/Environment/LandManagement/Land.cs | |||
@@ -227,6 +227,19 @@ namespace OpenSim.Region.Environment.LandManagement | |||
227 | } | 227 | } |
228 | } | 228 | } |
229 | 229 | ||
230 | public bool isEitherBannedOrRestricted(LLUUID avatar) | ||
231 | { | ||
232 | if (isBannedFromLand(avatar)) | ||
233 | { | ||
234 | return true; | ||
235 | } | ||
236 | else if (isRestrictedFromLand(avatar)) | ||
237 | { | ||
238 | return true; | ||
239 | } | ||
240 | return false; | ||
241 | } | ||
242 | |||
230 | public bool isBannedFromLand(LLUUID avatar) | 243 | public bool isBannedFromLand(LLUUID avatar) |
231 | { | 244 | { |
232 | if ((this.landData.landFlags & (uint)Parcel.ParcelFlags.UseBanList) > 0) | 245 | if ((this.landData.landFlags & (uint)Parcel.ParcelFlags.UseBanList) > 0) |
@@ -274,9 +287,12 @@ namespace OpenSim.Region.Environment.LandManagement | |||
274 | Land over = | 287 | Land over = |
275 | m_scene.LandManager.getLandObject((int) Math.Round(avatars[i].AbsolutePosition.X), | 288 | m_scene.LandManager.getLandObject((int) Math.Round(avatars[i].AbsolutePosition.X), |
276 | (int) Math.Round(avatars[i].AbsolutePosition.Y)); | 289 | (int) Math.Round(avatars[i].AbsolutePosition.Y)); |
277 | if (over.landData.localID == landData.localID) | 290 | if (over != null) |
278 | { | 291 | { |
279 | sendLandUpdateToClient(avatars[i].ControllingClient); | 292 | if (over.landData.localID == landData.localID) |
293 | { | ||
294 | sendLandUpdateToClient(avatars[i].ControllingClient); | ||
295 | } | ||
280 | } | 296 | } |
281 | } | 297 | } |
282 | } | 298 | } |
diff --git a/OpenSim/Region/Environment/LandManagement/LandManager.cs b/OpenSim/Region/Environment/LandManagement/LandManager.cs index f984d58..c360f7f 100644 --- a/OpenSim/Region/Environment/LandManagement/LandManager.cs +++ b/OpenSim/Region/Environment/LandManagement/LandManager.cs | |||
@@ -192,7 +192,8 @@ namespace OpenSim.Region.Environment.LandManagement | |||
192 | { | 192 | { |
193 | if (landIDList[x, y] == local_id) | 193 | if (landIDList[x, y] == local_id) |
194 | { | 194 | { |
195 | throw new Exception("Could not remove land object. Still being used at " + x + ", " + y); | 195 | return; |
196 | //throw new Exception("Could not remove land object. Still being used at " + x + ", " + y); | ||
196 | } | 197 | } |
197 | } | 198 | } |
198 | } | 199 | } |
@@ -210,7 +211,7 @@ namespace OpenSim.Region.Environment.LandManagement | |||
210 | } | 211 | } |
211 | else | 212 | else |
212 | { | 213 | { |
213 | throw new Exception("Could not update land object. Local ID '" + local_id + "' does not exist"); | 214 | //throw new Exception("Could not update land object. Local ID '" + local_id + "' does not exist"); |
214 | } | 215 | } |
215 | } | 216 | } |
216 | 217 | ||
@@ -246,10 +247,7 @@ namespace OpenSim.Region.Environment.LandManagement | |||
246 | 247 | ||
247 | if (x >= 64 || y >= 64 || x < 0 || y < 0) | 248 | if (x >= 64 || y >= 64 || x < 0 || y < 0) |
248 | { | 249 | { |
249 | // These exceptions here will cause a lot of complaints from the users specifically because | 250 | return null; |
250 | // they happen every time at border crossings | ||
251 | |||
252 | throw new Exception("Error: Parcel not found at point " + x + ", " + y); | ||
253 | } | 251 | } |
254 | else | 252 | else |
255 | { | 253 | { |
@@ -366,9 +364,12 @@ namespace OpenSim.Region.Environment.LandManagement | |||
366 | for (stepXSelected = start_x; stepXSelected <= end_x; stepXSelected += 4) | 364 | for (stepXSelected = start_x; stepXSelected <= end_x; stepXSelected += 4) |
367 | { | 365 | { |
368 | Land p = getLandObject(stepXSelected, stepYSelected); | 366 | Land p = getLandObject(stepXSelected, stepYSelected); |
369 | if (!selectedLandObjects.Contains(p)) | 367 | if (p != null) |
370 | { | 368 | { |
371 | selectedLandObjects.Add(p); | 369 | if (!selectedLandObjects.Contains(p)) |
370 | { | ||
371 | selectedLandObjects.Add(p); | ||
372 | } | ||
372 | } | 373 | } |
373 | } | 374 | } |
374 | } | 375 | } |
@@ -429,61 +430,66 @@ namespace OpenSim.Region.Environment.LandManagement | |||
429 | { | 430 | { |
430 | byte tempByte = (byte) 0; //This represents the byte for the current 4x4 | 431 | byte tempByte = (byte) 0; //This represents the byte for the current 4x4 |
431 | Land currentParcelBlock = getLandObject(x*4, y*4); | 432 | Land currentParcelBlock = getLandObject(x*4, y*4); |
432 | 433 | if (currentParcelBlock != null) | |
433 | if (currentParcelBlock.landData.ownerID == remote_client.AgentId) | ||
434 | { | 434 | { |
435 | //Owner Flag | 435 | if (currentParcelBlock.landData.ownerID == remote_client.AgentId) |
436 | tempByte = Convert.ToByte(tempByte | LAND_TYPE_OWNED_BY_REQUESTER); | 436 | { |
437 | } | 437 | //Owner Flag |
438 | else if (currentParcelBlock.landData.salePrice > 0 && | 438 | tempByte = Convert.ToByte(tempByte | LAND_TYPE_OWNED_BY_REQUESTER); |
439 | (currentParcelBlock.landData.authBuyerID == LLUUID.Zero || | 439 | } |
440 | currentParcelBlock.landData.authBuyerID == remote_client.AgentId)) | 440 | else if (currentParcelBlock.landData.salePrice > 0 && |
441 | { | 441 | (currentParcelBlock.landData.authBuyerID == LLUUID.Zero || |
442 | //Sale Flag | 442 | currentParcelBlock.landData.authBuyerID == remote_client.AgentId)) |
443 | tempByte = Convert.ToByte(tempByte | LAND_TYPE_IS_FOR_SALE); | 443 | { |
444 | } | 444 | //Sale Flag |
445 | else if (currentParcelBlock.landData.ownerID == LLUUID.Zero) | 445 | tempByte = Convert.ToByte(tempByte | LAND_TYPE_IS_FOR_SALE); |
446 | { | 446 | } |
447 | //Public Flag | 447 | else if (currentParcelBlock.landData.ownerID == LLUUID.Zero) |
448 | tempByte = Convert.ToByte(tempByte | LAND_TYPE_PUBLIC); | 448 | { |
449 | } | 449 | //Public Flag |
450 | else | 450 | tempByte = Convert.ToByte(tempByte | LAND_TYPE_PUBLIC); |
451 | { | 451 | } |
452 | //Other Flag | 452 | else |
453 | tempByte = Convert.ToByte(tempByte | LAND_TYPE_OWNED_BY_OTHER); | 453 | { |
454 | } | 454 | //Other Flag |
455 | tempByte = Convert.ToByte(tempByte | LAND_TYPE_OWNED_BY_OTHER); | ||
456 | } | ||
455 | 457 | ||
456 | 458 | ||
457 | //Now for border control | 459 | //Now for border control |
458 | if (x == 0) | ||
459 | { | ||
460 | tempByte = Convert.ToByte(tempByte | LAND_FLAG_PROPERTY_BORDER_WEST); | ||
461 | } | ||
462 | else if (getLandObject((x - 1)*4, y*4) != currentParcelBlock) | ||
463 | { | ||
464 | tempByte = Convert.ToByte(tempByte | LAND_FLAG_PROPERTY_BORDER_WEST); | ||
465 | } | ||
466 | 460 | ||
467 | if (y == 0) | 461 | Land westParcel = getLandObject((x - 1) * 4, y * 4); |
468 | { | 462 | Land southParcel = getLandObject(x * 4, (y - 1) * 4); |
469 | tempByte = Convert.ToByte(tempByte | LAND_FLAG_PROPERTY_BORDER_SOUTH); | 463 | if (x == 0) |
470 | } | 464 | { |
471 | else if (getLandObject(x*4, (y - 1)*4) != currentParcelBlock) | 465 | tempByte = Convert.ToByte(tempByte | LAND_FLAG_PROPERTY_BORDER_WEST); |
472 | { | 466 | } |
473 | tempByte = Convert.ToByte(tempByte | LAND_FLAG_PROPERTY_BORDER_SOUTH); | 467 | else if (westParcel != null && westParcel != currentParcelBlock) |
474 | } | 468 | { |
469 | tempByte = Convert.ToByte(tempByte | LAND_FLAG_PROPERTY_BORDER_WEST); | ||
470 | } | ||
475 | 471 | ||
476 | byteArray[byteArrayCount] = tempByte; | 472 | if (y == 0) |
477 | byteArrayCount++; | 473 | { |
478 | if (byteArrayCount >= LAND_BLOCKS_PER_PACKET) | 474 | tempByte = Convert.ToByte(tempByte | LAND_FLAG_PROPERTY_BORDER_SOUTH); |
479 | { | 475 | } |
480 | byteArrayCount = 0; | 476 | else if (southParcel != null && southParcel != currentParcelBlock) |
481 | packet = new ParcelOverlayPacket(); | 477 | { |
482 | packet.ParcelData.Data = byteArray; | 478 | tempByte = Convert.ToByte(tempByte | LAND_FLAG_PROPERTY_BORDER_SOUTH); |
483 | packet.ParcelData.SequenceID = sequenceID; | 479 | } |
484 | remote_client.OutPacket((Packet)packet, ThrottleOutPacketType.Task); | 480 | |
485 | sequenceID++; | 481 | byteArray[byteArrayCount] = tempByte; |
486 | byteArray = new byte[LAND_BLOCKS_PER_PACKET]; | 482 | byteArrayCount++; |
483 | if (byteArrayCount >= LAND_BLOCKS_PER_PACKET) | ||
484 | { | ||
485 | byteArrayCount = 0; | ||
486 | packet = new ParcelOverlayPacket(); | ||
487 | packet.ParcelData.Data = byteArray; | ||
488 | packet.ParcelData.SequenceID = sequenceID; | ||
489 | remote_client.OutPacket((Packet)packet, ThrottleOutPacketType.Task); | ||
490 | sequenceID++; | ||
491 | byteArray = new byte[LAND_BLOCKS_PER_PACKET]; | ||
492 | } | ||
487 | } | 493 | } |
488 | } | 494 | } |
489 | } | 495 | } |
@@ -502,10 +508,13 @@ namespace OpenSim.Region.Environment.LandManagement | |||
502 | for (y = 0; y < inc_y; y++) | 508 | for (y = 0; y < inc_y; y++) |
503 | { | 509 | { |
504 | Land currentParcel = getLandObject(start_x + x, start_y + y); | 510 | Land currentParcel = getLandObject(start_x + x, start_y + y); |
505 | if (!temp.Contains(currentParcel)) | 511 | if (currentParcel != null) |
506 | { | 512 | { |
507 | currentParcel.forceUpdateLandInfo(); | 513 | if (!temp.Contains(currentParcel)) |
508 | temp.Add(currentParcel); | 514 | { |
515 | currentParcel.forceUpdateLandInfo(); | ||
516 | temp.Add(currentParcel); | ||
517 | } | ||
509 | } | 518 | } |
510 | } | 519 | } |
511 | } | 520 | } |
@@ -583,9 +592,12 @@ namespace OpenSim.Region.Environment.LandManagement | |||
583 | for (y = -4; y <= 4; y += 4) | 592 | for (y = -4; y <= 4; y += 4) |
584 | { | 593 | { |
585 | Land check = getLandObject(position.X + x, position.Y + y); | 594 | Land check = getLandObject(position.X + x, position.Y + y); |
586 | if (!parcelsNear.Contains(check)) | 595 | if (check != null) |
587 | { | 596 | { |
588 | parcelsNear.Add(check); | 597 | if (!parcelsNear.Contains(check)) |
598 | { | ||
599 | parcelsNear.Add(check); | ||
600 | } | ||
589 | } | 601 | } |
590 | } | 602 | } |
591 | } | 603 | } |
@@ -693,18 +705,21 @@ namespace OpenSim.Region.Environment.LandManagement | |||
693 | sendLandUpdate(clientAvatar); | 705 | sendLandUpdate(clientAvatar); |
694 | sendOutNearestBanLine(remote_client); | 706 | sendOutNearestBanLine(remote_client); |
695 | Land parcel = getLandObject(clientAvatar.AbsolutePosition.X, clientAvatar.AbsolutePosition.Y); | 707 | Land parcel = getLandObject(clientAvatar.AbsolutePosition.X, clientAvatar.AbsolutePosition.Y); |
696 | if (clientAvatar.AbsolutePosition.Z < BAN_LINE_SAFETY_HIEGHT && clientAvatar.sentMessageAboutRestrictedParcelFlyingDown) | 708 | if (parcel != null) |
697 | { | 709 | { |
698 | 710 | if (clientAvatar.AbsolutePosition.Z < BAN_LINE_SAFETY_HIEGHT && clientAvatar.sentMessageAboutRestrictedParcelFlyingDown) | |
699 | handleAvatarChangingParcel(clientAvatar, parcel.landData.localID, m_scene.RegionInfo.RegionID); //They are going below the safety line! | ||
700 | if (!parcel.isBannedFromLand(clientAvatar.UUID)) | ||
701 | { | 711 | { |
702 | clientAvatar.sentMessageAboutRestrictedParcelFlyingDown = false; | 712 | |
713 | handleAvatarChangingParcel(clientAvatar, parcel.landData.localID, m_scene.RegionInfo.RegionID); //They are going below the safety line! | ||
714 | if (!parcel.isBannedFromLand(clientAvatar.UUID)) | ||
715 | { | ||
716 | clientAvatar.sentMessageAboutRestrictedParcelFlyingDown = false; | ||
717 | } | ||
718 | } | ||
719 | else if (clientAvatar.AbsolutePosition.Z < BAN_LINE_SAFETY_HIEGHT && parcel.isBannedFromLand(clientAvatar.UUID)) | ||
720 | { | ||
721 | sendYouAreBannedNotice(clientAvatar); | ||
703 | } | 722 | } |
704 | } | ||
705 | else if (clientAvatar.AbsolutePosition.Z < BAN_LINE_SAFETY_HIEGHT && parcel.isBannedFromLand(clientAvatar.UUID)) | ||
706 | { | ||
707 | sendYouAreBannedNotice(clientAvatar); | ||
708 | } | 723 | } |
709 | } | 724 | } |
710 | } | 725 | } |
@@ -712,11 +727,14 @@ namespace OpenSim.Region.Environment.LandManagement | |||
712 | public void handleAnyClientMovement(ScenePresence avatar) //Like handleSignificantClientMovement, but called with an AgentUpdate regardless of distance. | 727 | public void handleAnyClientMovement(ScenePresence avatar) //Like handleSignificantClientMovement, but called with an AgentUpdate regardless of distance. |
713 | { | 728 | { |
714 | Land over = getLandObject(avatar.AbsolutePosition.X, avatar.AbsolutePosition.Y); | 729 | Land over = getLandObject(avatar.AbsolutePosition.X, avatar.AbsolutePosition.Y); |
715 | if (!over.isBannedFromLand(avatar.UUID) || avatar.AbsolutePosition.Z >= BAN_LINE_SAFETY_HIEGHT) | 730 | if (over != null) |
716 | { | 731 | { |
717 | avatar.lastKnownAllowedPosition = new Axiom.Math.Vector3(avatar.AbsolutePosition.X, avatar.AbsolutePosition.Y, avatar.AbsolutePosition.Z); | 732 | if (!over.isBannedFromLand(avatar.UUID) || avatar.AbsolutePosition.Z >= BAN_LINE_SAFETY_HIEGHT) |
718 | 733 | { | |
734 | avatar.lastKnownAllowedPosition = new Axiom.Math.Vector3(avatar.AbsolutePosition.X, avatar.AbsolutePosition.Y, avatar.AbsolutePosition.Z); | ||
735 | |||
719 | 736 | ||
737 | } | ||
720 | } | 738 | } |
721 | } | 739 | } |
722 | 740 | ||