Merge branch 'ubitwork' of ssh://3dhosting.de/var/git/careminster into ubitwork
commit
c93b2db9f2
|
@ -927,6 +927,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
packetInbox.EnqueueHigh(new IncomingPacket((LLClientView)client, packet));
|
packetInbox.EnqueueHigh(new IncomingPacket((LLClientView)client, packet));
|
||||||
else
|
else
|
||||||
packetInbox.EnqueueLow(new IncomingPacket((LLClientView)client, packet));
|
packetInbox.EnqueueLow(new IncomingPacket((LLClientView)client, packet));
|
||||||
|
// packetInbox.Enqueue(new IncomingPacket((LLClientView)client, packet));
|
||||||
}
|
}
|
||||||
|
|
||||||
#region BinaryStats
|
#region BinaryStats
|
||||||
|
|
|
@ -86,7 +86,10 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
/// <value>
|
/// <value>
|
||||||
/// Land objects keyed by local id
|
/// Land objects keyed by local id
|
||||||
/// </value>
|
/// </value>
|
||||||
private readonly Dictionary<int, ILandObject> m_landList = new Dictionary<int, ILandObject>();
|
// private readonly Dictionary<int, ILandObject> m_landList = new Dictionary<int, ILandObject>();
|
||||||
|
|
||||||
|
//ubit: removed the readonly so i can move it around
|
||||||
|
private Dictionary<int, ILandObject> m_landList = new Dictionary<int, ILandObject>();
|
||||||
|
|
||||||
private int m_lastLandLocalID = LandChannel.START_LAND_LOCAL_ID - 1;
|
private int m_lastLandLocalID = LandChannel.START_LAND_LOCAL_ID - 1;
|
||||||
|
|
||||||
|
@ -242,15 +245,19 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
{
|
{
|
||||||
LandData newData = data.Copy();
|
LandData newData = data.Copy();
|
||||||
newData.LocalID = local_id;
|
newData.LocalID = local_id;
|
||||||
|
ILandObject landobj = null;
|
||||||
|
|
||||||
lock (m_landList)
|
lock (m_landList)
|
||||||
{
|
{
|
||||||
if (m_landList.ContainsKey(local_id))
|
if (m_landList.ContainsKey(local_id))
|
||||||
{
|
{
|
||||||
m_landList[local_id].LandData = newData;
|
m_landList[local_id].LandData = newData;
|
||||||
m_scene.EventManager.TriggerLandObjectUpdated((uint)local_id, m_landList[local_id]);
|
landobj = m_landList[local_id];
|
||||||
|
// m_scene.EventManager.TriggerLandObjectUpdated((uint)local_id, m_landList[local_id]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if(landobj != null)
|
||||||
|
m_scene.EventManager.TriggerLandObjectUpdated((uint)local_id, landobj);
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool AllowedForcefulBans
|
public bool AllowedForcefulBans
|
||||||
|
@ -617,21 +624,28 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public void Clear(bool setupDefaultParcel)
|
public void Clear(bool setupDefaultParcel)
|
||||||
{
|
{
|
||||||
|
Dictionary<int, ILandObject> landworkList;
|
||||||
|
// move to work pointer since we are deleting it all
|
||||||
lock (m_landList)
|
lock (m_landList)
|
||||||
{
|
{
|
||||||
foreach (ILandObject lo in m_landList.Values)
|
landworkList = m_landList;
|
||||||
{
|
m_landList = new Dictionary<int, ILandObject>();
|
||||||
//m_scene.SimulationDataService.RemoveLandObject(lo.LandData.GlobalID);
|
|
||||||
m_scene.EventManager.TriggerLandObjectRemoved(lo.LandData.GlobalID);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
m_landList.Clear();
|
// this 2 methods have locks (now)
|
||||||
|
|
||||||
ResetSimLandObjects();
|
ResetSimLandObjects();
|
||||||
|
|
||||||
if (setupDefaultParcel)
|
if (setupDefaultParcel)
|
||||||
CreateDefaultParcel();
|
CreateDefaultParcel();
|
||||||
|
|
||||||
|
// fire outside events unlocked
|
||||||
|
foreach (ILandObject lo in landworkList.Values)
|
||||||
|
{
|
||||||
|
//m_scene.SimulationDataService.RemoveLandObject(lo.LandData.GlobalID);
|
||||||
|
m_scene.EventManager.TriggerLandObjectRemoved(lo.LandData.GlobalID);
|
||||||
}
|
}
|
||||||
|
landworkList.Clear();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void performFinalLandJoin(ILandObject master, ILandObject slave)
|
private void performFinalLandJoin(ILandObject master, ILandObject slave)
|
||||||
|
@ -1324,22 +1338,32 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
|
|
||||||
public void EventManagerOnIncomingLandDataFromStorage(List<LandData> data)
|
public void EventManagerOnIncomingLandDataFromStorage(List<LandData> data)
|
||||||
{
|
{
|
||||||
|
Dictionary<int, ILandObject> landworkList;
|
||||||
|
// move to work pointer since we are deleting it all
|
||||||
lock (m_landList)
|
lock (m_landList)
|
||||||
{
|
{
|
||||||
//Remove all the land objects in the sim and then process our new data
|
landworkList = m_landList;
|
||||||
foreach (int n in m_landList.Keys)
|
m_landList = new Dictionary<int, ILandObject>();
|
||||||
{
|
|
||||||
m_scene.EventManager.TriggerLandObjectRemoved(m_landList[n].LandData.GlobalID);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Remove all the land objects in the sim and then process our new data
|
||||||
|
foreach (int n in landworkList.Keys)
|
||||||
|
{
|
||||||
|
m_scene.EventManager.TriggerLandObjectRemoved(landworkList[n].LandData.GlobalID);
|
||||||
|
}
|
||||||
|
landworkList.Clear();
|
||||||
|
|
||||||
|
lock (m_landList)
|
||||||
|
{
|
||||||
m_landIDList.Initialize();
|
m_landIDList.Initialize();
|
||||||
m_landList.Clear();
|
m_landList.Clear();
|
||||||
|
}
|
||||||
|
|
||||||
for (int i = 0; i < data.Count; i++)
|
for (int i = 0; i < data.Count; i++)
|
||||||
{
|
{
|
||||||
IncomingLandObjectFromStorage(data[i]);
|
IncomingLandObjectFromStorage(data[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
public void IncomingLandObjectFromStorage(LandData data)
|
public void IncomingLandObjectFromStorage(LandData data)
|
||||||
{
|
{
|
||||||
|
@ -1366,7 +1390,8 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
|
|
||||||
public void EventManagerOnNoLandDataFromStorage()
|
public void EventManagerOnNoLandDataFromStorage()
|
||||||
{
|
{
|
||||||
lock (m_landList)
|
// called methods already have locks
|
||||||
|
// lock (m_landList)
|
||||||
{
|
{
|
||||||
ResetSimLandObjects();
|
ResetSimLandObjects();
|
||||||
CreateDefaultParcel();
|
CreateDefaultParcel();
|
||||||
|
|
|
@ -422,6 +422,20 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private class DescendentsRequestData
|
||||||
|
{
|
||||||
|
public IClientAPI RemoteClient;
|
||||||
|
public UUID FolderID;
|
||||||
|
public UUID OwnerID;
|
||||||
|
public bool FetchFolders;
|
||||||
|
public bool FetchItems;
|
||||||
|
public int SortOrder;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Queue<DescendentsRequestData> m_descendentsRequestQueue = new Queue<DescendentsRequestData>();
|
||||||
|
private Object m_descendentsRequestLock = new Object();
|
||||||
|
private bool m_descendentsRequestProcessing = false;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Tell the client about the various child items and folders contained in the requested folder.
|
/// Tell the client about the various child items and folders contained in the requested folder.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -458,17 +472,38 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
lock (m_descendentsRequestLock)
|
||||||
|
{
|
||||||
|
if (!m_descendentsRequestProcessing)
|
||||||
|
{
|
||||||
|
m_descendentsRequestProcessing = true;
|
||||||
|
|
||||||
// We're going to send the reply async, because there may be
|
// We're going to send the reply async, because there may be
|
||||||
// an enormous quantity of packets -- basically the entire inventory!
|
// an enormous quantity of packets -- basically the entire inventory!
|
||||||
// We don't want to block the client thread while all that is happening.
|
// We don't want to block the client thread while all that is happening.
|
||||||
SendInventoryDelegate d = SendInventoryAsync;
|
SendInventoryDelegate d = SendInventoryAsync;
|
||||||
d.BeginInvoke(remoteClient, folderID, ownerID, fetchFolders, fetchItems, sortOrder, SendInventoryComplete, d);
|
d.BeginInvoke(remoteClient, folderID, ownerID, fetchFolders, fetchItems, sortOrder, SendInventoryComplete, d);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
DescendentsRequestData req = new DescendentsRequestData();
|
||||||
|
req.RemoteClient = remoteClient;
|
||||||
|
req.FolderID = folderID;
|
||||||
|
req.OwnerID = ownerID;
|
||||||
|
req.FetchFolders = fetchFolders;
|
||||||
|
req.FetchItems = fetchItems;
|
||||||
|
req.SortOrder = sortOrder;
|
||||||
|
|
||||||
|
m_descendentsRequestQueue.Enqueue(req);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
delegate void SendInventoryDelegate(IClientAPI remoteClient, UUID folderID, UUID ownerID, bool fetchFolders, bool fetchItems, int sortOrder);
|
delegate void SendInventoryDelegate(IClientAPI remoteClient, UUID folderID, UUID ownerID, bool fetchFolders, bool fetchItems, int sortOrder);
|
||||||
|
|
||||||
void SendInventoryAsync(IClientAPI remoteClient, UUID folderID, UUID ownerID, bool fetchFolders, bool fetchItems, int sortOrder)
|
void SendInventoryAsync(IClientAPI remoteClient, UUID folderID, UUID ownerID, bool fetchFolders, bool fetchItems, int sortOrder)
|
||||||
{
|
{
|
||||||
|
Thread.Sleep(20);
|
||||||
SendInventoryUpdate(remoteClient, new InventoryFolderBase(folderID), fetchFolders, fetchItems);
|
SendInventoryUpdate(remoteClient, new InventoryFolderBase(folderID), fetchFolders, fetchItems);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -476,6 +511,21 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
{
|
{
|
||||||
SendInventoryDelegate d = (SendInventoryDelegate)iar.AsyncState;
|
SendInventoryDelegate d = (SendInventoryDelegate)iar.AsyncState;
|
||||||
d.EndInvoke(iar);
|
d.EndInvoke(iar);
|
||||||
|
|
||||||
|
lock (m_descendentsRequestLock)
|
||||||
|
{
|
||||||
|
if (m_descendentsRequestQueue.Count > 0)
|
||||||
|
{
|
||||||
|
DescendentsRequestData req = m_descendentsRequestQueue.Dequeue();
|
||||||
|
|
||||||
|
d = SendInventoryAsync;
|
||||||
|
d.BeginInvoke(req.RemoteClient, req.FolderID, req.OwnerID, req.FetchFolders, req.FetchItems, req.SortOrder, SendInventoryComplete, d);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_descendentsRequestProcessing = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
|
@ -5475,7 +5475,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
// for completion and should LSL_Key ever be implemented
|
// for completion and should LSL_Key ever be implemented
|
||||||
// as it's own struct
|
// as it's own struct
|
||||||
else if (!(src.Data[index] is LSL_String ||
|
else if (!(src.Data[index] is LSL_String ||
|
||||||
src.Data[index] is LSL_Key))
|
src.Data[index] is LSL_Key ||
|
||||||
|
src.Data[index] is String))
|
||||||
{
|
{
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
@ -12818,7 +12819,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
public void llCollisionSprite(string impact_sprite)
|
public void llCollisionSprite(string impact_sprite)
|
||||||
{
|
{
|
||||||
m_host.AddScriptLPS(1);
|
m_host.AddScriptLPS(1);
|
||||||
NotImplemented("llCollisionSprite");
|
// Viewer 2.0 broke this and it's likely LL has no intention
|
||||||
|
// of fixing it. Therefore, letting this be a NOP seems appropriate.
|
||||||
}
|
}
|
||||||
|
|
||||||
public void llGodLikeRezObject(string inventory, LSL_Vector pos)
|
public void llGodLikeRezObject(string inventory, LSL_Vector pos)
|
||||||
|
|
Loading…
Reference in New Issue