Merge branch 'master' into careminster

Conflicts:
	OpenSim/Region/Framework/Scenes/Scene.cs
	OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
avinationmerge
Melanie 2012-05-14 23:32:49 +01:00
commit 6126b6da72
14 changed files with 347 additions and 93 deletions

View File

@ -29,6 +29,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using OpenMetaverse; using OpenMetaverse;
using System.Runtime.Serialization;
namespace OpenSim.Framework namespace OpenSim.Framework
{ {
@ -71,6 +72,32 @@ namespace OpenSim.Framework
return pos + offset; return pos + offset;
} }
/// <summary>
/// Returns a string representation of this SpawnPoint.
/// </summary>
/// <returns></returns>
public override string ToString()
{
return string.Format("{0},{1},{2}", Yaw, Pitch, Distance);
}
/// <summary>
/// Generate a SpawnPoint from a string
/// </summary>
/// <param name="str"></param>
public static SpawnPoint Parse(string str)
{
string[] parts = str.Split(',');
if (parts.Length != 3)
throw new ArgumentException("Invalid string: " + str);
SpawnPoint sp = new SpawnPoint();
sp.Yaw = float.Parse(parts[0]);
sp.Pitch = float.Parse(parts[1]);
sp.Distance = float.Parse(parts[2]);
return sp;
}
} }
public class RegionSettings public class RegionSettings
@ -478,7 +505,7 @@ namespace OpenSim.Framework
} }
// Connected Telehub object // Connected Telehub object
private UUID m_TelehubObject; private UUID m_TelehubObject = UUID.Zero;
public UUID TelehubObject public UUID TelehubObject
{ {
get get

View File

@ -30,6 +30,8 @@ using System.Text;
using System.Xml; using System.Xml;
using OpenMetaverse; using OpenMetaverse;
using OpenSim.Framework; using OpenSim.Framework;
using log4net;
using System.Reflection;
namespace OpenSim.Framework.Serialization.External namespace OpenSim.Framework.Serialization.External
{ {
@ -188,6 +190,28 @@ namespace OpenSim.Framework.Serialization.External
} }
} }
xtr.ReadEndElement();
if (xtr.IsStartElement("Telehub"))
{
xtr.ReadStartElement("Telehub");
while (xtr.Read() && xtr.NodeType != XmlNodeType.EndElement)
{
switch (xtr.Name)
{
case "TelehubObject":
settings.TelehubObject = UUID.Parse(xtr.ReadElementContentAsString());
break;
case "SpawnPoint":
string str = xtr.ReadElementContentAsString();
SpawnPoint sp = SpawnPoint.Parse(str);
settings.AddSpawnPoint(sp);
break;
}
}
}
xtr.Close(); xtr.Close();
sr.Close(); sr.Close();
@ -245,6 +269,15 @@ namespace OpenSim.Framework.Serialization.External
// calculates it automatically according to the date and other factors. // calculates it automatically according to the date and other factors.
xtw.WriteEndElement(); xtw.WriteEndElement();
xtw.WriteStartElement("Telehub");
if (settings.TelehubObject != UUID.Zero)
{
xtw.WriteElementString("TelehubObject", settings.TelehubObject.ToString());
foreach (SpawnPoint sp in settings.SpawnPoints())
xtw.WriteElementString("SpawnPoint", sp.ToString());
}
xtw.WriteEndElement();
xtw.WriteEndElement(); xtw.WriteEndElement();
xtw.Close(); xtw.Close();

View File

@ -78,6 +78,10 @@ namespace OpenSim.Framework.Serialization.Tests
<FixedSun>true</FixedSun> <FixedSun>true</FixedSun>
<SunPosition>12</SunPosition> <SunPosition>12</SunPosition>
</Terrain> </Terrain>
<Telehub>
<TelehubObject>00000000-0000-0000-0000-111111111111</TelehubObject>
<SpawnPoint>1,-2,0.33</SpawnPoint>
</Telehub>
</RegionSettings>"; </RegionSettings>";
private RegionSettings m_rs; private RegionSettings m_rs;
@ -116,6 +120,8 @@ namespace OpenSim.Framework.Serialization.Tests
m_rs.TerrainTexture4 = UUID.Parse("00000000-0000-0000-0000-000000000080"); m_rs.TerrainTexture4 = UUID.Parse("00000000-0000-0000-0000-000000000080");
m_rs.UseEstateSun = true; m_rs.UseEstateSun = true;
m_rs.WaterHeight = 23; m_rs.WaterHeight = 23;
m_rs.TelehubObject = UUID.Parse("00000000-0000-0000-0000-111111111111");
m_rs.AddSpawnPoint(SpawnPoint.Parse("1,-2,0.33"));
} }
[Test] [Test]
@ -129,6 +135,8 @@ namespace OpenSim.Framework.Serialization.Tests
Assert.That(deserRs.TerrainTexture2, Is.EqualTo(m_rs.TerrainTexture2)); Assert.That(deserRs.TerrainTexture2, Is.EqualTo(m_rs.TerrainTexture2));
Assert.That(deserRs.DisablePhysics, Is.EqualTo(m_rs.DisablePhysics)); Assert.That(deserRs.DisablePhysics, Is.EqualTo(m_rs.DisablePhysics));
Assert.That(deserRs.TerrainLowerLimit, Is.EqualTo(m_rs.TerrainLowerLimit)); Assert.That(deserRs.TerrainLowerLimit, Is.EqualTo(m_rs.TerrainLowerLimit));
Assert.That(deserRs.TelehubObject, Is.EqualTo(m_rs.TelehubObject));
Assert.That(deserRs.SpawnPoints()[0].ToString(), Is.EqualTo(m_rs.SpawnPoints()[0].ToString()));
} }
} }
} }

