diff --git a/OpenSim/Data/MySQL/MySQLXInventoryData.cs b/OpenSim/Data/MySQL/MySQLXInventoryData.cs
index 0fe801d696..3c73095fc3 100644
--- a/OpenSim/Data/MySQL/MySQLXInventoryData.cs
+++ b/OpenSim/Data/MySQL/MySQLXInventoryData.cs
@@ -64,14 +64,22 @@ namespace OpenSim.Data.MySQL
public bool StoreFolder(XInventoryFolder folder)
{
+ if (folder.folderName.Length > 64)
+ folder.folderName = folder.folderName.Substring(0, 64);
+
return m_Folders.Store(folder);
}
public bool StoreItem(XInventoryItem item)
{
+ if (item.inventoryName.Length > 64)
+ item.inventoryName = item.inventoryName.Substring(0, 64);
+ if (item.inventoryDescription.Length > 128)
+ item.inventoryDescription = item.inventoryDescription.Substring(0, 128);
+
return m_Items.Store(item);
}
-
+
public bool DeleteFolders(string field, string val)
{
return m_Folders.Delete(field, val);
diff --git a/OpenSim/Data/SQLite/SQLiteXInventoryData.cs b/OpenSim/Data/SQLite/SQLiteXInventoryData.cs
index 6064538990..ca651e1998 100644
--- a/OpenSim/Data/SQLite/SQLiteXInventoryData.cs
+++ b/OpenSim/Data/SQLite/SQLiteXInventoryData.cs
@@ -66,11 +66,19 @@ namespace OpenSim.Data.SQLite
public bool StoreFolder(XInventoryFolder folder)
{
+ if (folder.folderName.Length > 64)
+ folder.folderName = folder.folderName.Substring(0, 64);
+
return m_Folders.Store(folder);
}
public bool StoreItem(XInventoryItem item)
{
+ if (item.inventoryName.Length > 64)
+ item.inventoryName = item.inventoryName.Substring(0, 64);
+ if (item.inventoryDescription.Length > 128)
+ item.inventoryDescription = item.inventoryDescription.Substring(0, 128);
+
return m_Items.Store(item);
}
diff --git a/OpenSim/Framework/RegionInfo.cs b/OpenSim/Framework/RegionInfo.cs
index ad988165eb..afc4060044 100644
--- a/OpenSim/Framework/RegionInfo.cs
+++ b/OpenSim/Framework/RegionInfo.cs
@@ -29,14 +29,15 @@ using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
+using System.Reflection;
using System.Xml;
using System.IO;
+using log4net;
using Nini.Config;
using OpenMetaverse;
using OpenMetaverse.StructuredData;
using OpenSim.Framework.Console;
-
namespace OpenSim.Framework
{
public class RegionLightShareData : ICloneable
@@ -96,10 +97,9 @@ namespace OpenSim.Framework
[Serializable]
public class SimpleRegionInfo
- {
- // private static readonly log4net.ILog m_log
- // = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
-
+ {
+// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
+
///
/// The port by which http communication occurs with the region (most noticeably, CAPS communication)
///
@@ -327,8 +327,7 @@ namespace OpenSim.Framework
public class RegionInfo
{
- // private static readonly log4net.ILog m_log
- // = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
+ private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
public bool commFailTF = false;
public ConfigurationMember configMember;
@@ -772,9 +771,16 @@ namespace OpenSim.Framework
}
if (externalName == "SYSTEMIP")
+ {
m_externalHostName = Util.GetLocalHost().ToString();
+ m_log.InfoFormat(
+ "[REGIONINFO]: Resolving SYSTEMIP to {0} for external hostname of region {1}",
+ m_externalHostName, name);
+ }
else
+ {
m_externalHostName = externalName;
+ }
m_regionType = config.GetString("RegionType", String.Empty);
diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs
index a09b903bfc..501d47f6d1 100644
--- a/OpenSim/Region/Application/OpenSim.cs
+++ b/OpenSim/Region/Application/OpenSim.cs
@@ -192,9 +192,7 @@ namespace OpenSim
// Hook up to the watchdog timer
Watchdog.OnWatchdogTimeout += WatchdogTimeoutHandler;
- PrintFileToConsole("startuplogo.txt");
-
- m_log.InfoFormat("[NETWORK]: Using {0} as SYSTEMIP", Util.GetLocalHost().ToString());
+ PrintFileToConsole("startuplogo.txt");
// For now, start at the 'root' level by default
if (m_sceneManager.Scenes.Count == 1) // If there is only one region, select it
diff --git a/OpenSim/Region/Application/OpenSimBase.cs b/OpenSim/Region/Application/OpenSimBase.cs
index 83be61ee63..f535fe805a 100644
--- a/OpenSim/Region/Application/OpenSimBase.cs
+++ b/OpenSim/Region/Application/OpenSimBase.cs
@@ -367,13 +367,13 @@ namespace OpenSim
Environment.Exit(1);
}
+ scene.loadAllLandObjectsFromStorage(regionInfo.originRegionID);
+ scene.EventManager.TriggerParcelPrimCountUpdate();
+
// We need to do this after we've initialized the
// scripting engines.
scene.CreateScriptInstances();
- scene.loadAllLandObjectsFromStorage(regionInfo.originRegionID);
- scene.EventManager.TriggerParcelPrimCountUpdate();
-
m_sceneManager.Add(scene);
if (m_autoCreateClientStack)
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
index cdd22def16..d2824bd8c7 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
@@ -6303,8 +6303,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
if (handlerObjectDuplicate != null)
{
handlerObjectDuplicate(dupe.ObjectData[i].ObjectLocalID, dupe.SharedData.Offset,
- dupe.SharedData.DuplicateFlags, AgentandGroupData.AgentID,
- AgentandGroupData.GroupID);
+ dupe.SharedData.DuplicateFlags, AgentId,
+ m_activeGroupID);
}
}
@@ -6894,7 +6894,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
if (handlerObjectDuplicateOnRay != null)
{
handlerObjectDuplicateOnRay(dupeOnRay.ObjectData[i].ObjectLocalID, dupeOnRay.AgentData.DuplicateFlags,
- dupeOnRay.AgentData.AgentID, dupeOnRay.AgentData.GroupID, dupeOnRay.AgentData.RayTargetID, dupeOnRay.AgentData.RayEnd,
+ AgentId, m_activeGroupID, dupeOnRay.AgentData.RayTargetID, dupeOnRay.AgentData.RayEnd,
dupeOnRay.AgentData.RayStart, dupeOnRay.AgentData.BypassRaycast, dupeOnRay.AgentData.RayEndIsIntersection,
dupeOnRay.AgentData.CopyCenters, dupeOnRay.AgentData.CopyRotates);
}
diff --git a/OpenSim/Region/CoreModules/Avatar/Assets/GetTextureModule.cs b/OpenSim/Region/CoreModules/Avatar/Assets/GetTextureModule.cs
index f8e3d595c9..75efb799c1 100644
--- a/OpenSim/Region/CoreModules/Avatar/Assets/GetTextureModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Assets/GetTextureModule.cs
@@ -131,6 +131,12 @@ namespace OpenSim.Region.CoreModules.Avatar.ObjectCaps
if (texture != null)
{
+ if (texture.Type != (sbyte)AssetType.Texture)
+ {
+ httpResponse.StatusCode = (int)System.Net.HttpStatusCode.NotFound;
+ httpResponse.Send();
+ return null;
+ }
SendTexture(httpRequest, httpResponse, texture);
}
else
@@ -147,6 +153,12 @@ namespace OpenSim.Region.CoreModules.Avatar.ObjectCaps
if (texture != null)
{
+ if (texture.Type != (sbyte)AssetType.Texture)
+ {
+ httpResponse.StatusCode = (int)System.Net.HttpStatusCode.NotFound;
+ httpResponse.Send();
+ return null;
+ }
SendTexture(httpRequest, httpResponse, texture);
}
else
diff --git a/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs b/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs
index 5552be7648..6f044cb8f1 100644
--- a/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs
@@ -768,8 +768,15 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
bool canEditObjectsChanged = ((rights ^ userFlags) & (int)FriendRights.CanModifyObjects) != 0;
if (canEditObjectsChanged)
friendClient.SendChangeUserRights(userID, friendID, rights);
+
}
+ // update local cache
+ //m_Friends[friendID].Friends = m_FriendsService.GetFriends(friendID);
+ foreach (FriendInfo finfo in m_Friends[friendID].Friends)
+ if (finfo.Friend == userID.ToString())
+ finfo.TheirFlags = rights;
+
return true;
}
diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs
index 2ab46aa33f..58c396cc2a 100644
--- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs
@@ -131,7 +131,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
return ret;
}
- public virtual UUID DeleteToInventory(DeRezAction action, UUID folderID,
+ public override UUID DeleteToInventory(DeRezAction action, UUID folderID,
SceneObjectGroup objectGroup, IClientAPI remoteClient)
{
UUID assetID = base.DeleteToInventory(action, folderID, new List() {objectGroup}, remoteClient);
diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
index 3035d889e7..12b6aa0ba3 100644
--- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
@@ -286,23 +286,15 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
{
// Deleting someone else's item
//
-
-
if (remoteClient == null ||
objectGroup.OwnerID != remoteClient.AgentId)
{
- // Folder skeleton may not be loaded and we
- // have to wait for the inventory to find
- // the destination folder
- //
+
folder = m_Scene.InventoryService.GetFolderForType(userID, AssetType.LostAndFoundFolder);
}
else
{
- // Assume inventory skeleton was loaded during login
- // and all folders can be found
- //
- folder = m_Scene.InventoryService.GetFolderForType(userID, AssetType.TrashFolder);
+ folder = m_Scene.InventoryService.GetFolderForType(userID, AssetType.TrashFolder);
}
}
else if (action == DeRezAction.Return)
@@ -332,7 +324,6 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
if (folder == null) // None of the above
{
- //folder = userInfo.RootFolder.FindFolder(folderID);
folder = new InventoryFolderBase(folderID);
if (folder == null) // Nowhere to put it
diff --git a/OpenSim/Region/CoreModules/Scripting/EMailModules/EmailModule.cs b/OpenSim/Region/CoreModules/Scripting/EMailModules/EmailModule.cs
index 83f004dc60..c0975eaaa0 100644
--- a/OpenSim/Region/CoreModules/Scripting/EMailModules/EmailModule.cs
+++ b/OpenSim/Region/CoreModules/Scripting/EMailModules/EmailModule.cs
@@ -40,7 +40,7 @@ using OpenSim.Region.Framework.Scenes;
namespace OpenSim.Region.CoreModules.Scripting.EmailModules
{
- public class EmailModule : IEmailModule
+ public class EmailModule : IRegionModule, IEmailModule
{
//
// Log
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsIn/Inventory/InventoryServiceInConnectorModule.cs b/OpenSim/Region/CoreModules/ServiceConnectorsIn/Inventory/InventoryServiceInConnectorModule.cs
index ae03cdf9f6..209cf0d3c2 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsIn/Inventory/InventoryServiceInConnectorModule.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsIn/Inventory/InventoryServiceInConnectorModule.cs
@@ -96,7 +96,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsIn.Inventory
Object[] args = new Object[] { m_Config, MainServer.Instance, "HGInventoryService" };
- ServerUtils.LoadPlugin("OpenSim.Server.Handlers.dll:HGInventoryServiceInConnector", args);
+ ServerUtils.LoadPlugin("OpenSim.Server.Handlers.dll:XInventoryInConnector", args);
}
}
diff --git a/OpenSim/Region/Framework/Interfaces/IEmailModule.cs b/OpenSim/Region/Framework/Interfaces/IEmailModule.cs
index 3a2c4231cf..4f1b91adee 100644
--- a/OpenSim/Region/Framework/Interfaces/IEmailModule.cs
+++ b/OpenSim/Region/Framework/Interfaces/IEmailModule.cs
@@ -38,7 +38,7 @@ namespace OpenSim.Region.Framework.Interfaces
public int numLeft;
}
- public interface IEmailModule : IRegionModule
+ public interface IEmailModule
{
void SendEmail(UUID objectID, string address, string subject, string body);
Email GetNextEmail(UUID objectID, string sender, string subject);
diff --git a/OpenSim/Region/Framework/Scenes/Prioritizer.cs b/OpenSim/Region/Framework/Scenes/Prioritizer.cs
index 7b7677bd6b..de3c360a42 100644
--- a/OpenSim/Region/Framework/Scenes/Prioritizer.cs
+++ b/OpenSim/Region/Framework/Scenes/Prioritizer.cs
@@ -52,6 +52,9 @@ namespace OpenSim.Region.Framework.Scenes
public double GetUpdatePriority(IClientAPI client, ISceneEntity entity)
{
double priority = 0;
+
+ if (entity == null)
+ return 100000;
switch (m_scene.UpdatePrioritizationScheme)
{
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index 64bdc99bb8..9278164808 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -385,9 +385,9 @@ namespace OpenSim.Region.Framework.Scenes
if (Permissions.PropagatePermissions() && recipient != senderId)
{
// First, make sore base is limited to the next perms
- itemCopy.BasePermissions = item.BasePermissions & item.NextPermissions;
+ itemCopy.BasePermissions = item.BasePermissions & (item.NextPermissions | (uint)PermissionMask.Move);
// By default, current equals base
- itemCopy.CurrentPermissions = itemCopy.BasePermissions;
+ itemCopy.CurrentPermissions = itemCopy.BasePermissions & item.CurrentPermissions;
// If this is an object, replace current perms
// with folded perms
@@ -398,7 +398,7 @@ namespace OpenSim.Region.Framework.Scenes
}
// Ensure there is no escalation
- itemCopy.CurrentPermissions &= item.NextPermissions;
+ itemCopy.CurrentPermissions &= (item.NextPermissions | (uint)PermissionMask.Move);
// Need slam bit on xfer
itemCopy.CurrentPermissions |= 8;
@@ -897,14 +897,15 @@ namespace OpenSim.Region.Framework.Scenes
if ((part.OwnerID != destAgent) && Permissions.PropagatePermissions())
{
- agentItem.BasePermissions = taskItem.BasePermissions & taskItem.NextPermissions;
+ agentItem.BasePermissions = taskItem.BasePermissions & (taskItem.NextPermissions | (uint)PermissionMask.Move);
if (taskItem.InvType == (int)InventoryType.Object)
- agentItem.CurrentPermissions = agentItem.BasePermissions & ((taskItem.CurrentPermissions & 7) << 13);
- agentItem.CurrentPermissions = agentItem.BasePermissions ;
+ agentItem.CurrentPermissions = agentItem.BasePermissions & (((taskItem.CurrentPermissions & 7) << 13) | (taskItem.CurrentPermissions & (uint)PermissionMask.Move));
+ else
+ agentItem.CurrentPermissions = agentItem.BasePermissions & taskItem.CurrentPermissions;
agentItem.CurrentPermissions |= 8;
agentItem.NextPermissions = taskItem.NextPermissions;
- agentItem.EveryOnePermissions = taskItem.EveryonePermissions & taskItem.NextPermissions;
+ agentItem.EveryOnePermissions = taskItem.EveryonePermissions & (taskItem.NextPermissions | (uint)PermissionMask.Move);
agentItem.GroupPermissions = taskItem.GroupPermissions & taskItem.NextPermissions;
}
else
@@ -1086,13 +1087,13 @@ namespace OpenSim.Region.Framework.Scenes
if (Permissions.PropagatePermissions())
{
destTaskItem.CurrentPermissions = srcTaskItem.CurrentPermissions &
- srcTaskItem.NextPermissions;
+ (srcTaskItem.NextPermissions | (uint)PermissionMask.Move);
destTaskItem.GroupPermissions = srcTaskItem.GroupPermissions &
- srcTaskItem.NextPermissions;
+ (srcTaskItem.NextPermissions | (uint)PermissionMask.Move);
destTaskItem.EveryonePermissions = srcTaskItem.EveryonePermissions &
- srcTaskItem.NextPermissions;
+ (srcTaskItem.NextPermissions | (uint)PermissionMask.Move);
destTaskItem.BasePermissions = srcTaskItem.BasePermissions &
- srcTaskItem.NextPermissions;
+ (srcTaskItem.NextPermissions | (uint)PermissionMask.Move);
destTaskItem.CurrentPermissions |= 8; // Slam!
}
}
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
index 240c688ff6..40332a6f93 100644
--- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
@@ -1747,9 +1747,31 @@ namespace OpenSim.Region.Framework.Scenes
{
if (m_parentScene.Permissions.CanDuplicateObject(original.Children.Count, original.UUID, AgentID, original.AbsolutePosition))
{
- SceneObjectGroup copy = original.Copy(AgentID, GroupID, true);
+ SceneObjectGroup copy = original.Copy(true);
copy.AbsolutePosition = copy.AbsolutePosition + offset;
+ if (original.OwnerID != AgentID)
+ {
+ copy.SetOwnerId(AgentID);
+ copy.SetRootPartOwner(copy.RootPart, AgentID, GroupID);
+
+ List partList =
+ new List(copy.Children.Values);
+
+ if (m_parentScene.Permissions.PropagatePermissions())
+ {
+ foreach (SceneObjectPart child in partList)
+ {
+ child.Inventory.ChangeInventoryOwner(AgentID);
+ child.TriggerScriptChangedEvent(Changed.OWNER);
+ child.ApplyNextOwnerPermissions();
+ }
+ }
+
+ copy.RootPart.ObjectSaleType = 0;
+ copy.RootPart.SalePrice = 10;
+ }
+
Entities.Add(copy);
// Since we copy from a source group that is in selected
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index e23f39ffbc..1ca390a7c1 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -1472,7 +1472,7 @@ namespace OpenSim.Region.Framework.Scenes
"[SCENE]: Storing {0}, {1} in {2}",
Name, UUID, m_scene.RegionInfo.RegionName);
- SceneObjectGroup backup_group = Copy(OwnerID, GroupID, false);
+ SceneObjectGroup backup_group = Copy(false);
backup_group.RootPart.Velocity = RootPart.Velocity;
backup_group.RootPart.Acceleration = RootPart.Acceleration;
backup_group.RootPart.AngularVelocity = RootPart.AngularVelocity;
@@ -1528,7 +1528,7 @@ namespace OpenSim.Region.Framework.Scenes
/// Duplicates this object, including operations such as physics set up and attaching to the backup event.
///
///
- public SceneObjectGroup Copy(UUID cAgentID, UUID cGroupID, bool userExposed)
+ public SceneObjectGroup Copy(bool userExposed)
{
SceneObjectGroup dupe = (SceneObjectGroup)MemberwiseClone();
dupe.m_isBackedUp = false;
@@ -1551,7 +1551,9 @@ namespace OpenSim.Region.Framework.Scenes
dupe.AbsolutePosition = new Vector3(AbsolutePosition.X, AbsolutePosition.Y, AbsolutePosition.Z);
if (!userExposed)
+ {
dupe.RootPart.IsAttachment = previousAttachmentStatus;
+ }
dupe.CopyRootPart(m_rootPart, OwnerID, GroupID, userExposed);
dupe.m_rootPart.LinkNum = m_rootPart.LinkNum;
@@ -1576,16 +1578,6 @@ namespace OpenSim.Region.Framework.Scenes
dupe.RootPart.DoPhysicsPropertyUpdate(dupe.RootPart.PhysActor.IsPhysical, true);
}
- // Now we've made a copy that replaces this one, we need to
- // switch the owner to the person who did the copying
- // Second Life copies an object and duplicates the first one in it's place
- // So, we have to make a copy of this one, set it in it's place then set the owner on this one
- if (userExposed)
- {
- SetRootPartOwner(m_rootPart, cAgentID, cGroupID);
- m_rootPart.ScheduleFullUpdate();
- }
-
List partList;
lock (m_parts)
@@ -1606,12 +1598,6 @@ namespace OpenSim.Region.Framework.Scenes
SceneObjectPart newPart = dupe.CopyPart(part, OwnerID, GroupID, userExposed);
newPart.LinkNum = part.LinkNum;
-
- if (userExposed)
- {
- SetPartOwner(newPart, cAgentID, cGroupID);
- newPart.ScheduleFullUpdate();
- }
}
}
@@ -3595,7 +3581,7 @@ namespace OpenSim.Region.Framework.Scenes
public virtual ISceneObject CloneForNewScene()
{
- SceneObjectGroup sog = Copy(this.OwnerID, this.GroupID, false);
+ SceneObjectGroup sog = Copy(false);
sog.m_isDeleted = false;
return sog;
}
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
index 866bb6e70e..3a8f168e74 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
@@ -31,6 +31,7 @@ using System.IO;
using System.Collections.Generic;
using System.Collections;
using System.Reflection;
+using System.Threading;
using OpenMetaverse;
using log4net;
using OpenSim.Framework;
@@ -200,6 +201,7 @@ namespace OpenSim.Region.Framework.Scenes
if ((int)InventoryType.LSL == item.InvType)
{
CreateScriptInstance(item, startParam, postOnRez, engine, stateSource);
+ Thread.Sleep(10); // workaround for Mono cpu utilization > 100% bug
}
}
}
@@ -257,7 +259,7 @@ namespace OpenSim.Region.Framework.Scenes
// m_log.InfoFormat(
// "[PRIM INVENTORY]: " +
// "Starting script {0}, {1} in prim {2}, {3}",
- // item.Name, item.ItemID, Name, UUID);
+ // item.Name, item.ItemID, m_part.Name, m_part.UUID);
if (!m_part.ParentGroup.Scene.Permissions.CanRunScript(item.ItemID, m_part.UUID, item.OwnerID))
return;
@@ -293,20 +295,20 @@ namespace OpenSim.Region.Framework.Scenes
}
else
{
- if (m_part.ParentGroup.m_savedScriptState != null)
- RestoreSavedScriptState(item.OldItemID, item.ItemID);
-
lock (m_items)
{
+ if (m_part.ParentGroup.m_savedScriptState != null)
+ RestoreSavedScriptState(item.OldItemID, item.ItemID);
+
m_items[item.ItemID].PermsMask = 0;
m_items[item.ItemID].PermsGranter = UUID.Zero;
+
+ string script = Utils.BytesToString(asset.Data);
+ m_part.ParentGroup.Scene.EventManager.TriggerRezScript(
+ m_part.LocalId, item.ItemID, script, startParam, postOnRez, engine, stateSource);
+ m_part.ParentGroup.AddActiveScriptCount(1);
+ m_part.ScheduleFullUpdate();
}
-
- string script = Utils.BytesToString(asset.Data);
- m_part.ParentGroup.Scene.EventManager.TriggerRezScript(
- m_part.LocalId, item.ItemID, script, startParam, postOnRez, engine, stateSource);
- m_part.ParentGroup.AddActiveScriptCount(1);
- m_part.ScheduleFullUpdate();
}
}
}
diff --git a/OpenSim/Region/OptionalModules/ContentManagementSystem/ContentManagementEntity.cs b/OpenSim/Region/OptionalModules/ContentManagementSystem/ContentManagementEntity.cs
index c277034171..ada67011b3 100644
--- a/OpenSim/Region/OptionalModules/ContentManagementSystem/ContentManagementEntity.cs
+++ b/OpenSim/Region/OptionalModules/ContentManagementSystem/ContentManagementEntity.cs
@@ -73,7 +73,7 @@ namespace OpenSim.Region.OptionalModules.ContentManagement
public ContentManagementEntity(SceneObjectGroup Unchanged, bool physics)
: base(Unchanged, false)
{
- m_UnchangedEntity = Unchanged.Copy(Unchanged.RootPart.OwnerID, Unchanged.RootPart.GroupID, false);
+ m_UnchangedEntity = Unchanged.Copy(false);
}
public ContentManagementEntity(string objectXML, Scene scene, bool physics)
diff --git a/OpenSim/Region/OptionalModules/ContentManagementSystem/MetaEntity.cs b/OpenSim/Region/OptionalModules/ContentManagementSystem/MetaEntity.cs
index 1a72971b56..841ee00e59 100644
--- a/OpenSim/Region/OptionalModules/ContentManagementSystem/MetaEntity.cs
+++ b/OpenSim/Region/OptionalModules/ContentManagementSystem/MetaEntity.cs
@@ -80,7 +80,7 @@ namespace OpenSim.Region.OptionalModules.ContentManagement
///
public MetaEntity(SceneObjectGroup orig, bool physics)
{
- m_Entity = orig.Copy(orig.RootPart.OwnerID, orig.RootPart.GroupID, false);
+ m_Entity = orig.Copy(false);
Initialize(physics);
}
diff --git a/OpenSim/Region/Physics/OdePlugin/ODEDynamics.cs b/OpenSim/Region/Physics/OdePlugin/ODEDynamics.cs
index 9beeabba0a..2342bfa141 100644
--- a/OpenSim/Region/Physics/OdePlugin/ODEDynamics.cs
+++ b/OpenSim/Region/Physics/OdePlugin/ODEDynamics.cs
@@ -675,7 +675,7 @@ namespace OpenSim.Region.Physics.OdePlugin
m_dir.Z = vel_now.Z; // Preserve the accumulated falling velocity
d.Vector3 pos = d.BodyGetPosition(Body);
- Vector3 accel = new Vector3(-(m_dir.X - m_lastLinearVelocityVector.X / 0.1f), -(m_dir.Y - m_lastLinearVelocityVector.Y / 0.1f), m_dir.Z - m_lastLinearVelocityVector.Z / 0.1f);
+// Vector3 accel = new Vector3(-(m_dir.X - m_lastLinearVelocityVector.X / 0.1f), -(m_dir.Y - m_lastLinearVelocityVector.Y / 0.1f), m_dir.Z - m_lastLinearVelocityVector.Z / 0.1f);
Vector3 posChange = new Vector3();
posChange.X = pos.X - m_lastPositionVector.X;
posChange.Y = pos.Y - m_lastPositionVector.Y;
diff --git a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
index 0720b5ee53..3cf45019e7 100644
--- a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
+++ b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
@@ -1576,19 +1576,19 @@ Console.WriteLine(" JointCreateFixed");
//Console.WriteLine("Move " + m_primName);
if (!d.BodyIsEnabled (Body)) d.BodyEnable (Body); // KF add 161009
// NON-'VEHICLES' are dealt with here
- if (d.BodyIsEnabled(Body) && !m_angularlock.ApproxEquals(Vector3.Zero, 0.003f))
- {
- d.Vector3 avel2 = d.BodyGetAngularVel(Body);
- /*
- if (m_angularlock.X == 1)
- avel2.X = 0;
- if (m_angularlock.Y == 1)
- avel2.Y = 0;
- if (m_angularlock.Z == 1)
- avel2.Z = 0;
- d.BodySetAngularVel(Body, avel2.X, avel2.Y, avel2.Z);
- */
- }
+// if (d.BodyIsEnabled(Body) && !m_angularlock.ApproxEquals(Vector3.Zero, 0.003f))
+// {
+// d.Vector3 avel2 = d.BodyGetAngularVel(Body);
+// /*
+// if (m_angularlock.X == 1)
+// avel2.X = 0;
+// if (m_angularlock.Y == 1)
+// avel2.Y = 0;
+// if (m_angularlock.Z == 1)
+// avel2.Z = 0;
+// d.BodySetAngularVel(Body, avel2.X, avel2.Y, avel2.Z);
+// */
+// }
//float PID_P = 900.0f;
float m_mass = CalculateMass();
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index 59ab26bee5..712bd7d383 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -705,22 +705,75 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
{
//A and B should both be normalized
m_host.AddScriptLPS(1);
- double dotProduct = LSL_Vector.Dot(a, b);
- LSL_Vector crossProduct = LSL_Vector.Cross(a, b);
- double magProduct = LSL_Vector.Mag(a) * LSL_Vector.Mag(b);
- double angle = Math.Acos(dotProduct / magProduct);
- LSL_Vector axis = LSL_Vector.Norm(crossProduct);
- double s = Math.Sin(angle / 2);
-
- double x = axis.x * s;
- double y = axis.y * s;
- double z = axis.z * s;
- double w = Math.Cos(angle / 2);
-
- if (Double.IsNaN(x) || Double.IsNaN(y) || Double.IsNaN(z) || Double.IsNaN(w))
- return new LSL_Rotation(0.0f, 0.0f, 0.0f, 1.0f);
-
- return new LSL_Rotation((float)x, (float)y, (float)z, (float)w);
+ LSL_Rotation rotBetween;
+ // Check for zero vectors. If either is zero, return zero rotation. Otherwise,
+ // continue calculation.
+ if (a == new LSL_Vector(0.0f, 0.0f, 0.0f) || b == new LSL_Vector(0.0f, 0.0f, 0.0f))
+ {
+ rotBetween = new LSL_Rotation(0.0f, 0.0f, 0.0f, 1.0f);
+ }
+ else
+ {
+ a = LSL_Vector.Norm(a);
+ b = LSL_Vector.Norm(b);
+ double dotProduct = LSL_Vector.Dot(a, b);
+ // There are two degenerate cases possible. These are for vectors 180 or
+ // 0 degrees apart. These have to be detected and handled individually.
+ //
+ // Check for vectors 180 degrees apart.
+ // A dot product of -1 would mean the angle between vectors is 180 degrees.
+ if (dotProduct < -0.9999999f)
+ {
+ // First assume X axis is orthogonal to the vectors.
+ LSL_Vector orthoVector = new LSL_Vector(1.0f, 0.0f, 0.0f);
+ orthoVector = orthoVector - a * (a.x / LSL_Vector.Dot(a, a));
+ // Check for near zero vector. A very small non-zero number here will create
+ // a rotation in an undesired direction.
+ if (LSL_Vector.Mag(orthoVector) > 0.0001)
+ {
+ rotBetween = new LSL_Rotation(orthoVector.x, orthoVector.y, orthoVector.z, 0.0f);
+ }
+ // If the magnitude of the vector was near zero, then assume the X axis is not
+ // orthogonal and use the Z axis instead.
+ else
+ {
+ // Set 180 z rotation.
+ rotBetween = new LSL_Rotation(0.0f, 0.0f, 1.0f, 0.0f);
+ }
+ }
+ // Check for parallel vectors.
+ // A dot product of 1 would mean the angle between vectors is 0 degrees.
+ else if (dotProduct > 0.9999999f)
+ {
+ // Set zero rotation.
+ rotBetween = new LSL_Rotation(0.0f, 0.0f, 0.0f, 1.0f);
+ }
+ else
+ {
+ // All special checks have been performed so get the axis of rotation.
+ LSL_Vector crossProduct = LSL_Vector.Cross(a, b);
+ // Quarternion s value is the length of the unit vector + dot product.
+ double qs = 1.0 + dotProduct;
+ rotBetween = new LSL_Rotation(crossProduct.x, crossProduct.y, crossProduct.z, qs);
+ // Normalize the rotation.
+ double mag = LSL_Rotation.Mag(rotBetween);
+ // We shouldn't have to worry about a divide by zero here. The qs value will be
+ // non-zero because we already know if we're here, then the dotProduct is not -1 so
+ // qs will not be zero. Also, we've already handled the input vectors being zero so the
+ // crossProduct vector should also not be zero.
+ rotBetween.x = rotBetween.x / mag;
+ rotBetween.y = rotBetween.y / mag;
+ rotBetween.z = rotBetween.z / mag;
+ rotBetween.s = rotBetween.s / mag;
+ // Check for undefined values and set zero rotation if any found. This code might not actually be required
+ // any longer since zero vectors are checked for at the top.
+ if (Double.IsNaN(rotBetween.x) || Double.IsNaN(rotBetween.y) || Double.IsNaN(rotBetween.z) || Double.IsNaN(rotBetween.s))
+ {
+ rotBetween = new LSL_Rotation(0.0f, 0.0f, 0.0f, 1.0f);
+ }
+ }
+ }
+ return rotBetween;
}
public void llWhisper(int channelID, string text)
@@ -6520,6 +6573,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
if (cut.y - cut.x < 0.05f)
{
cut.x = cut.y - 0.05f;
+ if (cut.x < 0.0f)
+ {
+ cut.x = 0.0f;
+ cut.y = 0.05f;
+ }
}
shapeBlock.ProfileBegin = (ushort)(50000 * cut.x);
shapeBlock.ProfileEnd = (ushort)(50000 * (1 - cut.y));
@@ -6715,9 +6773,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
{
profilecut.y = 1f;
}
- if (profilecut.y - cut.x < 0.05f)
+ if (profilecut.y - profilecut.x < 0.05f)
{
- profilecut.x = cut.y - 0.05f;
+ profilecut.x = profilecut.y - 0.05f;
+ if (profilecut.x < 0.0f)
+ {
+ profilecut.x = 0.0f;
+ profilecut.y = 0.05f;
+ }
}
shapeBlock.ProfileBegin = (ushort)(50000 * profilecut.x);
shapeBlock.ProfileEnd = (ushort)(50000 * (1 - profilecut.y));
diff --git a/OpenSim/Server/Base/ServicesServerBase.cs b/OpenSim/Server/Base/ServicesServerBase.cs
index a5bebb859f..dee31bdf58 100644
--- a/OpenSim/Server/Base/ServicesServerBase.cs
+++ b/OpenSim/Server/Base/ServicesServerBase.cs
@@ -230,6 +230,12 @@ namespace OpenSim.Server.Base
"shutdown",
"Quit the application", HandleQuit);
+ // Register a command to read other commands from a file
+ MainConsole.Instance.Commands.AddCommand("base", false, "command-script",
+ "command-script