diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
index e6a323eebc..fc92f23a62 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
@@ -2298,5 +2298,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
});
return result;
}
+
+ ///
+ /// Convert a unix time to a llGetTimestamp() like string
+ ///
+ ///
+ ///
+ public LSL_String osUnixTimeToTimestamp(long time)
+ {
+ CheckThreatLevel(ThreatLevel.VeryLow, "osUnixTimeToTimestamp");
+ long baseTicks = 621355968000000000;
+ long tickResolution = 10000000;
+ long epochTicks = (time * tickResolution) + baseTicks;
+ DateTime date = new DateTime(epochTicks);
+
+ return date.ToString("yyyy-MM-ddTHH:mm:ss.fffffffZ");
+ }
}
-}
+}
\ No newline at end of file
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs
index c9a24f613b..10d61caeff 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs
@@ -184,5 +184,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
LSL_List osGetAvatarList();
+ LSL_String osUnixTimeToTimestamp(long time);
}
}
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs
index 370bf1d4e6..f3142e65f0 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs
@@ -678,26 +678,32 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
{
return m_OSSL_Functions.osGetSimulatorMemory();
}
+
public void osKickAvatar(string FirstName,string SurName,string alert)
{
m_OSSL_Functions.osKickAvatar(FirstName, SurName, alert);
}
+
public void osSetSpeed(string UUID, float SpeedModifier)
{
m_OSSL_Functions.osSetSpeed(UUID, SpeedModifier);
}
+
public void osCauseDamage(string avatar, double damage)
{
m_OSSL_Functions.osCauseDamage(avatar, damage);
}
+
public void osCauseHealing(string avatar, double healing)
{
m_OSSL_Functions.osCauseHealing(avatar, healing);
}
+
public LSL_List osGetPrimitiveParams(LSL_Key prim, LSL_List rules)
{
return m_OSSL_Functions.osGetPrimitiveParams(prim, rules);
}
+
public void osSetPrimitiveParams(LSL_Key prim, LSL_List rules)
{
m_OSSL_Functions.osSetPrimitiveParams(prim, rules);
@@ -717,5 +723,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
{
return m_OSSL_Functions.osGetAvatarList();
}
+
+ public LSL_String osUnixTimeToTimestamp(long time)
+ {
+ return m_OSSL_Functions.osUnixTimeToTimestamp(time);
+ }
}
-}
+}
\ No newline at end of file
diff --git a/OpenSim/Services/LLLoginService/LLLoginService.cs b/OpenSim/Services/LLLoginService/LLLoginService.cs
index a06476e9cb..fcfdd1d6d9 100644
--- a/OpenSim/Services/LLLoginService/LLLoginService.cs
+++ b/OpenSim/Services/LLLoginService/LLLoginService.cs
@@ -28,6 +28,7 @@
using System;
using System.Collections;
using System.Collections.Generic;
+using System.Linq;
using System.Net;
using System.Reflection;
using System.Text.RegularExpressions;
@@ -427,12 +428,9 @@ namespace OpenSim.Services.LLLoginService
{
m_log.WarnFormat("[LLOGIN SERVICE]: User {0} {1} does not have a valid home and this grid does not have default locations. Attempting to find random region",
account.FirstName, account.LastName);
- defaults = m_GridService.GetRegionsByName(scopeID, "", 1);
- if (defaults != null && defaults.Count > 0)
- {
- region = defaults[0];
+ region = FindAlternativeRegion(scopeID);
+ if (region != null)
where = "safe";
- }
}
}
@@ -459,12 +457,9 @@ namespace OpenSim.Services.LLLoginService
else
{
m_log.Info("[LLOGIN SERVICE]: Last Region Not Found Attempting to find random region");
- defaults = m_GridService.GetRegionsByName(scopeID, "", 1);
- if (defaults != null && defaults.Count > 0)
- {
- region = defaults[0];
+ region = FindAlternativeRegion(scopeID);
+ if (region != null)
where = "safe";
- }
}
}
@@ -564,6 +559,31 @@ namespace OpenSim.Services.LLLoginService
}
+ private GridRegion FindAlternativeRegion(UUID scopeID)
+ {
+ List hyperlinks = null;
+ List regions = m_GridService.GetFallbackRegions(scopeID, 1000 * (int)Constants.RegionSize, 1000 * (int)Constants.RegionSize);
+ if (regions != null && regions.Count > 0)
+ {
+ hyperlinks = m_GridService.GetHyperlinks(scopeID);
+ IEnumerable availableRegions = regions.Except(hyperlinks);
+ if (availableRegions.Count() > 0)
+ return availableRegions.ElementAt(0);
+ }
+ // No fallbacks, try to find an arbitrary region that is not a hyperlink
+ // maxNumber is fixed for now; maybe use some search pattern with increasing maxSize here?
+ regions = m_GridService.GetRegionsByName(scopeID, "", 10);
+ if (regions != null && regions.Count > 0)
+ {
+ if (hyperlinks == null)
+ hyperlinks = m_GridService.GetHyperlinks(scopeID);
+ IEnumerable availableRegions = regions.Except(hyperlinks);
+ if (availableRegions.Count() > 0)
+ return availableRegions.ElementAt(0);
+ }
+ return null;
+ }
+
private GridRegion FindForeignRegion(string domainName, uint port, string regionName, out GridRegion gatekeeper)
{
gatekeeper = new GridRegion();
diff --git a/prebuild.xml b/prebuild.xml
index e77d5c1fd2..ac003d9a17 100644
--- a/prebuild.xml
+++ b/prebuild.xml
@@ -1214,6 +1214,7 @@
../../../bin/
+