View File

@ -371,11 +371,21 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
if (missingTexturesOnly) if (missingTexturesOnly)
{ {
if (m_scene.AssetService.Get(face.TextureID.ToString()) != null) if (m_scene.AssetService.Get(face.TextureID.ToString()) != null)
{
continue; continue;
}
else else
{
// On inter-simulator teleports, this occurs if baked textures are not being stored by the
// grid asset service (which means that they are not available to the new region and so have
// to be re-requested from the client).
//
// The only available core OpenSimulator behaviour right now
// is not to store these textures, temporarily or otherwise.
m_log.DebugFormat( m_log.DebugFormat(
"[AVFACTORY]: Missing baked texture {0} ({1}) for {2}, requesting rebake.", "[AVFACTORY]: Missing baked texture {0} ({1}) for {2}, requesting rebake.",
face.TextureID, idx, sp.Name); face.TextureID, idx, sp.Name);
}
} }
else else
{ {

View File

@ -53,7 +53,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
public const int DefaultMaxTransferDistance = 4095; public const int DefaultMaxTransferDistance = 4095;
public const bool EnableWaitForCallbackFromTeleportDestDefault = true; public const bool EnableWaitForCallbackFromTeleportDestDefault = true;
/// <summary> /// <summary>
/// The maximum distance, in standard region units (256m) that an agent is allowed to transfer. /// The maximum distance, in standard region units (256m) that an agent is allowed to transfer.
/// </summary> /// </summary>
@ -211,6 +210,9 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
sp.Name, sp.AbsolutePosition, sp.Scene.RegionInfo.RegionName, position, destinationRegionName, sp.Name, sp.AbsolutePosition, sp.Scene.RegionInfo.RegionName, position, destinationRegionName,
e.Message, e.StackTrace); e.Message, e.StackTrace);
// Make sure that we clear the in-transit flag so that future teleport attempts don't always fail.
ResetFromTransit(sp.UUID);
sp.ControllingClient.SendTeleportFailed("Internal error"); sp.ControllingClient.SendTeleportFailed("Internal error");
} }
} }
@ -386,7 +388,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
return; return;
} }
if (IsInTransit(sp.UUID)) // Avie is already on the way. Caller shouldn't do this. if (!SetInTransit(sp.UUID)) // Avie is already on the way. Caller shouldn't do this.
{ {
m_log.DebugFormat( m_log.DebugFormat(
"[ENTITY TRANSFER MODULE]: Ignoring teleport request of {0} {1} to {2} ({3}) {4}/{5} - agent is already in transit.", "[ENTITY TRANSFER MODULE]: Ignoring teleport request of {0} {1} to {2} ({3}) {4}/{5} - agent is already in transit.",
@ -434,8 +436,11 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
if (!m_aScene.SimulationService.QueryAccess(finalDestination, sp.ControllingClient.AgentId, Vector3.Zero, out version, out reason)) if (!m_aScene.SimulationService.QueryAccess(finalDestination, sp.ControllingClient.AgentId, Vector3.Zero, out version, out reason))
{ {
sp.ControllingClient.SendTeleportFailed("Teleport failed: " + reason); sp.ControllingClient.SendTeleportFailed("Teleport failed: " + reason);
ResetFromTransit(sp.UUID);
return; return;
} }
m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Destination is running version {0}", version); m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Destination is running version {0}", version);
sp.ControllingClient.SendTeleportStart(teleportFlags); sp.ControllingClient.SendTeleportStart(teleportFlags);
@ -475,13 +480,16 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
bool logout = false; bool logout = false;
if (!CreateAgent(sp, reg, finalDestination, agentCircuit, teleportFlags, out reason, out logout)) if (!CreateAgent(sp, reg, finalDestination, agentCircuit, teleportFlags, out reason, out logout))
{ {
sp.ControllingClient.SendTeleportFailed(String.Format("Teleport refused: {0}", sp.ControllingClient.SendTeleportFailed(
reason)); String.Format("Teleport refused: {0}", reason));
ResetFromTransit(sp.UUID);
return; return;
} }
// OK, it got this agent. Let's close some child agents // OK, it got this agent. Let's close some child agents
sp.CloseChildAgents(newRegionX, newRegionY); sp.CloseChildAgents(newRegionX, newRegionY);
IClientIPEndpoint ipepClient; IClientIPEndpoint ipepClient;
if (NeedsNewAgent(sp.DrawDistance, oldRegionX, newRegionX, oldRegionY, newRegionY)) if (NeedsNewAgent(sp.DrawDistance, oldRegionX, newRegionX, oldRegionY, newRegionY))
{ {
@ -518,8 +526,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
capsPath = finalDestination.ServerURI + CapsUtil.GetCapsSeedPath(agentCircuit.CapsPath); capsPath = finalDestination.ServerURI + CapsUtil.GetCapsSeedPath(agentCircuit.CapsPath);
} }
SetInTransit(sp.UUID);
// Let's send a full update of the agent. This is a synchronous call. // Let's send a full update of the agent. This is a synchronous call.
AgentData agent = new AgentData(); AgentData agent = new AgentData();
sp.CopyTo(agent); sp.CopyTo(agent);
@ -532,8 +538,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
{ {
// Region doesn't take it // Region doesn't take it
m_log.WarnFormat( m_log.WarnFormat(
"[ENTITY TRANSFER MODULE]: UpdateAgent failed on teleport of {0} to {1}. Returning avatar to source region.", "[ENTITY TRANSFER MODULE]: UpdateAgent failed on teleport of {0} to {1} from {2}. Returning avatar to source region.",
sp.Name, finalDestination.RegionName); sp.Name, finalDestination.RegionName, sp.Scene.RegionInfo.RegionName);
Fail(sp, finalDestination, logout); Fail(sp, finalDestination, logout);
return; return;
@ -565,8 +571,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
if (EnableWaitForCallbackFromTeleportDest && !WaitForCallback(sp.UUID)) if (EnableWaitForCallbackFromTeleportDest && !WaitForCallback(sp.UUID))
{ {
m_log.WarnFormat( m_log.WarnFormat(
"[ENTITY TRANSFER MODULE]: Teleport of {0} to {1} failed due to no callback from destination region. Returning avatar to source region.", "[ENTITY TRANSFER MODULE]: Teleport of {0} to {1} from {2} failed due to no callback from destination region. Returning avatar to source region.",
sp.Name, finalDestination.RegionName); sp.Name, finalDestination.RegionName, sp.Scene.RegionInfo.RegionName);
Fail(sp, finalDestination, logout); Fail(sp, finalDestination, logout);
return; return;
@ -662,8 +668,10 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
protected virtual void SetCallbackURL(AgentData agent, RegionInfo region) protected virtual void SetCallbackURL(AgentData agent, RegionInfo region)
{ {
agent.CallbackURI = region.ServerURI + "agent/" + agent.AgentID.ToString() + "/" + region.RegionID.ToString() + "/release/"; agent.CallbackURI = region.ServerURI + "agent/" + agent.AgentID.ToString() + "/" + region.RegionID.ToString() + "/release/";
m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Set callback URL to {0}", agent.CallbackURI);
m_log.DebugFormat(
"[ENTITY TRANSFER MODULE]: Set release callback URL to {0} in {1}",
agent.CallbackURI, region.RegionName);
} }
protected virtual void AgentHasMovedAway(ScenePresence sp, bool logout) protected virtual void AgentHasMovedAway(ScenePresence sp, bool logout)
@ -1921,25 +1929,43 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
return count > 0; return count > 0;
} }
protected void SetInTransit(UUID id) /// <summary>
/// Set that an agent is in the process of being teleported.
/// </summary>
/// <param name='id'>The ID of the agent being teleported</param>
/// <returns>true if the agent was not already in transit, false if it was</returns>
protected bool SetInTransit(UUID id)
{ {
lock (m_agentsInTransit) lock (m_agentsInTransit)
{ {
if (!m_agentsInTransit.Contains(id)) if (!m_agentsInTransit.Contains(id))
{
m_agentsInTransit.Add(id); m_agentsInTransit.Add(id);
}
}
protected bool IsInTransit(UUID id)
{
lock (m_agentsInTransit)
{
if (m_agentsInTransit.Contains(id))
return true; return true;
}
} }
return false; return false;
} }
/// <summary>
/// Show whether the given agent is being teleported.
/// </summary>
/// <returns>true if the agent is in the process of being teleported, false otherwise.</returns>
/// <param name='id'>The agent ID</para></param>
protected bool IsInTransit(UUID id)
{
lock (m_agentsInTransit)
return m_agentsInTransit.Contains(id);
}
/// <summary>
/// Set that an agent is no longer being teleported.
/// </summary>
/// <returns></returns>
/// <param name='id'>
/// true if the agent was flagged as being teleported when this method was called, false otherwise
/// </param>
protected bool ResetFromTransit(UUID id) protected bool ResetFromTransit(UUID id)
{ {
lock (m_agentsInTransit) lock (m_agentsInTransit)
@ -1950,6 +1976,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
return true; return true;
} }
} }
return false; return false;
} }

View File

@ -64,6 +64,8 @@ namespace OpenSim.Region.CoreModules.Scripting.EmailModules
private TimeSpan m_QueueTimeout = new TimeSpan(2, 0, 0); // 2 hours without llGetNextEmail drops the queue private TimeSpan m_QueueTimeout = new TimeSpan(2, 0, 0); // 2 hours without llGetNextEmail drops the queue
private string m_InterObjectHostname = "lsl.opensim.local"; private string m_InterObjectHostname = "lsl.opensim.local";
private int m_MaxEmailSize = 4096; // largest email allowed by default, as per lsl docs.
// Scenes by Region Handle // Scenes by Region Handle
private Dictionary<ulong, Scene> m_Scenes = private Dictionary<ulong, Scene> m_Scenes =
new Dictionary<ulong, Scene>(); new Dictionary<ulong, Scene>();
@ -127,6 +129,7 @@ namespace OpenSim.Region.CoreModules.Scripting.EmailModules
SMTP_SERVER_PORT = SMTPConfig.GetInt("SMTP_SERVER_PORT", SMTP_SERVER_PORT); SMTP_SERVER_PORT = SMTPConfig.GetInt("SMTP_SERVER_PORT", SMTP_SERVER_PORT);
SMTP_SERVER_LOGIN = SMTPConfig.GetString("SMTP_SERVER_LOGIN", SMTP_SERVER_LOGIN); SMTP_SERVER_LOGIN = SMTPConfig.GetString("SMTP_SERVER_LOGIN", SMTP_SERVER_LOGIN);
SMTP_SERVER_PASSWORD = SMTPConfig.GetString("SMTP_SERVER_PASSWORD", SMTP_SERVER_PASSWORD); SMTP_SERVER_PASSWORD = SMTPConfig.GetString("SMTP_SERVER_PASSWORD", SMTP_SERVER_PASSWORD);
m_MaxEmailSize = SMTPConfig.GetInt("email_max_size", m_MaxEmailSize);
} }
catch (Exception e) catch (Exception e)
{ {
@ -176,18 +179,6 @@ namespace OpenSim.Region.CoreModules.Scripting.EmailModules
get { return true; } get { return true; }
} }
/// <summary>
/// Delay function using thread in seconds
/// </summary>
/// <param name="seconds"></param>
private void DelayInSeconds(int delay)
{
delay = (int)((float)delay * 1000);
if (delay == 0)
return;
System.Threading.Thread.Sleep(delay);
}
private bool IsLocal(UUID objectID) private bool IsLocal(UUID objectID)
{ {
string unused; string unused;
@ -267,10 +258,9 @@ namespace OpenSim.Region.CoreModules.Scripting.EmailModules
m_log.Error("[EMAIL] REGEX Problem in EMail Address: "+address); m_log.Error("[EMAIL] REGEX Problem in EMail Address: "+address);
return; return;
} }
//FIXME:Check if subject + body = 4096 Byte if ((subject.Length + body.Length) > m_MaxEmailSize)
if ((subject.Length + body.Length) > 1024)
{ {
m_log.Error("[EMAIL] subject + body > 1024 Byte"); m_log.Error("[EMAIL] subject + body larger than limit of " + m_MaxEmailSize + " bytes");
return; return;
} }
@ -345,10 +335,6 @@ namespace OpenSim.Region.CoreModules.Scripting.EmailModules
// TODO FIX // TODO FIX
} }
} }
//DONE: Message as Second Life style
//20 second delay - AntiSpam System - for now only 10 seconds
DelayInSeconds(10);
} }
/// <summary> /// <summary>

