Merge branch 'master' into httptests

httptests
UbitUmarov 2017-05-14 07:52:50 +01:00
commit eea247fcc5
25 changed files with 247 additions and 82 deletions

View File

@ -1789,6 +1789,7 @@ namespace OpenSim.Data.PGSQL
prim.CollisionSoundVolume = Convert.ToSingle(primRow["CollisionSoundVolume"]); prim.CollisionSoundVolume = Convert.ToSingle(primRow["CollisionSoundVolume"]);
prim.PassTouches = (bool)primRow["PassTouches"]; prim.PassTouches = (bool)primRow["PassTouches"];
prim.PassCollisions = (bool)primRow["PassCollisions"];
if (!(primRow["MediaURL"] is System.DBNull)) if (!(primRow["MediaURL"] is System.DBNull))
prim.MediaUrl = (string)primRow["MediaURL"]; prim.MediaUrl = (string)primRow["MediaURL"];
@ -2212,7 +2213,7 @@ namespace OpenSim.Data.PGSQL
parameters.Add(_Database.CreateParameter("CollisionSoundVolume", prim.CollisionSoundVolume)); parameters.Add(_Database.CreateParameter("CollisionSoundVolume", prim.CollisionSoundVolume));
parameters.Add(_Database.CreateParameter("PassTouches", (bool)prim.PassTouches)); parameters.Add(_Database.CreateParameter("PassTouches", (bool)prim.PassTouches));
parameters.Add(_Database.CreateParameter("PassCollisions", prim.PassCollisions)); parameters.Add(_Database.CreateParameter("PassCollisions", (bool)prim.PassCollisions));
if (prim.PassTouches) if (prim.PassTouches)
@ -2221,9 +2222,9 @@ namespace OpenSim.Data.PGSQL
parameters.Add(_Database.CreateParameter("PassTouches", false)); parameters.Add(_Database.CreateParameter("PassTouches", false));
if (prim.PassCollisions) if (prim.PassCollisions)
parameters.Add(_Database.CreateParameter("PassCollisions", 1)); parameters.Add(_Database.CreateParameter("PassCollisions", true));
else else
parameters.Add(_Database.CreateParameter("PassCollisions", 0)); parameters.Add(_Database.CreateParameter("PassCollisions", false));
parameters.Add(_Database.CreateParameter("LinkNumber", prim.LinkNum)); parameters.Add(_Database.CreateParameter("LinkNumber", prim.LinkNum));
parameters.Add(_Database.CreateParameter("MediaURL", prim.MediaUrl)); parameters.Add(_Database.CreateParameter("MediaURL", prim.MediaUrl));

View File

@ -1211,3 +1211,17 @@ BEGIN TRANSACTION;
ALTER TABLE prims ADD "PhysInertia" TEXT; ALTER TABLE prims ADD "PhysInertia" TEXT;
COMMIT; COMMIT;
:VERSION 47 #---- Convert field PassCollisions in table prims to BOOLEAN
BEGIN TRANSACTION;
ALTER TABLE "public"."prims" ALTER COLUMN "PassCollisions" DROP DEFAULT;
ALTER TABLE "public"."prims"
ALTER COLUMN "PassCollisions" TYPE BOOLEAN
USING CASE WHEN "PassCollisions" = 0 THEN FALSE
WHEN "PassCollisions" = 1 THEN TRUE
ELSE NULL
END;
COMMIT;

View File

