mirror of
https://github.com/opensim/opensim.git
synced 2026-08-08 18:25:33 +08:00
Merge branch 'careminster' into careminster-presence-refactor
This commit is contained in:
@@ -212,8 +212,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
{
|
||||
// Needs to determine which engine was running it and use that
|
||||
//
|
||||
part.Inventory.CreateScriptInstance(item.ItemID, 0, false, DefaultScriptEngine, 0);
|
||||
errors = part.Inventory.GetScriptErrors(item.ItemID);
|
||||
errors = part.Inventory.CreateScriptInstanceEr(item.ItemID, 0, false, DefaultScriptEngine, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -156,6 +156,20 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
|
||||
public IXfer XferManager;
|
||||
|
||||
protected ISnmpModule m_snmpService = null;
|
||||
public ISnmpModule SnmpService
|
||||
{
|
||||
get
|
||||
{
|
||||
if (m_snmpService == null)
|
||||
{
|
||||
m_snmpService = RequestModuleInterface<ISnmpModule>();
|
||||
}
|
||||
|
||||
return m_snmpService;
|
||||
}
|
||||
}
|
||||
|
||||
protected IAssetService m_AssetService;
|
||||
protected IAuthorizationService m_AuthorizationService;
|
||||
|
||||
@@ -1727,7 +1741,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
public void SaveTerrain()
|
||||
{
|
||||
m_storageManager.DataStore.StoreTerrain(Heightmap.GetDoubles(), RegionInfo.RegionID);
|
||||
}
|
||||
}
|
||||
|
||||
public void StoreWindlightProfile(RegionLightShareData wl)
|
||||
{
|
||||
|
||||
@@ -104,8 +104,12 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
/// since the group's last persistent backup
|
||||
/// </summary>
|
||||
private bool m_hasGroupChanged = false;
|
||||
private long timeFirstChanged;
|
||||
private long timeLastChanged;
|
||||
private long timeFirstChanged = 0;
|
||||
private long timeLastChanged = 0;
|
||||
private long m_maxPersistTime = 0;
|
||||
private long m_minPersistTime = 0;
|
||||
private Random m_rand;
|
||||
|
||||
private System.Threading.ReaderWriterLockSlim m_partsLock = new System.Threading.ReaderWriterLockSlim();
|
||||
|
||||
public void lockPartsForRead(bool locked)
|
||||
@@ -182,6 +186,32 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
timeLastChanged = DateTime.Now.Ticks;
|
||||
if (!m_hasGroupChanged)
|
||||
timeFirstChanged = DateTime.Now.Ticks;
|
||||
if (m_rootPart != null && m_rootPart.UUID != null && m_scene != null)
|
||||
{
|
||||
if (m_rand == null)
|
||||
{
|
||||
byte[] val = new byte[16];
|
||||
m_rootPart.UUID.ToBytes(val, 0);
|
||||
m_rand = new Random(BitConverter.ToInt32(val, 0));
|
||||
}
|
||||
|
||||
if (m_scene.GetRootAgentCount() == 0)
|
||||
{
|
||||
//If the region is empty, this change has been made by an automated process
|
||||
//and thus we delay the persist time by a random amount between 1.5 and 2.5.
|
||||
|
||||
float factor = 1.5f + (float)(m_rand.NextDouble());
|
||||
m_maxPersistTime = (long)((float)m_scene.m_persistAfter * factor);
|
||||
m_minPersistTime = (long)((float)m_scene.m_dontPersistBefore * factor);
|
||||
}
|
||||
else
|
||||
{
|
||||
//If the region is not empty, we want to obey the minimum and maximum persist times
|
||||
//but add a random factor so we stagger the object persistance a little
|
||||
m_maxPersistTime = (long)((float)m_scene.m_persistAfter * (1.0d - (m_rand.NextDouble() / 5.0d))); //Multiply by 1.0-1.5
|
||||
m_minPersistTime = (long)((float)m_scene.m_dontPersistBefore * (1.0d + (m_rand.NextDouble() / 2.0d))); //Multiply by 0.8-1.0
|
||||
}
|
||||
}
|
||||
}
|
||||
m_hasGroupChanged = value;
|
||||
}
|
||||
@@ -197,8 +227,19 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
return false;
|
||||
if (m_scene.ShuttingDown)
|
||||
return true;
|
||||
|
||||
if (m_minPersistTime == 0 || m_maxPersistTime == 0)
|
||||
{
|
||||
m_maxPersistTime = m_scene.m_persistAfter;
|
||||
m_minPersistTime = m_scene.m_dontPersistBefore;
|
||||
}
|
||||
|
||||
long currentTime = DateTime.Now.Ticks;
|
||||
if (currentTime - timeLastChanged > m_scene.m_dontPersistBefore || currentTime - timeFirstChanged > m_scene.m_persistAfter)
|
||||
|
||||
if (timeLastChanged == 0) timeLastChanged = currentTime;
|
||||
if (timeFirstChanged == 0) timeFirstChanged = currentTime;
|
||||
|
||||
if (currentTime - timeLastChanged > m_minPersistTime || currentTime - timeFirstChanged > m_maxPersistTime)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
@@ -530,6 +571,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
/// </summary>
|
||||
public SceneObjectGroup()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -546,7 +588,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
/// Constructor. This object is added to the scene later via AttachToScene()
|
||||
/// </summary>
|
||||
public SceneObjectGroup(UUID ownerID, Vector3 pos, Quaternion rot, PrimitiveBaseShape shape)
|
||||
{
|
||||
{
|
||||
SetRootPart(new SceneObjectPart(ownerID, shape, pos, rot, Vector3.Zero));
|
||||
}
|
||||
|
||||
|
||||
@@ -45,6 +45,8 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
|
||||
private string m_inventoryFileName = String.Empty;
|
||||
private int m_inventoryFileNameSerial = 0;
|
||||
|
||||
private Dictionary<UUID, ArrayList> m_scriptErrors = new Dictionary<UUID, ArrayList>();
|
||||
|
||||
/// <value>
|
||||
/// The part to which the inventory belongs.
|
||||
@@ -210,7 +212,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
}
|
||||
}
|
||||
|
||||
public ArrayList GetScriptErrors(UUID itemID)
|
||||
private ArrayList GetScriptErrors(UUID itemID)
|
||||
{
|
||||
ArrayList ret = new ArrayList();
|
||||
|
||||
@@ -269,7 +271,10 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
// item.Name, item.ItemID, Name, UUID);
|
||||
|
||||
if (!m_part.ParentGroup.Scene.Permissions.CanRunScript(item.ItemID, m_part.UUID, item.OwnerID))
|
||||
{
|
||||
StoreScriptError(item.ItemID, "no permission");
|
||||
return;
|
||||
}
|
||||
|
||||
m_part.AddFlag(PrimFlags.Scripted);
|
||||
|
||||
@@ -284,6 +289,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
m_items.LockItemsForWrite(false);
|
||||
m_part.ParentGroup.Scene.EventManager.TriggerRezScript(
|
||||
m_part.LocalId, item.ItemID, String.Empty, startParam, postOnRez, engine, stateSource);
|
||||
StoreScriptErrors(item.ItemID, GetScriptErrors(item.ItemID));
|
||||
m_part.ParentGroup.AddActiveScriptCount(1);
|
||||
m_part.ScheduleFullUpdate();
|
||||
return;
|
||||
@@ -293,11 +299,13 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
{
|
||||
if (null == asset)
|
||||
{
|
||||
string msg = String.Format("asset ID {0} could not be found", item.AssetID);
|
||||
StoreScriptError(item.ItemID, msg);
|
||||
m_log.ErrorFormat(
|
||||
"[PRIM INVENTORY]: " +
|
||||
"Couldn't start script {0}, {1} at {2} in {3} since asset ID {4} could not be found",
|
||||
"Couldn't start script {0}, {1} at {2} in {3} since {4}",
|
||||
item.Name, item.ItemID, m_part.AbsolutePosition,
|
||||
m_part.ParentGroup.Scene.RegionInfo.RegionName, item.AssetID);
|
||||
m_part.ParentGroup.Scene.RegionInfo.RegionName, msg);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -310,11 +318,16 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
string script = Utils.BytesToString(asset.Data);
|
||||
m_part.ParentGroup.Scene.EventManager.TriggerRezScript(
|
||||
m_part.LocalId, item.ItemID, script, startParam, postOnRez, engine, stateSource);
|
||||
StoreScriptErrors(item.ItemID, GetScriptErrors(item.ItemID));
|
||||
m_part.ParentGroup.AddActiveScriptCount(1);
|
||||
m_part.ScheduleFullUpdate();
|
||||
}
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
StoreScriptError(item.ItemID, "scripts disabled");
|
||||
}
|
||||
}
|
||||
|
||||
private void RestoreSavedScriptState(UUID oldID, UUID newID)
|
||||
@@ -391,24 +404,71 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
else
|
||||
{
|
||||
m_items.LockItemsForRead(false);
|
||||
string msg = String.Format("couldn't be found for prim {0}, {1} at {2} in {3}", m_part.Name, m_part.UUID,
|
||||
m_part.AbsolutePosition, m_part.ParentGroup.Scene.RegionInfo.RegionName);
|
||||
StoreScriptError(itemId, msg);
|
||||
m_log.ErrorFormat(
|
||||
"[PRIM INVENTORY]: " +
|
||||
"Couldn't start script with ID {0} since it couldn't be found for prim {1}, {2} at {3} in {4}",
|
||||
itemId, m_part.Name, m_part.UUID,
|
||||
m_part.AbsolutePosition, m_part.ParentGroup.Scene.RegionInfo.RegionName);
|
||||
"Couldn't start script with ID {0} since it {1}", itemId, msg);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
m_items.LockItemsForRead(false);
|
||||
string msg = String.Format("couldn't be found for prim {0}, {1}", m_part.Name, m_part.UUID);
|
||||
StoreScriptError(itemId, msg);
|
||||
m_log.ErrorFormat(
|
||||
"[PRIM INVENTORY]: " +
|
||||
"Couldn't start script with ID {0} since it couldn't be found for prim {1}, {2}",
|
||||
itemId, m_part.Name, m_part.UUID);
|
||||
"Couldn't start script with ID {0} since it {1}", itemId, msg);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public ArrayList CreateScriptInstanceEr(UUID itemId, int startParam, bool postOnRez, string engine, int stateSource)
|
||||
{
|
||||
ArrayList errors;
|
||||
|
||||
lock (m_scriptErrors)
|
||||
{
|
||||
m_scriptErrors.Remove(itemId);
|
||||
}
|
||||
CreateScriptInstance(itemId, startParam, postOnRez, engine, stateSource);
|
||||
lock (m_scriptErrors)
|
||||
{
|
||||
while (!m_scriptErrors.TryGetValue(itemId, out errors))
|
||||
{
|
||||
if (!System.Threading.Monitor.Wait(m_scriptErrors, 15000))
|
||||
{
|
||||
m_log.ErrorFormat(
|
||||
"[PRIM INVENTORY]: " +
|
||||
"timedout waiting for script {0} errors", itemId);
|
||||
if (!m_scriptErrors.TryGetValue(itemId, out errors))
|
||||
{
|
||||
errors = new ArrayList(1);
|
||||
errors.Add("timedout waiting for errors");
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
m_scriptErrors.Remove(itemId);
|
||||
}
|
||||
return errors;
|
||||
}
|
||||
private void StoreScriptErrors(UUID itemId, ArrayList errors)
|
||||
{
|
||||
lock (m_scriptErrors)
|
||||
{
|
||||
m_scriptErrors[itemId] = errors;
|
||||
System.Threading.Monitor.PulseAll(m_scriptErrors);
|
||||
}
|
||||
}
|
||||
private void StoreScriptError(UUID itemId, string message)
|
||||
{
|
||||
ArrayList errors = new ArrayList(1);
|
||||
errors.Add(message);
|
||||
StoreScriptErrors(itemId, errors);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Stop a script which is in this prim's inventory.
|
||||
/// </summary>
|
||||
|
||||
Reference in New Issue
Block a user