View File

@ -245,6 +245,8 @@ namespace OpenSim.Region.CoreModules.World.Archiver
// Reload serialized prims // Reload serialized prims
m_log.InfoFormat("[ARCHIVER]: Loading {0} scene objects. Please wait.", serialisedSceneObjects.Count); m_log.InfoFormat("[ARCHIVER]: Loading {0} scene objects. Please wait.", serialisedSceneObjects.Count);
UUID oldTelehubUUID = m_scene.RegionInfo.RegionSettings.TelehubObject;
IRegionSerialiserModule serialiser = m_scene.RequestModuleInterface<IRegionSerialiserModule>(); IRegionSerialiserModule serialiser = m_scene.RequestModuleInterface<IRegionSerialiserModule>();
int sceneObjectsLoadedCount = 0; int sceneObjectsLoadedCount = 0;
@ -266,11 +268,21 @@ namespace OpenSim.Region.CoreModules.World.Archiver
SceneObjectGroup sceneObject = serialiser.DeserializeGroupFromXml2(serialisedSceneObject); SceneObjectGroup sceneObject = serialiser.DeserializeGroupFromXml2(serialisedSceneObject);
bool isTelehub = (sceneObject.UUID == oldTelehubUUID);
// For now, give all incoming scene objects new uuids. This will allow scenes to be cloned // For now, give all incoming scene objects new uuids. This will allow scenes to be cloned
// on the same region server and multiple examples a single object archive to be imported // on the same region server and multiple examples a single object archive to be imported
// to the same scene (when this is possible). // to the same scene (when this is possible).
sceneObject.ResetIDs(); sceneObject.ResetIDs();
if (isTelehub)
{
// Change the Telehub Object to the new UUID
m_scene.RegionInfo.RegionSettings.TelehubObject = sceneObject.UUID;
m_scene.RegionInfo.RegionSettings.Save();
oldTelehubUUID = UUID.Zero;
}
// Try to retain the original creator/owner/lastowner if their uuid is present on this grid // Try to retain the original creator/owner/lastowner if their uuid is present on this grid
// or creator data is present. Otherwise, use the estate owner instead. // or creator data is present. Otherwise, use the estate owner instead.
foreach (SceneObjectPart part in sceneObject.Parts) foreach (SceneObjectPart part in sceneObject.Parts)
@ -348,6 +360,13 @@ namespace OpenSim.Region.CoreModules.World.Archiver
if (ignoredObjects > 0) if (ignoredObjects > 0)
m_log.WarnFormat("[ARCHIVER]: Ignored {0} scene objects that already existed in the scene", ignoredObjects); m_log.WarnFormat("[ARCHIVER]: Ignored {0} scene objects that already existed in the scene", ignoredObjects);
if (oldTelehubUUID != UUID.Zero)
{
m_log.WarnFormat("Telehub object not found: {0}", oldTelehubUUID);
m_scene.RegionInfo.RegionSettings.TelehubObject = UUID.Zero;
m_scene.RegionInfo.RegionSettings.ClearSpawnPoints();
}
} }
/// <summary> /// <summary>
@ -523,6 +542,10 @@ namespace OpenSim.Region.CoreModules.World.Archiver
currentRegionSettings.TerrainTexture4 = loadedRegionSettings.TerrainTexture4; currentRegionSettings.TerrainTexture4 = loadedRegionSettings.TerrainTexture4;
currentRegionSettings.UseEstateSun = loadedRegionSettings.UseEstateSun; currentRegionSettings.UseEstateSun = loadedRegionSettings.UseEstateSun;
currentRegionSettings.WaterHeight = loadedRegionSettings.WaterHeight; currentRegionSettings.WaterHeight = loadedRegionSettings.WaterHeight;
currentRegionSettings.TelehubObject = loadedRegionSettings.TelehubObject;
currentRegionSettings.ClearSpawnPoints();
foreach (SpawnPoint sp in loadedRegionSettings.SpawnPoints())
currentRegionSettings.AddSpawnPoint(sp);
currentRegionSettings.Save(); currentRegionSettings.Save();