@ -74,8 +74,6 @@ namespace OpenSim.Framework
{ {
rwLock.EnterWriteLock(); rwLock.EnterWriteLock();
gotLock = true; gotLock = true;
}
if (Dictionary1.ContainsKey(key1)) if (Dictionary1.ContainsKey(key1))
{ {
if (!Dictionary2.ContainsKey(key2)) if (!Dictionary2.ContainsKey(key2))
@ -86,10 +84,10 @@ namespace OpenSim.Framework
if (!Dictionary1.ContainsKey(key1)) if (!Dictionary1.ContainsKey(key1))
throw new ArgumentException("key2 exists in the dictionary but not key1"); throw new ArgumentException("key2 exists in the dictionary but not key1");
} }
Dictionary1[key1] = value; Dictionary1[key1] = value;
Dictionary2[key2] = value; Dictionary2[key2] = value;
} }
}
finally finally
{ {
if (gotLock) if (gotLock)
@ -112,11 +110,10 @@ namespace OpenSim.Framework
{ {
rwLock.EnterWriteLock(); rwLock.EnterWriteLock();
gotLock = true; gotLock = true;
}
Dictionary1.Remove(key1); Dictionary1.Remove(key1);
success = Dictionary2.Remove(key2); success = Dictionary2.Remove(key2);
} }
}
finally finally
{ {
if (gotLock) if (gotLock)
@ -150,9 +147,13 @@ namespace OpenSim.Framework
foreach (KeyValuePair<TKey2, TValue> kvp in Dictionary2) foreach (KeyValuePair<TKey2, TValue> kvp in Dictionary2)
{ {
if (kvp.Value.Equals(value)) if (kvp.Value.Equals(value))
{
try { }
finally
{ {
Dictionary1.Remove(key1); Dictionary1.Remove(key1);
Dictionary2.Remove(kvp.Key); Dictionary2.Remove(kvp.Key);
}
found = true; found = true;
break; break;
} }
@ -192,9 +193,13 @@ namespace OpenSim.Framework
foreach (KeyValuePair<TKey1, TValue> kvp in Dictionary1) foreach (KeyValuePair<TKey1, TValue> kvp in Dictionary1)
{ {
if (kvp.Value.Equals(value)) if (kvp.Value.Equals(value))
{
try { }
finally
{ {
Dictionary2.Remove(key2); Dictionary2.Remove(key2);
Dictionary1.Remove(kvp.Key); Dictionary1.Remove(kvp.Key);
}
found = true; found = true;
break; break;
} }
@ -224,11 +229,10 @@ namespace OpenSim.Framework
{ {
rwLock.EnterWriteLock(); rwLock.EnterWriteLock();
gotLock = true; gotLock = true;
}
Dictionary1.Clear(); Dictionary1.Clear();
Dictionary2.Clear(); Dictionary2.Clear();
} }
}
finally finally
{ {
if (gotLock) if (gotLock)
@ -485,9 +489,8 @@ namespace OpenSim.Framework
try {} try {}
finally finally
{ {
rwLock.EnterUpgradeableReadLock(); rwLock.EnterWriteLock();
gotWriteLock = true; gotWriteLock = true;
}
for (int i = 0; i < list.Count; i++) for (int i = 0; i < list.Count; i++)
Dictionary1.Remove(list[i]); Dictionary1.Remove(list[i]);
@ -495,6 +498,7 @@ namespace OpenSim.Framework
for (int i = 0; i < list2.Count; i++) for (int i = 0; i < list2.Count; i++)
Dictionary2.Remove(list2[i]); Dictionary2.Remove(list2[i]);
} }
}
finally finally
{ {
if (gotWriteLock) if (gotWriteLock)

View File

@ -76,6 +76,8 @@ namespace OpenSim.Region.Framework.Interfaces
/// <returns></returns> /// <returns></returns>
ILandObject GetLandObject(int localID); ILandObject GetLandObject(int localID);
ILandObject GetLandObject(UUID GlobalID);
/// <summary> /// <summary>
/// Clear the land channel of all parcels. /// Clear the land channel of all parcels.
/// </summary> /// </summary>

View File

@ -189,5 +189,7 @@ namespace OpenSim.Framework
/// </summary> /// </summary>
/// <returns>The music url.</returns> /// <returns>The music url.</returns>
string GetMusicUrl(); string GetMusicUrl();
void Clear();
} }
} }

View File

@ -97,7 +97,9 @@ namespace OpenSim.Framework
private bool _mediaLoop = false; private bool _mediaLoop = false;
private bool _obscureMusic = false; private bool _obscureMusic = false;
private bool _obscureMedia = false; private bool _obscureMedia = false;
private float _dwell = 0;
private float m_dwell = 0;
public double LastDwellTimeMS;
public bool SeeAVs { get; set; } public bool SeeAVs { get; set; }
public bool AnyAVSounds { get; set; } public bool AnyAVSounds { get; set; }
@ -111,11 +113,12 @@ namespace OpenSim.Framework
{ {
get get
{ {
return _dwell; return m_dwell;
} }
set set
{ {
_dwell = value; m_dwell = value;
LastDwellTimeMS = Util.GetTimeStampMS();
} }
} }
@ -735,6 +738,7 @@ namespace OpenSim.Framework
SeeAVs = true; SeeAVs = true;
AnyAVSounds = true; AnyAVSounds = true;
GroupAVSounds = true; GroupAVSounds = true;
LastDwellTimeMS = Util.GetTimeStampMS();
} }
/// <summary> /// <summary>
@ -784,7 +788,7 @@ namespace OpenSim.Framework
landData._obscureMedia = _obscureMedia; landData._obscureMedia = _obscureMedia;
landData._simwideArea = _simwideArea; landData._simwideArea = _simwideArea;
landData._simwidePrims = _simwidePrims; landData._simwidePrims = _simwidePrims;
landData._dwell = _dwell; landData.m_dwell = m_dwell;
landData.SeeAVs = SeeAVs; landData.SeeAVs = SeeAVs;
landData.AnyAVSounds = AnyAVSounds; landData.AnyAVSounds = AnyAVSounds;
landData.GroupAVSounds = GroupAVSounds; landData.GroupAVSounds = GroupAVSounds;

View File

@ -74,7 +74,12 @@ namespace OpenSim
AppDomain.CurrentDomain.UnhandledException += AppDomain.CurrentDomain.UnhandledException +=
new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
if(Util.IsWindows())
ServicePointManager.DefaultConnectionLimit = 32;
else
ServicePointManager.DefaultConnectionLimit = 12; ServicePointManager.DefaultConnectionLimit = 12;
ServicePointManager.Expect100Continue = false;
ServicePointManager.UseNagleAlgorithm = false; ServicePointManager.UseNagleAlgorithm = false;
// Add the arguments supplied when running the application to the configuration // Add the arguments supplied when running the application to the configuration

