diff options
Diffstat (limited to 'OpenSim')
-rw-r--r-- | OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | 86 |
1 files changed, 41 insertions, 45 deletions
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 4be90c7..fb35a54 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | |||
@@ -6394,65 +6394,61 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
6394 | { | 6394 | { |
6395 | m_host.AddScriptLPS(1); | 6395 | m_host.AddScriptLPS(1); |
6396 | 6396 | ||
6397 | // edge will be used to pass the Region Coordinates offset | 6397 | if(dir.x == 0.0 && dir.y == 0.0) |
6398 | // we want to check for a neighboring sim | 6398 | return 1; // SL wiki |
6399 | LSL_Vector edge = new LSL_Vector(0, 0, 0); | 6399 | |
6400 | float rsx = World.RegionInfo.RegionSizeX; | ||
6401 | float rsy = World.RegionInfo.RegionSizeY; | ||
6402 | |||
6403 | // can understand what sl does if position is not in region, so do something :) | ||
6404 | float px = (float)Util.Clamp(pos.x, 0.5, rsx - 0.5); | ||
6405 | float py = (float)Util.Clamp(pos.y, 0.5, rsy - 0.5); | ||
6406 | |||
6407 | float ex, ey; | ||
6400 | 6408 | ||
6401 | if (dir.x == 0) | 6409 | if (dir.x == 0) |
6402 | { | 6410 | { |
6403 | if (dir.y == 0) | 6411 | ex = px; |
6404 | { | 6412 | ey = dir.y > 0.0 ? rsy + 1.0f : -1.0f; |
6405 | // Direction vector is 0,0 so return | 6413 | } |
6406 | // false since we're staying in the sim | 6414 | else if(dir.y == 0.0f) |
6407 | // no SL says true | 6415 | { |
6408 | return 1; | 6416 | ex = dir.x > 0 ? rsx + 1.0f : -1.0f; |
6409 | } | 6417 | ey = py; |
6410 | else | ||
6411 | { | ||
6412 | // Y is the only valid direction | ||
6413 | edge.y = dir.y / Math.Abs(dir.y) * (World.RegionInfo.RegionSizeY / Constants.RegionSize); | ||
6414 | } | ||
6415 | } | 6418 | } |
6416 | else | 6419 | else |
6417 | { | 6420 | { |
6418 | LSL_Float mag; | 6421 | float dx = (float) dir.x; |
6419 | if (dir.x > 0) | 6422 | float dy = (float) dir.y; |
6420 | { | ||
6421 | mag = (World.RegionInfo.RegionSizeX - pos.x) / dir.x; | ||
6422 | } | ||
6423 | else | ||
6424 | { | ||
6425 | mag = (pos.x/dir.x); | ||
6426 | } | ||
6427 | |||
6428 | mag = Math.Abs(mag); | ||
6429 | 6423 | ||
6430 | edge.y = pos.y + (dir.y * mag); | 6424 | float t1 = dx * dx + dy * dy; |
6425 | dx /= t1; | ||
6426 | dy /= t1; | ||
6431 | 6427 | ||
6432 | if (edge.y > World.RegionInfo.RegionSizeY || edge.y < 0) | 6428 | if(dx > 0) |
6433 | { | 6429 | t1 = (rsx + 1f - px)/dx; |
6434 | // Y goes out of bounds first | ||
6435 | edge.y = dir.y / Math.Abs(dir.y) * (World.RegionInfo.RegionSizeY / Constants.RegionSize); | ||
6436 | } | ||
6437 | else | 6430 | else |
6438 | { | 6431 | t1 = -(px + 1f)/dx; |
6439 | // X goes out of bounds first or its a corner exit | ||
6440 | edge.y = 0; | ||
6441 | edge.x = dir.x / Math.Abs(dir.x) * (World.RegionInfo.RegionSizeY / Constants.RegionSize); | ||
6442 | } | ||
6443 | } | ||
6444 | 6432 | ||
6445 | List<GridRegion> neighbors = World.GridService.GetNeighbours(World.RegionInfo.ScopeID, World.RegionInfo.RegionID); | ||
6446 | 6433 | ||
6447 | uint neighborX = World.RegionInfo.RegionLocX + (uint)edge.x; | 6434 | float t2; |
6448 | uint neighborY = World.RegionInfo.RegionLocY + (uint)edge.y; | 6435 | if(dy > 0) |
6436 | t2 = (rsy + 1f - py)/dy; | ||
6437 | else | ||
6438 | t2 = -(py + 1f)/dy; | ||
6449 | 6439 | ||
6450 | foreach (GridRegion sri in neighbors) | 6440 | if(t1 > t2) |
6451 | { | 6441 | t1 = t2; |
6452 | if (sri.RegionCoordX == neighborX && sri.RegionCoordY == neighborY) | 6442 | |
6453 | return 0; | 6443 | ex = px + t1 * dx; |
6444 | ey = py + t1 * dy; | ||
6454 | } | 6445 | } |
6455 | 6446 | ||
6447 | ex += World.RegionInfo.WorldLocX; | ||
6448 | ey += World.RegionInfo.WorldLocY; | ||
6449 | |||
6450 | if(World.GridService.GetRegionByPosition(World.RegionInfo.ScopeID, (int)ex, (int)ey) != null) | ||
6451 | return 0; | ||
6456 | return 1; | 6452 | return 1; |
6457 | } | 6453 | } |
6458 | 6454 | ||