View File

@ -328,7 +328,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver
/// <returns></returns> /// <returns></returns>
public string CreateControlFile(Dictionary<string, object> options) public string CreateControlFile(Dictionary<string, object> options)
{ {
int majorVersion = MAX_MAJOR_VERSION, minorVersion = 7; int majorVersion = MAX_MAJOR_VERSION, minorVersion = 8;
// //
// if (options.ContainsKey("version")) // if (options.ContainsKey("version"))
// { // {

View File

@ -534,6 +534,8 @@ namespace OpenSim.Region.CoreModules.World.Archiver.Tests
rs.TerrainTexture4 = UUID.Parse("00000000-0000-0000-0000-000000000080"); rs.TerrainTexture4 = UUID.Parse("00000000-0000-0000-0000-000000000080");
rs.UseEstateSun = true; rs.UseEstateSun = true;
rs.WaterHeight = 23; rs.WaterHeight = 23;
rs.TelehubObject = UUID.Parse("00000000-0000-0000-0000-111111111111");
rs.AddSpawnPoint(SpawnPoint.Parse("1,-2,0.33"));
tar.WriteFile(ArchiveConstants.SETTINGS_PATH + "region1.xml", RegionSettingsSerializer.Serialize(rs)); tar.WriteFile(ArchiveConstants.SETTINGS_PATH + "region1.xml", RegionSettingsSerializer.Serialize(rs));
@ -580,6 +582,8 @@ namespace OpenSim.Region.CoreModules.World.Archiver.Tests
Assert.That(loadedRs.TerrainTexture4, Is.EqualTo(UUID.Parse("00000000-0000-0000-0000-000000000080"))); Assert.That(loadedRs.TerrainTexture4, Is.EqualTo(UUID.Parse("00000000-0000-0000-0000-000000000080")));
Assert.That(loadedRs.UseEstateSun, Is.True); Assert.That(loadedRs.UseEstateSun, Is.True);
Assert.That(loadedRs.WaterHeight, Is.EqualTo(23)); Assert.That(loadedRs.WaterHeight, Is.EqualTo(23));
Assert.AreEqual(UUID.Zero, loadedRs.TelehubObject); // because no object was found with the original UUID
Assert.AreEqual(0, loadedRs.SpawnPoints().Count);
} }
/// <summary> /// <summary>