View File

@ -3111,10 +3111,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
public void SendParcelInfo(RegionInfo info, LandData land, UUID parcelID, uint x, uint y) public void SendParcelInfo(RegionInfo info, LandData land, UUID parcelID, uint x, uint y)
{ {
float dwell = 0.0f;
IDwellModule dwellModule = m_scene.RequestModuleInterface<IDwellModule>();
if (dwellModule != null)
dwell = dwellModule.GetDwell(land.GlobalID);
ParcelInfoReplyPacket reply = (ParcelInfoReplyPacket)PacketPool.Instance.GetPacket(PacketType.ParcelInfoReply); ParcelInfoReplyPacket reply = (ParcelInfoReplyPacket)PacketPool.Instance.GetPacket(PacketType.ParcelInfoReply);
reply.AgentData.AgentID = m_agentId; reply.AgentData.AgentID = m_agentId;
reply.Data.ParcelID = parcelID; reply.Data.ParcelID = parcelID;
@ -3141,7 +3137,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
reply.Data.GlobalZ = pos.Z; reply.Data.GlobalZ = pos.Z;
reply.Data.SimName = Utils.StringToBytes(info.RegionName); reply.Data.SimName = Utils.StringToBytes(info.RegionName);
reply.Data.SnapshotID = land.SnapshotID; reply.Data.SnapshotID = land.SnapshotID;
reply.Data.Dwell = dwell; reply.Data.Dwell = land.Dwell;
reply.Data.SalePrice = land.SalePrice; reply.Data.SalePrice = land.SalePrice;
reply.Data.AuctionID = (int)land.AuctionID; reply.Data.AuctionID = (int)land.AuctionID;

View File

@ -151,7 +151,11 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsIn.Land
x = rx - s.RegionInfo.WorldLocX; x = rx - s.RegionInfo.WorldLocX;
y = ry - s.RegionInfo.WorldLocY; y = ry - s.RegionInfo.WorldLocY;
regionAccess = s.RegionInfo.AccessLevel; regionAccess = s.RegionInfo.AccessLevel;
return s.GetLandData(x, y); LandData land = s.GetLandData(x, y);
IDwellModule dwellModule = s.RequestModuleInterface<IDwellModule>();
if (dwellModule != null)
land.Dwell = dwellModule.GetDwell(land);
return land;
} }
} }
m_log.DebugFormat("[LAND IN CONNECTOR]: region handle {0} not found", regionHandle); m_log.DebugFormat("[LAND IN CONNECTOR]: region handle {0} not found", regionHandle);

View File

@ -143,6 +143,10 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Land
{ {
LandData land = s.GetLandData(x, y); LandData land = s.GetLandData(x, y);
regionAccess = s.RegionInfo.AccessLevel; regionAccess = s.RegionInfo.AccessLevel;
IDwellModule dwellModule = s.RequestModuleInterface<IDwellModule>();
if (dwellModule != null)
land.Dwell = dwellModule.GetDwell(land);
return land; return land;
} }
} }

View File

@ -53,7 +53,7 @@ using GridRegion = OpenSim.Services.Interfaces.GridRegion;
namespace OpenSim.Region.CoreModules.World.Land namespace OpenSim.Region.CoreModules.World.Land
{ {
[Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "DefaultDwellModule")] [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "DefaultDwellModule")]
public class DefaultDwellModule : IDwellModule, INonSharedRegionModule public class DefaultDwellModule : INonSharedRegionModule, IDwellModule
{ {
private Scene m_scene; private Scene m_scene;
private IConfigSource m_Config; private IConfigSource m_Config;
@ -88,16 +88,21 @@ namespace OpenSim.Region.CoreModules.World.Land
return; return;
m_scene = scene; m_scene = scene;
m_scene.RegisterModuleInterface<IDwellModule>(this);
m_scene.EventManager.OnNewClient += OnNewClient;
} }
public void RegionLoaded(Scene scene) public void RegionLoaded(Scene scene)
{ {
if (!m_Enabled)
return;
m_scene.EventManager.OnNewClient += OnNewClient;
} }
public void RemoveRegion(Scene scene) public void RemoveRegion(Scene scene)
{ {
if (!m_Enabled)
return;
m_scene.EventManager.OnNewClient -= OnNewClient;
} }
public void Close() public void Close()
@ -115,12 +120,26 @@ namespace OpenSim.Region.CoreModules.World.Land
if (parcel == null) if (parcel == null)
return; return;
client.SendParcelDwellReply(localID, parcel.LandData.GlobalID, parcel.LandData.Dwell); LandData land = parcel.LandData;
if(land!= null)
client.SendParcelDwellReply(localID, land.GlobalID, land.Dwell);
} }
public int GetDwell(UUID parcelID) public int GetDwell(UUID parcelID)
{ {
ILandObject parcel = m_scene.LandChannel.GetLandObject(parcelID);
if (parcel != null && parcel.LandData != null)
return (int)(parcel.LandData.Dwell);
return 0; return 0;
} }
public int GetDwell(LandData land)
{
if (land != null)
return (int)(land.Dwell);
return 0;
}
} }
} }