View File

@ -591,6 +591,15 @@ namespace OpenSim.Region.Framework.Scenes
get { return m_sceneGraph.Entities; } get { return m_sceneGraph.Entities; }
} }
// can be closest/random/sequence
private string m_SpawnPointRouting = "closest";
// used in sequence see: SpawnPoint()
private int m_SpawnPoint;
public string SpawnPointRouting
{
get { return m_SpawnPointRouting; }
}
#endregion Properties #endregion Properties
#region Constructors #region Constructors
@ -608,7 +617,7 @@ namespace OpenSim.Region.Framework.Scenes
Random random = new Random(); Random random = new Random();
m_lastAllocatedLocalId = (uint)(random.NextDouble() * (double)(uint.MaxValue/2))+(uint)(uint.MaxValue/4); m_lastAllocatedLocalId = (uint)(random.NextDouble() * (double)(uint.MaxValue / 2)) + (uint)(uint.MaxValue / 4);
m_moduleLoader = moduleLoader; m_moduleLoader = moduleLoader;
m_authenticateHandler = authen; m_authenticateHandler = authen;
m_sceneGridService = sceneGridService; m_sceneGridService = sceneGridService;
@ -728,6 +737,8 @@ namespace OpenSim.Region.Framework.Scenes
m_maxPhys = RegionInfo.PhysPrimMax; m_maxPhys = RegionInfo.PhysPrimMax;
} }
m_SpawnPointRouting = startupConfig.GetString("SpawnPointRouting", "closest");
// Here, if clamping is requested in either global or // Here, if clamping is requested in either global or
// local config, it will be used // local config, it will be used
// //
@ -2684,10 +2695,10 @@ namespace OpenSim.Region.Framework.Scenes
{ {
SceneObjectGroup grp = sceneObject; SceneObjectGroup grp = sceneObject;
m_log.DebugFormat( // m_log.DebugFormat(
"[ATTACHMENT]: Received attachment {0}, inworld asset id {1}", grp.FromItemID, grp.UUID); // "[ATTACHMENT]: Received attachment {0}, inworld asset id {1}", grp.FromItemID, grp.UUID);
m_log.DebugFormat( // m_log.DebugFormat(
"[ATTACHMENT]: Attach to avatar {0} at position {1}", sp.UUID, grp.AbsolutePosition); // "[ATTACHMENT]: Attach to avatar {0} at position {1}", sp.UUID, grp.AbsolutePosition);
RootPrim.RemFlag(PrimFlags.TemporaryOnRez); RootPrim.RemFlag(PrimFlags.TemporaryOnRez);
@ -3554,7 +3565,7 @@ namespace OpenSim.Region.Framework.Scenes
public bool NewUserConnection(AgentCircuitData agent, uint teleportFlags, out string reason, bool requirePresenceLookup) public bool NewUserConnection(AgentCircuitData agent, uint teleportFlags, out string reason, bool requirePresenceLookup)
{ {
bool vialogin = ((teleportFlags & (uint)TPFlags.ViaLogin) != 0 || bool vialogin = ((teleportFlags & (uint)TPFlags.ViaLogin) != 0 ||
(teleportFlags & (uint)TPFlags.ViaHGLogin) != 0); (teleportFlags & (uint)TPFlags.ViaHGLogin) != 0);
bool viahome = ((teleportFlags & (uint)TPFlags.ViaHome) != 0); bool viahome = ((teleportFlags & (uint)TPFlags.ViaHome) != 0);
bool godlike = ((teleportFlags & (uint)TPFlags.Godlike) != 0); bool godlike = ((teleportFlags & (uint)TPFlags.Godlike) != 0);
@ -3570,8 +3581,17 @@ namespace OpenSim.Region.Framework.Scenes
// Don't disable this log message - it's too helpful // Don't disable this log message - it's too helpful
m_log.DebugFormat( m_log.DebugFormat(
"[SCENE]: Region {0} told of incoming {1} agent {2} {3} {4} (circuit code {5}, IP {6}, viewer {7}, teleportflags ({8}), position {9})", "[SCENE]: Region {0} told of incoming {1} agent {2} {3} {4} (circuit code {5}, IP {6}, viewer {7}, teleportflags ({8}), position {9})",
RegionInfo.RegionName, (agent.child ? "child" : "root"),agent.firstname, agent.lastname, RegionInfo.RegionName,
agent.AgentID, agent.circuitcode, agent.IPAddress, agent.Viewer, ((TPFlags)teleportFlags).ToString(), agent.startpos); (agent.child ? "child" : "root"),
agent.firstname,
agent.lastname,
agent.AgentID,
agent.circuitcode,
agent.IPAddress,
agent.Viewer,
((TPFlags)teleportFlags).ToString(),
agent.startpos
);
if (LoginsDisabled) if (LoginsDisabled)
{ {
@ -3586,7 +3606,11 @@ namespace OpenSim.Region.Framework.Scenes
// We have a zombie from a crashed session. // We have a zombie from a crashed session.
// Or the same user is trying to be root twice here, won't work. // Or the same user is trying to be root twice here, won't work.
// Kill it. // Kill it.
m_log.DebugFormat("[SCENE]: Zombie scene presence detected for {0} in {1}", agent.AgentID, RegionInfo.RegionName); m_log.DebugFormat(
"[SCENE]: Zombie scene presence detected for {0} in {1}",
agent.AgentID,
RegionInfo.RegionName
);
sp.ControllingClient.Close(); sp.ControllingClient.Close();
sp = null; sp = null;
} }
@ -3613,8 +3637,7 @@ namespace OpenSim.Region.Framework.Scenes
{ {
if (!VerifyUserPresence(agent, out reason)) if (!VerifyUserPresence(agent, out reason))
return false; return false;
} } catch (Exception e)
catch (Exception e)
{ {
m_log.ErrorFormat( m_log.ErrorFormat(
"[SCENE]: Exception verifying presence {0}{1}", e.Message, e.StackTrace); "[SCENE]: Exception verifying presence {0}{1}", e.Message, e.StackTrace);
@ -3649,8 +3672,7 @@ namespace OpenSim.Region.Framework.Scenes
CapsModule.SetAgentCapsSeeds(agent); CapsModule.SetAgentCapsSeeds(agent);
CapsModule.CreateCaps(agent.AgentID); CapsModule.CreateCaps(agent.AgentID);
} }
} } else
else
{ {
// Let the SP know how we got here. This has a lot of interesting // Let the SP know how we got here. This has a lot of interesting
// uses down the line. // uses down the line.
@ -3714,8 +3736,7 @@ namespace OpenSim.Region.Framework.Scenes
agent.startpos.Z = 720; agent.startpos.Z = 720;
} }
} }
} } else
else
{ {
if (agent.startpos.X > EastBorders[0].BorderLine.Z) if (agent.startpos.X > EastBorders[0].BorderLine.Z)
{ {
@ -3741,10 +3762,19 @@ namespace OpenSim.Region.Framework.Scenes
SceneObjectGroup telehub = GetSceneObjectGroup(RegionInfo.RegionSettings.TelehubObject); SceneObjectGroup telehub = GetSceneObjectGroup(RegionInfo.RegionSettings.TelehubObject);
// Can have multiple SpawnPoints // Can have multiple SpawnPoints
List<SpawnPoint> spawnpoints = RegionInfo.RegionSettings.SpawnPoints(); List<SpawnPoint> spawnpoints = RegionInfo.RegionSettings.SpawnPoints();
if ( spawnpoints.Count > 1) if (spawnpoints.Count > 1)
{ {
// We have multiple SpawnPoints, Route the agent to a random one // We have multiple SpawnPoints, Route the agent to a random or sequential one
agent.startpos = spawnpoints[Util.RandomClass.Next(spawnpoints.Count)].GetLocation(telehub.AbsolutePosition, telehub.GroupRotation); if (SpawnPointRouting == "random")
agent.startpos = spawnpoints[Util.RandomClass.Next(spawnpoints.Count) - 1].GetLocation(
telehub.AbsolutePosition,
telehub.GroupRotation
);
else
agent.startpos = spawnpoints[SpawnPoint()].GetLocation(
telehub.AbsolutePosition,
telehub.GroupRotation
);
} }
else else
{ {
@ -5640,5 +5670,19 @@ Environment.Exit(1);
} }
} }
} }
// manage and select spawn points in sequence
public int SpawnPoint()
{
int spawnpoints = RegionInfo.RegionSettings.SpawnPoints().Count;
if (spawnpoints == 0)
return 0;
m_SpawnPoint++;
if (m_SpawnPoint > spawnpoints)
m_SpawnPoint = 1;
return m_SpawnPoint - 1;
}
} }
} }

View File

@ -4134,28 +4134,93 @@ namespace OpenSim.Region.Framework.Scenes
if (spawnPoints.Length == 0) if (spawnPoints.Length == 0)
return; return;
float distance = 9999; int index;
int closest = -1; bool selected = false;
for (int i = 0 ; i < spawnPoints.Length ; i++) switch (m_scene.SpawnPointRouting)
{ {
Vector3 spawnPosition = spawnPoints[i].GetLocation(telehub.AbsolutePosition, telehub.GroupRotation); case "closest":
Vector3 offset = spawnPosition - pos;
float d = Vector3.Mag(offset);
if (d >= distance)
continue;
ILandObject land = m_scene.LandChannel.GetLandObject(spawnPosition.X, spawnPosition.Y);
if (land == null)
continue;
if (land.IsEitherBannedOrRestricted(UUID))
continue;
distance = d;
closest = i;
}
if (closest == -1)
return;
pos = spawnPoints[closest].GetLocation(telehub.AbsolutePosition, telehub.GroupRotation); float distance = 9999;
int closest = -1;
for (int i = 0; i < spawnPoints.Length; i++)
{
Vector3 spawnPosition = spawnPoints[i].GetLocation(
telehub.AbsolutePosition,
telehub.GroupRotation
);
Vector3 offset = spawnPosition - pos;
float d = Vector3.Mag(offset);
if (d >= distance)
continue;
ILandObject land = m_scene.LandChannel.GetLandObject(spawnPosition.X, spawnPosition.Y);
if (land == null)
continue;
if (land.IsEitherBannedOrRestricted(UUID))
continue;
distance = d;
closest = i;
}
if (closest == -1)
return;
pos = spawnPoints[closest].GetLocation(telehub.AbsolutePosition, telehub.GroupRotation);
return;
case "random":
do
{
index = Util.RandomClass.Next(spawnPoints.Length - 1);
Vector3 spawnPosition = spawnPoints[index].GetLocation(
telehub.AbsolutePosition,
telehub.GroupRotation
);
// SpawnPoint sp = spawnPoints[index];
ILandObject land = m_scene.LandChannel.GetLandObject(spawnPosition.X, spawnPosition.Y);
if (land == null || land.IsEitherBannedOrRestricted(UUID))
selected = false;
else
selected = true;
} while ( selected == false);
pos = spawnPoints[index].GetLocation(
telehub.AbsolutePosition,
telehub.GroupRotation
);
return;
case "sequence":
do
{
index = m_scene.SpawnPoint();
Vector3 spawnPosition = spawnPoints[index].GetLocation(
telehub.AbsolutePosition,
telehub.GroupRotation
);
// SpawnPoint sp = spawnPoints[index];
ILandObject land = m_scene.LandChannel.GetLandObject(spawnPosition.X, spawnPosition.Y);
if (land == null || land.IsEitherBannedOrRestricted(UUID))
selected = false;
else
selected = true;
} while (selected == false);
pos = spawnPoints[index].GetLocation(telehub.AbsolutePosition, telehub.GroupRotation);
;
return;
default:
return;
}
} }
} }
} }