View File

@ -106,6 +106,15 @@ namespace OpenSim.Region.CoreModules.World.Land
return null; return null;
} }
public ILandObject GetLandObject(UUID GlobalID)
{
if (m_landManagementModule != null)
{
return m_landManagementModule.GetLandObject(GlobalID);
}
return null;
}
public ILandObject GetLandObject(Vector3 position) public ILandObject GetLandObject(Vector3 position)
{ {
return GetLandObject(position.X, position.Y); return GetLandObject(position.X, position.Y);

View File

@ -92,6 +92,7 @@ namespace OpenSim.Region.CoreModules.World.Land
//ubit: removed the readonly so i can move it around //ubit: removed the readonly so i can move it around
private Dictionary<int, ILandObject> m_landList = new Dictionary<int, ILandObject>(); private Dictionary<int, ILandObject> m_landList = new Dictionary<int, ILandObject>();
private Dictionary<UUID, int> m_landUUIDList = new Dictionary<UUID, int>();
private int m_lastLandLocalID = LandChannel.START_LAND_LOCAL_ID - 1; private int m_lastLandLocalID = LandChannel.START_LAND_LOCAL_ID - 1;
@ -249,7 +250,10 @@ namespace OpenSim.Region.CoreModules.World.Land
lock (m_landList) lock (m_landList)
{ {
if (m_landList.TryGetValue(local_id, out land)) if (m_landList.TryGetValue(local_id, out land))
{
land.LandData = newData; land.LandData = newData;
m_landUUIDList[newData.GlobalID] = local_id;
}
} }
if (land != null) if (land != null)
@ -270,7 +274,11 @@ namespace OpenSim.Region.CoreModules.World.Land
//Remove all the land objects in the sim and add a blank, full sim land object set to public //Remove all the land objects in the sim and add a blank, full sim land object set to public
lock (m_landList) lock (m_landList)
{ {
foreach(ILandObject parcel in m_landList.Values)
parcel.Clear();
m_landList.Clear(); m_landList.Clear();
m_landUUIDList.Clear();
m_lastLandLocalID = LandChannel.START_LAND_LOCAL_ID - 1; m_lastLandLocalID = LandChannel.START_LAND_LOCAL_ID - 1;
m_landIDList = new int[m_scene.RegionInfo.RegionSizeX / LandUnit, m_scene.RegionInfo.RegionSizeY / LandUnit]; m_landIDList = new int[m_scene.RegionInfo.RegionSizeX / LandUnit, m_scene.RegionInfo.RegionSizeY / LandUnit];
@ -588,10 +596,8 @@ namespace OpenSim.Region.CoreModules.World.Land
/// The land object being added. /// The land object being added.
/// Will return null if this overlaps with an existing parcel that has not had its bitmap adjusted. /// Will return null if this overlaps with an existing parcel that has not had its bitmap adjusted.
/// </param> /// </param>
public ILandObject AddLandObject(ILandObject land) public ILandObject AddLandObject(ILandObject new_land)
{ {
ILandObject new_land = land.Copy();
// Only now can we add the prim counts to the land object - we rely on the global ID which is generated // Only now can we add the prim counts to the land object - we rely on the global ID which is generated
// as a random UUID inside LandData initialization // as a random UUID inside LandData initialization
if (m_primCountModule != null) if (m_primCountModule != null)
@ -656,6 +662,7 @@ namespace OpenSim.Region.CoreModules.World.Land
} }
m_landList.Add(newLandLocalID, new_land); m_landList.Add(newLandLocalID, new_land);
m_landUUIDList[new_land.LandData.GlobalID] = newLandLocalID;
m_lastLandLocalID++; m_lastLandLocalID++;
} }
@ -690,6 +697,9 @@ namespace OpenSim.Region.CoreModules.World.Land
land = m_landList[local_id]; land = m_landList[local_id];
m_landList.Remove(local_id); m_landList.Remove(local_id);
if(land.LandData != null)
m_landUUIDList.Remove(land.LandData.GlobalID);
land.Clear();
} }
m_scene.EventManager.TriggerLandObjectRemoved(land.LandData.GlobalID); m_scene.EventManager.TriggerLandObjectRemoved(land.LandData.GlobalID);
@ -740,11 +750,29 @@ namespace OpenSim.Region.CoreModules.World.Land
} }
} }
} }
master.LandData.Dwell += slave.LandData.Dwell;
removeLandObject(slave.LandData.LocalID); removeLandObject(slave.LandData.LocalID);
UpdateLandObject(master.LandData.LocalID, master.LandData); UpdateLandObject(master.LandData.LocalID, master.LandData);
} }
public ILandObject GetLandObject(UUID globalID)
{
lock (m_landList)
{
int lid = -1;
if(m_landUUIDList.TryGetValue(globalID, out lid) && lid >= 0)
{
if (m_landList.ContainsKey(lid))
{
return m_landList[lid];
}
else
m_landUUIDList.Remove(globalID); // auto heal
}
}
return null;
}
public ILandObject GetLandObject(int parcelLocalID) public ILandObject GetLandObject(int parcelLocalID)
{ {
lock (m_landList) lock (m_landList)
@ -1351,7 +1379,7 @@ namespace OpenSim.Region.CoreModules.World.Land
public void ClientOnParcelObjectOwnerRequest(int local_id, IClientAPI remote_client) public void ClientOnParcelObjectOwnerRequest(int local_id, IClientAPI remote_client)
{ {
ILandObject land; ILandObject land = null;
lock (m_landList) lock (m_landList)
{ {
m_landList.TryGetValue(local_id, out land); m_landList.TryGetValue(local_id, out land);
@ -1360,7 +1388,7 @@ namespace OpenSim.Region.CoreModules.World.Land
if (land != null) if (land != null)
{ {
m_scene.EventManager.TriggerParcelPrimCountUpdate(); m_scene.EventManager.TriggerParcelPrimCountUpdate();
m_landList[local_id].SendLandObjectOwners(remote_client); land.SendLandObjectOwners(remote_client);
} }
else else
{ {
@ -1370,7 +1398,7 @@ namespace OpenSim.Region.CoreModules.World.Land
public void ClientOnParcelGodForceOwner(int local_id, UUID ownerID, IClientAPI remote_client) public void ClientOnParcelGodForceOwner(int local_id, UUID ownerID, IClientAPI remote_client)
{ {
ILandObject land; ILandObject land = null;
lock (m_landList) lock (m_landList)
{ {
m_landList.TryGetValue(local_id, out land); m_landList.TryGetValue(local_id, out land);
@ -1393,7 +1421,7 @@ namespace OpenSim.Region.CoreModules.World.Land
public void ClientOnParcelAbandonRequest(int local_id, IClientAPI remote_client) public void ClientOnParcelAbandonRequest(int local_id, IClientAPI remote_client)
{ {
ILandObject land; ILandObject land = null;
lock (m_landList) lock (m_landList)
{ {
m_landList.TryGetValue(local_id, out land); m_landList.TryGetValue(local_id, out land);
@ -1417,7 +1445,7 @@ namespace OpenSim.Region.CoreModules.World.Land
public void ClientOnParcelReclaim(int local_id, IClientAPI remote_client) public void ClientOnParcelReclaim(int local_id, IClientAPI remote_client)
{ {
ILandObject land; ILandObject land = null;
lock (m_landList) lock (m_landList)
{ {
m_landList.TryGetValue(local_id, out land); m_landList.TryGetValue(local_id, out land);
@ -1503,17 +1531,16 @@ namespace OpenSim.Region.CoreModules.World.Land
void ClientOnParcelDeedToGroup(int parcelLocalID, UUID groupID, IClientAPI remote_client) void ClientOnParcelDeedToGroup(int parcelLocalID, UUID groupID, IClientAPI remote_client)
{ {
ILandObject land; ILandObject land = null;
lock (m_landList) lock (m_landList)
{ {
m_landList.TryGetValue(parcelLocalID, out land); m_landList.TryGetValue(parcelLocalID, out land);
} }
if (!m_scene.Permissions.CanDeedParcel(remote_client.AgentId, land))
return;
if (land != null) if (land != null)
{ {
if (!m_scene.Permissions.CanDeedParcel(remote_client.AgentId, land))
return;
land.DeedToGroup(groupID); land.DeedToGroup(groupID);
} }
} }
@ -1587,8 +1614,7 @@ namespace OpenSim.Region.CoreModules.World.Land
private void IncomingLandObjectFromStorage(LandData data) private void IncomingLandObjectFromStorage(LandData data)
{ {
ILandObject new_land = new LandObject(data.OwnerID, data.IsGroupOwned, m_scene); ILandObject new_land = new LandObject(data.OwnerID, data.IsGroupOwned, m_scene, data);
new_land.LandData = data.Copy();
new_land.SetLandBitmapFromByteArray(); new_land.SetLandBitmapFromByteArray();
AddLandObject(new_land); AddLandObject(new_land);
@ -1763,7 +1789,7 @@ namespace OpenSim.Region.CoreModules.World.Land
land_update.GroupAVSounds = true; land_update.GroupAVSounds = true;
} }
ILandObject land; ILandObject land = null;
lock (m_landList) lock (m_landList)
{ {
m_landList.TryGetValue(parcelID, out land); m_landList.TryGetValue(parcelID, out land);
@ -1926,6 +1952,9 @@ namespace OpenSim.Region.CoreModules.World.Land
if (data.RegionHandle == m_scene.RegionInfo.RegionHandle) if (data.RegionHandle == m_scene.RegionInfo.RegionHandle)
{ {
info = new GridRegion(m_scene.RegionInfo); info = new GridRegion(m_scene.RegionInfo);
IDwellModule dwellModule = m_scene.RequestModuleInterface<IDwellModule>();
if (dwellModule != null)
data.LandData.Dwell = dwellModule.GetDwell(data.LandData);
} }
else else
{ {
@ -1951,7 +1980,7 @@ namespace OpenSim.Region.CoreModules.World.Land
public void setParcelOtherCleanTime(IClientAPI remoteClient, int localID, int otherCleanTime) public void setParcelOtherCleanTime(IClientAPI remoteClient, int localID, int otherCleanTime)
{ {
ILandObject land; ILandObject land = null;
lock (m_landList) lock (m_landList)
{ {
m_landList.TryGetValue(localID, out land); m_landList.TryGetValue(localID, out land);
@ -2248,7 +2277,7 @@ namespace OpenSim.Region.CoreModules.World.Land
if (!ConsoleUtil.TryParseConsoleInt(MainConsole.Instance, args[2], out landLocalId)) if (!ConsoleUtil.TryParseConsoleInt(MainConsole.Instance, args[2], out landLocalId))
return; return;
ILandObject lo; ILandObject lo = null;
lock (m_landList) lock (m_landList)
{ {

View File

@ -58,6 +58,7 @@ namespace OpenSim.Region.CoreModules.World.Land
protected ExpiringCache<UUID, bool> m_groupMemberCache = new ExpiringCache<UUID, bool>(); protected ExpiringCache<UUID, bool> m_groupMemberCache = new ExpiringCache<UUID, bool>();
protected TimeSpan m_groupMemberCacheTimeout = TimeSpan.FromSeconds(30); // cache invalidation after 30 seconds protected TimeSpan m_groupMemberCacheTimeout = TimeSpan.FromSeconds(30); // cache invalidation after 30 seconds
IDwellModule m_dwellModule;
private bool[,] m_landBitmap; private bool[,] m_landBitmap;
public bool[,] LandBitmap public bool[,] LandBitmap
@ -268,27 +269,48 @@ namespace OpenSim.Region.CoreModules.World.Land
{ {
LandData = landData.Copy(); LandData = landData.Copy();
m_scene = scene; m_scene = scene;
m_scene.EventManager.OnFrame += OnFrame;
m_dwellModule = m_scene.RequestModuleInterface<IDwellModule>();
} }
public LandObject(UUID owner_id, bool is_group_owned, Scene scene) public LandObject(UUID owner_id, bool is_group_owned, Scene scene, LandData data = null)
{ {
m_scene = scene; m_scene = scene;
if (m_scene == null) if (m_scene == null)
LandBitmap = new bool[Constants.RegionSize / landUnit, Constants.RegionSize / landUnit]; LandBitmap = new bool[Constants.RegionSize / landUnit, Constants.RegionSize / landUnit];
else else
{
LandBitmap = new bool[m_scene.RegionInfo.RegionSizeX / landUnit, m_scene.RegionInfo.RegionSizeY / landUnit]; LandBitmap = new bool[m_scene.RegionInfo.RegionSizeX / landUnit, m_scene.RegionInfo.RegionSizeY / landUnit];
m_dwellModule = m_scene.RequestModuleInterface<IDwellModule>();
}
if(data == null)
LandData = new LandData(); LandData = new LandData();
else
LandData = data;
LandData.OwnerID = owner_id; LandData.OwnerID = owner_id;
if (is_group_owned) if (is_group_owned)
LandData.GroupID = owner_id; LandData.GroupID = owner_id;
else else
LandData.GroupID = UUID.Zero; LandData.GroupID = UUID.Zero;
LandData.IsGroupOwned = is_group_owned; LandData.IsGroupOwned = is_group_owned;
if(m_dwellModule == null)
LandData.Dwell = 0;
m_scene.EventManager.OnFrame += OnFrame; m_scene.EventManager.OnFrame += OnFrame;
} }
public void Clear()
{
if(m_scene != null)
m_scene.EventManager.OnFrame -= OnFrame;
LandData = null;
}
#endregion #endregion
#region Member Functions #region Member Functions
@ -1812,6 +1834,37 @@ namespace OpenSim.Region.CoreModules.World.Land
ExpireAccessList(); ExpireAccessList();
m_expiryCounter = 0; m_expiryCounter = 0;
} }
// need to update dwell here bc landdata has no parent info
if(LandData != null && m_dwellModule != null)
{
double now = Util.GetTimeStampMS();
double elapsed = now - LandData.LastDwellTimeMS;
if(elapsed > 150000) //2.5 minutes resolution / throttle
{
float dwell = LandData.Dwell;
double cur = dwell * 60000.0;
double decay = 1.5e-8 * cur * elapsed;
cur -= decay;
if(cur < 0)
cur = 0;
UUID lgid = LandData.GlobalID;
m_scene.ForEachRootScenePresence(delegate(ScenePresence sp)
{
if(sp.IsNPC || sp.IsLoggingIn || sp.IsDeleted || sp.currentParcelUUID != lgid)
return;
cur += (now - sp.ParcelDwellTickMS);
sp.ParcelDwellTickMS = now;
});
float newdwell = (float)(cur * 1.666666666667e-5);
LandData.Dwell = newdwell;
if(Math.Abs(newdwell - dwell) >= 0.9)
m_scene.EventManager.TriggerLandObjectAdded(this);
}
}
} }
private void ExpireAccessList() private void ExpireAccessList()

View File

@ -33,5 +33,6 @@ namespace OpenSim.Region.Framework.Interfaces
public interface IDwellModule public interface IDwellModule
{ {
int GetDwell(UUID parcelID); int GetDwell(UUID parcelID);
int GetDwell(LandData land);
} }
} }

View File

@ -170,6 +170,7 @@ namespace OpenSim.Region.Framework.Scenes
private bool m_previusParcelHide = false; private bool m_previusParcelHide = false;
private bool m_currentParcelHide = false; private bool m_currentParcelHide = false;
private object parcelLock = new Object(); private object parcelLock = new Object();
public double ParcelDwellTickMS;
public UUID currentParcelUUID public UUID currentParcelUUID
{ {
@ -182,6 +183,7 @@ namespace OpenSim.Region.Framework.Scenes
bool checksame = true; bool checksame = true;
if (value != m_currentParcelUUID) if (value != m_currentParcelUUID)
{ {
ParcelDwellTickMS = Util.GetTimeStampMS();
m_previusParcelHide = m_currentParcelHide; m_previusParcelHide = m_currentParcelHide;
m_previusParcelUUID = m_currentParcelUUID; m_previusParcelUUID = m_currentParcelUUID;
checksame = false; checksame = false;
@ -2141,6 +2143,7 @@ namespace OpenSim.Region.Framework.Scenes
m_previusParcelUUID = UUID.Zero; m_previusParcelUUID = UUID.Zero;
m_currentParcelHide = false; m_currentParcelHide = false;
m_currentParcelUUID = UUID.Zero; m_currentParcelUUID = UUID.Zero;
ParcelDwellTickMS = Util.GetTimeStampMS();
if(!IsNPC) if(!IsNPC)
{ {

View File

@ -160,7 +160,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
ts.arc = arc; ts.arc = arc;
ts.host = host; ts.host = host;
ts.next = DateTime.Now.ToUniversalTime().AddSeconds(ts.interval); ts.next = DateTime.UtcNow.AddSeconds(ts.interval);
AddSenseRepeater(ts); AddSenseRepeater(ts);
} }
@ -196,14 +196,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
public void CheckSenseRepeaterEvents() public void CheckSenseRepeaterEvents()
{ {
// Go through all timers // Go through all timers
foreach (SensorInfo ts in SenseRepeaters)
List<SensorInfo> curSensors;
lock(SenseRepeatListLock)
curSensors = SenseRepeaters;
DateTime now = DateTime.UtcNow;
foreach (SensorInfo ts in curSensors)
{ {
// Time has passed? // Time has passed?
if (ts.next.ToUniversalTime() < DateTime.Now.ToUniversalTime()) if (ts.next < now)
{ {
SensorSweep(ts); SensorSweep(ts);
// set next interval // set next interval
ts.next = DateTime.Now.ToUniversalTime().AddSeconds(ts.interval); ts.next = now.AddSeconds(ts.interval);
} }
} }
} }

View File

@ -85,6 +85,7 @@ namespace OpenSim.Server.Handlers.Land
hash["SnapshotID"] = landData.SnapshotID.ToString(); hash["SnapshotID"] = landData.SnapshotID.ToString();
hash["UserLocation"] = landData.UserLocation.ToString(); hash["UserLocation"] = landData.UserLocation.ToString();
hash["RegionAccess"] = regionAccess.ToString(); hash["RegionAccess"] = regionAccess.ToString();
hash["Dwell"] = landData.Dwell.ToString();
} }
XmlRpcResponse response = new XmlRpcResponse(); XmlRpcResponse response = new XmlRpcResponse();

View File

@ -76,8 +76,8 @@ namespace OpenSim.Server
public static int Main(string[] args) public static int Main(string[] args)
{ {
// Make sure we don't get outbound connections queueing ServicePointManager.DefaultConnectionLimit = 64;
ServicePointManager.DefaultConnectionLimit = 50; ServicePointManager.Expect100Continue = false;
ServicePointManager.UseNagleAlgorithm = false; ServicePointManager.UseNagleAlgorithm = false;
ServicePointManager.ServerCertificateValidationCallback = ValidateServerCertificate; ServicePointManager.ServerCertificateValidationCallback = ValidateServerCertificate;

View File

@ -117,6 +117,8 @@ namespace OpenSim.Services.Connectors
landData.UserLocation = Vector3.Parse((string)hash["UserLocation"]); landData.UserLocation = Vector3.Parse((string)hash["UserLocation"]);
if (hash["RegionAccess"] != null) if (hash["RegionAccess"] != null)
regionAccess = (byte)Convert.ToInt32((string)hash["RegionAccess"]); regionAccess = (byte)Convert.ToInt32((string)hash["RegionAccess"]);
if(hash["Dwell"] != null)
landData.Dwell = Convert.ToSingle((string)hash["Dwell"]);
m_log.DebugFormat("[LAND CONNECTOR]: Got land data for parcel {0}", landData.Name); m_log.DebugFormat("[LAND CONNECTOR]: Got land data for parcel {0}", landData.Name);
} }
catch (Exception e) catch (Exception e)

View File

@ -376,7 +376,8 @@ namespace OpenSim.Services.HypergridService
return false; return false;
} }
if(account.PrincipalID == new UUID("6571e388-6218-4574-87db-f9379718315e")) UUID agentID = aCircuit.AgentID;
if(agentID == new UUID("6571e388-6218-4574-87db-f9379718315e"))
{ {
// really? // really?
reason = "Invalid account ID"; reason = "Invalid account ID";
@ -385,21 +386,21 @@ namespace OpenSim.Services.HypergridService
if(m_GridUserService != null) if(m_GridUserService != null)
{ {
string PrincipalIDstr = account.PrincipalID.ToString(); string PrincipalIDstr = agentID.ToString();
GridUserInfo guinfo = m_GridUserService.GetGridUserInfo(PrincipalIDstr); GridUserInfo guinfo = m_GridUserService.GetGridUserInfo(PrincipalIDstr);
if(!m_allowDuplicatePresences) if(!m_allowDuplicatePresences)
{ {
if(guinfo != null && guinfo.Online && guinfo.LastRegionID != UUID.Zero) if(guinfo != null && guinfo.Online && guinfo.LastRegionID != UUID.Zero)
{ {
if(SendAgentGodKillToRegion(UUID.Zero, account.PrincipalID, guinfo)) if(SendAgentGodKillToRegion(UUID.Zero, agentID, guinfo))
{ {
m_log.InfoFormat( m_log.InfoFormat(
"[GATEKEEPER SERVICE]: Login failed for {0} {1}, reason: already logged in", "[GATEKEEPER SERVICE]: Login failed for {0} {1}, reason: already logged in",
account.FirstName, account.LastName); account.FirstName, account.LastName);
reason = "You appear to be already logged in on destiny grid " + reason = "You appear to be already logged in on the destination grid " +
"Please wait a a minute or two and retry. " + "Please wait a a minute or two and retry. " +
"If this takes longer than a few minutes please contact the grid owner. "; "If this takes longer than a few minutes please contact the grid owner.";
return false; return false;
} }
} }

View File

@ -96,6 +96,11 @@ namespace OpenSim.Tests.Common
return GetNoLand(); return GetNoLand();
} }
public ILandObject GetLandObject(UUID ID)
{
return GetNoLand();
}
public ILandObject GetLandObject(float x, float y) public ILandObject GetLandObject(float x, float y)
{ {
return GetNoLand(); return GetNoLand();

View File

@ -8,6 +8,7 @@
</runtime> </runtime>
<appSettings> <appSettings>
</appSettings> </appSettings>
<log4net> <log4net>
<appender name="Console" type="OpenSim.Framework.Console.OpenSimAppender, OpenSim.Framework.Console"> <appender name="Console" type="OpenSim.Framework.Console.OpenSimAppender, OpenSim.Framework.Console">
<filter type="log4net.Filter.LoggerMatchFilter"> <filter type="log4net.Filter.LoggerMatchFilter">

View File

@ -8,6 +8,7 @@
</runtime> </runtime>
<appSettings> <appSettings>
</appSettings> </appSettings>
<log4net> <log4net>
<appender name="Console" type="OpenSim.Framework.Console.OpenSimAppender, OpenSim.Framework.Console"> <appender name="Console" type="OpenSim.Framework.Console.OpenSimAppender, OpenSim.Framework.Console">
<filter type="log4net.Filter.LoggerMatchFilter"> <filter type="log4net.Filter.LoggerMatchFilter">

View File

@ -497,7 +497,6 @@
<Reference name="OpenSim.Framework.Monitoring"/> <Reference name="OpenSim.Framework.Monitoring"/>
<Reference name="OpenSim.Framework.Servers"/> <Reference name="OpenSim.Framework.Servers"/>
<Reference name="OpenSim.Framework.Servers.HttpServer"/> <Reference name="OpenSim.Framework.Servers.HttpServer"/>
<Reference name="Mono.Posix" path="../../../bin/"/>
<Reference name="Nini" path="../../../bin/"/> <Reference name="Nini" path="../../../bin/"/>
<Reference name="log4net" path="../../../bin/"/> <Reference name="log4net" path="../../../bin/"/>
@ -1792,7 +1791,6 @@
<Reference name="System.Core"/> <Reference name="System.Core"/>
<Reference name="System.Xml"/> <Reference name="System.Xml"/>
<Reference name="Mono.Addins" path="../../../bin/"/> <Reference name="Mono.Addins" path="../../../bin/"/>
<Reference name="Mono.Posix" path="../../../bin/"/>
<Reference name="NDesk.Options" path="../../../bin/"/> <Reference name="NDesk.Options" path="../../../bin/"/>
<Reference name="OpenMetaverseTypes" path="../../../bin/"/> <Reference name="OpenMetaverseTypes" path="../../../bin/"/>
<Reference name="OpenMetaverse.StructuredData" path="../../../bin/"/> <Reference name="OpenMetaverse.StructuredData" path="../../../bin/"/>