View File

@ -111,6 +111,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
protected IUrlModule m_UrlModule = null; protected IUrlModule m_UrlModule = null;
protected Dictionary<UUID, UserInfoCacheEntry> m_userInfoCache = protected Dictionary<UUID, UserInfoCacheEntry> m_userInfoCache =
new Dictionary<UUID, UserInfoCacheEntry>(); new Dictionary<UUID, UserInfoCacheEntry>();
protected int EMAIL_PAUSE_TIME = 20; // documented delay value for smtp.
protected Timer m_ShoutSayTimer; protected Timer m_ShoutSayTimer;
protected int m_SayShoutCount = 0; protected int m_SayShoutCount = 0;
@ -127,6 +128,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
m_item = item; m_item = item;
m_debuggerSafe = m_ScriptEngine.Config.GetBoolean("DebuggerSafe", false); m_debuggerSafe = m_ScriptEngine.Config.GetBoolean("DebuggerSafe", false);
LoadLimits(); // read script limits from config.
m_TransferModule =
m_ScriptEngine.World.RequestModuleInterface<IMessageTransferModule>();
m_UrlModule = m_ScriptEngine.World.RequestModuleInterface<IUrlModule>();
AsyncCommands = new AsyncCommandManager(ScriptEngine);
}
/* load configuration items that affect script, object and run-time behavior. */
private void LoadLimits()
{
m_ScriptDelayFactor = m_ScriptDelayFactor =
m_ScriptEngine.Config.GetFloat("ScriptDelayFactor", 1.0f); m_ScriptEngine.Config.GetFloat("ScriptDelayFactor", 1.0f);
m_ScriptDistanceFactor = m_ScriptDistanceFactor =
@ -139,12 +152,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
m_ScriptEngine.Config.GetInt("NotecardLineReadCharsMax", 255); m_ScriptEngine.Config.GetInt("NotecardLineReadCharsMax", 255);
if (m_notecardLineReadCharsMax > 65535) if (m_notecardLineReadCharsMax > 65535)
m_notecardLineReadCharsMax = 65535; m_notecardLineReadCharsMax = 65535;
// load limits for particular subsystems.
m_TransferModule = IConfig SMTPConfig;
m_ScriptEngine.World.RequestModuleInterface<IMessageTransferModule>(); if ((SMTPConfig = m_ScriptEngine.ConfigSource.Configs["SMTP"]) != null) {
m_UrlModule = m_ScriptEngine.World.RequestModuleInterface<IUrlModule>(); // there's an smtp config, so load in the snooze time.
EMAIL_PAUSE_TIME = SMTPConfig.GetInt("email_pause_time", EMAIL_PAUSE_TIME);
AsyncCommands = new AsyncCommandManager(ScriptEngine); }
} }
public override Object InitializeLifetimeService() public override Object InitializeLifetimeService()
@ -3127,6 +3140,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
public virtual void llSleep(double sec) public virtual void llSleep(double sec)
{ {
// m_log.Info("llSleep snoozing " + sec + "s.");
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
Thread.Sleep((int)(sec * 1000)); Thread.Sleep((int)(sec * 1000));
} }
@ -3413,7 +3427,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
} }
emailModule.SendEmail(m_host.UUID, address, subject, message); emailModule.SendEmail(m_host.UUID, address, subject, message);
ScriptSleep(15000); ScriptSleep(EMAIL_PAUSE_TIME * 1000);
} }
public void llGetNextEmail(string address, string subject) public void llGetNextEmail(string address, string subject)

0
bin/Ionic.Zip.dll Normal file → Executable file
View File

View File

@ -241,6 +241,14 @@
;; server to send mail through. ;; server to send mail through.
; emailmodule = DefaultEmailModule ; emailmodule = DefaultEmailModule
;# {SpawnPointRouting} {} {Set routing method for Telehub Spawnpoints} {closest random sequential} closest
;; SpawnPointRouting adjusts the landing for incoming avatars.
;; "closest" will place the avatar at the SpawnPoint located in the closest
;; available spot to the destination (typically map click/landmark).
;; "random" will place the avatar on a randomly selected spawnpoint;
;; "sequential" will place the avatar on the next sequential SpawnPoint
; SpawnPointRouting = closest
[Estates] [Estates]
; If these values are commented out then the user will be asked for estate details when required (this is the normal case). ; If these values are commented out then the user will be asked for estate details when required (this is the normal case).
; If these values are uncommented then they will be used to create a default estate as necessary. ; If these values are uncommented then they will be used to create a default estate as necessary.
@ -273,6 +281,12 @@
;# {host_domain_header_from} {[Startup]emailmodule:DefaultEmailModule enabled:true} {From address to use in the sent email header?} {} 127.0.0.1 ;# {host_domain_header_from} {[Startup]emailmodule:DefaultEmailModule enabled:true} {From address to use in the sent email header?} {} 127.0.0.1
; host_domain_header_from = "127.0.0.1" ; host_domain_header_from = "127.0.0.1"
;# {email_pause_time} {[Startup]emailmodule:DefaultEmailModule enabled:true} {Period in seconds to delay after an email is sent.} {} 20
; email_pause_time = 20
;# {email_max_size} {[Startup]emailmodule:DefaultEmailModule enabled:true} {Maximum total size of email in bytes.} {} 4096
; email_max_size = 4096
;# {SMTP_SERVER_HOSTNAME} {[Startup]emailmodule:DefaultEmailModule enabled:true} {SMTP server name?} {} 127.0.0.1 ;# {SMTP_SERVER_HOSTNAME} {[Startup]emailmodule:DefaultEmailModule enabled:true} {SMTP server name?} {} 127.0.0.1
; SMTP_SERVER_HOSTNAME = "127.0.0.1" ; SMTP_SERVER_HOSTNAME = "127.0.0.1"
@ -285,7 +299,6 @@
;# {SMTP_SERVER_PASSWORD} {[Startup]emailmodule:DefaultEmailModule enabled:true} {SMTP server password} {} ;# {SMTP_SERVER_PASSWORD} {[Startup]emailmodule:DefaultEmailModule enabled:true} {SMTP server password} {}
; SMTP_SERVER_PASSWORD = "" ; SMTP_SERVER_PASSWORD = ""
[Network] [Network]
;; Configure the remote console user here. This will not actually be used ;; Configure the remote console user here. This will not actually be used
;; unless you use -console=rest at startup. ;; unless you use -console=rest at startup.
@ -677,7 +690,7 @@
;; Sets the multiplier for the scripting delays ;; Sets the multiplier for the scripting delays
; ScriptDelayFactor = 1.0 ; ScriptDelayFactor = 1.0
;; The factor the 10 m distances llimits are multiplied by ;; The factor the 10 m distances limits are multiplied by
; ScriptDistanceLimitFactor = 1.0 ; ScriptDistanceLimitFactor = 1.0
;; Maximum length of notecard line read ;; Maximum length of notecard line read