Merge branch 'master' of ssh://opensimulator.org/var/git/opensim
						commit
						1afae01311
					
				| 
						 | 
				
			
			@ -79,14 +79,7 @@ namespace OpenSim.Data.MySQL
 | 
			
		|||
                {
 | 
			
		||||
                    ret.PrincipalID = principalID;
 | 
			
		||||
 | 
			
		||||
                    if (m_ColumnNames == null)
 | 
			
		||||
                    {
 | 
			
		||||
                        m_ColumnNames = new List<string>();
 | 
			
		||||
 | 
			
		||||
                        DataTable schemaTable = result.GetSchemaTable();
 | 
			
		||||
                        foreach (DataRow row in schemaTable.Rows)
 | 
			
		||||
                            m_ColumnNames.Add(row["ColumnName"].ToString());
 | 
			
		||||
                    }
 | 
			
		||||
                    CheckColumnNames(result);
 | 
			
		||||
 | 
			
		||||
                    foreach (string s in m_ColumnNames)
 | 
			
		||||
                    {
 | 
			
		||||
| 
						 | 
				
			
			@ -105,6 +98,20 @@ namespace OpenSim.Data.MySQL
 | 
			
		|||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void CheckColumnNames(IDataReader result)
 | 
			
		||||
        {
 | 
			
		||||
            if (m_ColumnNames != null)
 | 
			
		||||
                return;
 | 
			
		||||
 | 
			
		||||
            List<string> columnNames = new List<string>();
 | 
			
		||||
 | 
			
		||||
            DataTable schemaTable = result.GetSchemaTable();
 | 
			
		||||
            foreach (DataRow row in schemaTable.Rows)
 | 
			
		||||
                columnNames.Add(row["ColumnName"].ToString());
 | 
			
		||||
 | 
			
		||||
            m_ColumnNames = columnNames;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public bool Store(AuthenticationData data)
 | 
			
		||||
        {
 | 
			
		||||
            if (data.Data.ContainsKey("UUID"))
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -91,15 +91,17 @@ namespace OpenSim.Data.MySQL
 | 
			
		|||
            if (m_ColumnNames != null)
 | 
			
		||||
                return;
 | 
			
		||||
 | 
			
		||||
            m_ColumnNames = new List<string>();
 | 
			
		||||
            List<string> columnNames = new List<string>();
 | 
			
		||||
 | 
			
		||||
            DataTable schemaTable = reader.GetSchemaTable();
 | 
			
		||||
            foreach (DataRow row in schemaTable.Rows)
 | 
			
		||||
            {
 | 
			
		||||
                if (row["ColumnName"] != null &&
 | 
			
		||||
                        (!m_Fields.ContainsKey(row["ColumnName"].ToString())))
 | 
			
		||||
                    m_ColumnNames.Add(row["ColumnName"].ToString());
 | 
			
		||||
                    columnNames.Add(row["ColumnName"].ToString());
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            m_ColumnNames = columnNames;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public virtual T[] Get(string field, string key)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -162,17 +162,7 @@ namespace OpenSim.Data.MySQL
 | 
			
		|||
                        ret.sizeX = Convert.ToInt32(result["sizeX"]);
 | 
			
		||||
                        ret.sizeY = Convert.ToInt32(result["sizeY"]);
 | 
			
		||||
 | 
			
		||||
                        if (m_ColumnNames == null)
 | 
			
		||||
                        {
 | 
			
		||||
                            m_ColumnNames = new List<string>();
 | 
			
		||||
 | 
			
		||||
                            DataTable schemaTable = result.GetSchemaTable();
 | 
			
		||||
                            foreach (DataRow row in schemaTable.Rows)
 | 
			
		||||
                            {
 | 
			
		||||
                                if (row["ColumnName"] != null)
 | 
			
		||||
                                    m_ColumnNames.Add(row["ColumnName"].ToString());
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
                        CheckColumnNames(result);
 | 
			
		||||
 | 
			
		||||
                        foreach (string s in m_ColumnNames)
 | 
			
		||||
                        {
 | 
			
		||||
| 
						 | 
				
			
			@ -187,7 +177,11 @@ namespace OpenSim.Data.MySQL
 | 
			
		|||
                            if (s == "locY")
 | 
			
		||||
                                continue;
 | 
			
		||||
 | 
			
		||||
                            ret.Data[s] = result[s].ToString();
 | 
			
		||||
                            object value = result[s];
 | 
			
		||||
                            if (value is DBNull)
 | 
			
		||||
                                ret.Data[s] = null;
 | 
			
		||||
                            else
 | 
			
		||||
                                ret.Data[s] = result[s].ToString();
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                        retList.Add(ret);
 | 
			
		||||
| 
						 | 
				
			
			@ -198,6 +192,23 @@ namespace OpenSim.Data.MySQL
 | 
			
		|||
            return retList;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void CheckColumnNames(IDataReader result)
 | 
			
		||||
        {
 | 
			
		||||
            if (m_ColumnNames != null)
 | 
			
		||||
                return;
 | 
			
		||||
 | 
			
		||||
            List<string> columnNames = new List<string>();
 | 
			
		||||
 | 
			
		||||
            DataTable schemaTable = result.GetSchemaTable();
 | 
			
		||||
            foreach (DataRow row in schemaTable.Rows)
 | 
			
		||||
            {
 | 
			
		||||
                if (row["ColumnName"] != null)
 | 
			
		||||
                    columnNames.Add(row["ColumnName"].ToString());
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            m_ColumnNames = columnNames;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public bool Store(RegionData data)
 | 
			
		||||
        {
 | 
			
		||||
            if (data.Data.ContainsKey("uuid"))
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -296,6 +296,10 @@ namespace OpenSim.Framework.Console
 | 
			
		|||
                            matches[0].Groups["Category"].Value);
 | 
			
		||||
                    System.Console.Write("]:");
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    outText = outText.Trim();
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (level == "error")
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -51,10 +51,12 @@ namespace OpenSim.Framework
 | 
			
		|||
        protected object m_senderObject;
 | 
			
		||||
        protected ChatTypeEnum m_type;
 | 
			
		||||
        protected UUID m_fromID;
 | 
			
		||||
        protected UUID m_toID;
 | 
			
		||||
 | 
			
		||||
        public OSChatMessage()
 | 
			
		||||
        {
 | 
			
		||||
            m_position = new Vector3();
 | 
			
		||||
            m_toID = UUID.Zero;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
| 
						 | 
				
			
			@ -102,6 +104,15 @@ namespace OpenSim.Framework
 | 
			
		|||
            set { m_from = value; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// The name of the sender (needed for scripts)
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public string To
 | 
			
		||||
        {
 | 
			
		||||
            get { return m_from; }
 | 
			
		||||
            set { m_from = value; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        #region IEventArgs Members
 | 
			
		||||
 | 
			
		||||
        /// TODO: Sender and SenderObject should just be Sender and of
 | 
			
		||||
| 
						 | 
				
			
			@ -131,6 +142,15 @@ namespace OpenSim.Framework
 | 
			
		|||
            set { m_fromID = value; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// The single recipient or all if not set.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public UUID TargetUUID
 | 
			
		||||
        {
 | 
			
		||||
            get { return m_toID; }
 | 
			
		||||
            set { m_toID = value; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        ///
 | 
			
		||||
        /// </summary>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -662,11 +662,11 @@ namespace OpenSim.Framework.Servers.HttpServer
 | 
			
		|||
            }
 | 
			
		||||
            catch (IOException e)
 | 
			
		||||
            {
 | 
			
		||||
                m_log.ErrorFormat("[BASE HTTP SERVER]: HandleRequest() threw {0}", e);
 | 
			
		||||
                m_log.ErrorFormat("[BASE HTTP SERVER]: HandleRequest() threw {0}{1}", e.Message, e.StackTrace);
 | 
			
		||||
            }
 | 
			
		||||
            catch (Exception e)
 | 
			
		||||
            {
 | 
			
		||||
                m_log.ErrorFormat("[BASE HTTP SERVER]: HandleRequest() threw {0}", e.StackTrace);
 | 
			
		||||
                m_log.ErrorFormat("[BASE HTTP SERVER]: HandleRequest() threw {0}{1}", e.Message, e.StackTrace);
 | 
			
		||||
                SendHTML500(response);
 | 
			
		||||
            }
 | 
			
		||||
            finally
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -143,7 +143,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
 | 
			
		|||
                }
 | 
			
		||||
                catch (Exception e)
 | 
			
		||||
                {
 | 
			
		||||
                    m_log.ErrorFormat("[ATTACHMENTS MODULE]: Unable to rez attachment: {0}{1}", e.Message, e.StackTrace);
 | 
			
		||||
                    UUID agentId = (sp.ControllingClient == null) ? (UUID)null : sp.ControllingClient.AgentId;
 | 
			
		||||
                    m_log.ErrorFormat("[ATTACHMENTS MODULE]: Unable to rez attachment with itemID {0}, assetID {1}, point {2} for {3}: {4}\n{5}",
 | 
			
		||||
                        attach.ItemID, attach.AssetID, p, agentId, e.Message, e.StackTrace);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			@ -389,7 +391,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
 | 
			
		|||
            lock (sp.AttachmentsSyncLock)
 | 
			
		||||
            {
 | 
			
		||||
                // Save avatar attachment information
 | 
			
		||||
                m_log.Debug("[ATTACHMENTS MODULE]: Detaching from UserID: " + sp.UUID + ", ItemID: " + itemID);
 | 
			
		||||
//                m_log.Debug("[ATTACHMENTS MODULE]: Detaching from UserID: " + sp.UUID + ", ItemID: " + itemID);
 | 
			
		||||
 | 
			
		||||
                bool changed = sp.Appearance.DetachAttachment(itemID);
 | 
			
		||||
                if (changed && m_scene.AvatarFactory != null)
 | 
			
		||||
| 
						 | 
				
			
			@ -469,9 +471,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
 | 
			
		|||
 | 
			
		||||
            if (grp.HasGroupChanged || (saveAllScripted && grp.ContainsScripts()))
 | 
			
		||||
            {
 | 
			
		||||
                m_log.DebugFormat(
 | 
			
		||||
                    "[ATTACHMENTS MODULE]: Updating asset for attachment {0}, attachpoint {1}",
 | 
			
		||||
                    grp.UUID, grp.AttachmentPoint);
 | 
			
		||||
//                m_log.DebugFormat(
 | 
			
		||||
//                    "[ATTACHMENTS MODULE]: Updating asset for attachment {0}, attachpoint {1}",
 | 
			
		||||
//                    grp.UUID, grp.AttachmentPoint);
 | 
			
		||||
 | 
			
		||||
                string sceneObjectXml = SceneObjectSerializer.ToOriginalXmlFormat(grp);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -502,12 +504,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
 | 
			
		|||
                }
 | 
			
		||||
                grp.HasGroupChanged = false; // Prevent it being saved over and over
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                m_log.DebugFormat(
 | 
			
		||||
                    "[ATTACHMENTS MODULE]: Don't need to update asset for unchanged attachment {0}, attachpoint {1}",
 | 
			
		||||
                    grp.UUID, grp.AttachmentPoint);
 | 
			
		||||
            }
 | 
			
		||||
//            else
 | 
			
		||||
//            {
 | 
			
		||||
//                m_log.DebugFormat(
 | 
			
		||||
//                    "[ATTACHMENTS MODULE]: Don't need to update asset for unchanged attachment {0}, attachpoint {1}",
 | 
			
		||||
//                    grp.UUID, grp.AttachmentPoint);
 | 
			
		||||
//            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
| 
						 | 
				
			
			@ -889,13 +891,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
 | 
			
		|||
                // Calls attach with a Zero position
 | 
			
		||||
                if (AttachObject(sp, part.ParentGroup, AttachmentPt, false))
 | 
			
		||||
                {
 | 
			
		||||
                    m_scene.EventManager.TriggerOnAttach(objectLocalID, part.ParentGroup.FromItemID, remoteClient.AgentId);
 | 
			
		||||
//                    m_log.Debug(
 | 
			
		||||
//                        "[ATTACHMENTS MODULE]: Saving avatar attachment. AgentID: " + remoteClient.AgentId
 | 
			
		||||
//                        + ", AttachmentPoint: " + AttachmentPt);
 | 
			
		||||
 | 
			
		||||
                    // Save avatar attachment information
 | 
			
		||||
                    m_log.Debug(
 | 
			
		||||
                        "[ATTACHMENTS MODULE]: Saving avatar attachment. AgentID: " + remoteClient.AgentId
 | 
			
		||||
                        + ", AttachmentPoint: " + AttachmentPt);
 | 
			
		||||
 | 
			
		||||
                    m_scene.EventManager.TriggerOnAttach(objectLocalID, part.ParentGroup.FromItemID, remoteClient.AgentId);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            catch (Exception e)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -158,7 +158,7 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
 | 
			
		|||
                // Process the baked texture array
 | 
			
		||||
                if (textureEntry != null)
 | 
			
		||||
                {
 | 
			
		||||
                    m_log.InfoFormat("[AVFACTORY]: Received texture update for {0} {1}", sp.Name, sp.UUID);
 | 
			
		||||
//                    m_log.DebugFormat("[AVFACTORY]: Received texture update for {0} {1}", sp.Name, sp.UUID);
 | 
			
		||||
 | 
			
		||||
//                    WriteBakedTexturesReport(sp, m_log.DebugFormat);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -208,7 +208,8 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
 | 
			
		|||
            ScenePresence sp = m_scene.GetScenePresence(agentId);
 | 
			
		||||
            if (sp == null)
 | 
			
		||||
            {
 | 
			
		||||
                m_log.WarnFormat("[AVFACTORY]: Agent {0} no longer in the scene", agentId);
 | 
			
		||||
                // This is expected if the user has gone away.
 | 
			
		||||
//                m_log.DebugFormat("[AVFACTORY]: Agent {0} no longer in the scene", agentId);
 | 
			
		||||
                return false;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -248,10 +249,10 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
 | 
			
		|||
 | 
			
		||||
                if (bakedTextureFace == null)
 | 
			
		||||
                {
 | 
			
		||||
                    m_log.WarnFormat(
 | 
			
		||||
                        "[AV FACTORY]: No texture ID set for {0} for {1} in {2} not found when trying to save permanently",
 | 
			
		||||
                        bakeType, sp.Name, m_scene.RegionInfo.RegionName);
 | 
			
		||||
 | 
			
		||||
                    // This can happen legitimately, since some baked textures might not exist
 | 
			
		||||
                    //m_log.WarnFormat(
 | 
			
		||||
                    //    "[AV FACTORY]: No texture ID set for {0} for {1} in {2} not found when trying to save permanently",
 | 
			
		||||
                    //    bakeType, sp.Name, m_scene.RegionInfo.RegionName);
 | 
			
		||||
                    continue;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -337,7 +338,7 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
 | 
			
		|||
                    return false;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            m_log.DebugFormat("[AVFACTORY]: Completed texture check for {0} {1}", sp.Name, sp.UUID);
 | 
			
		||||
//            m_log.DebugFormat("[AVFACTORY]: Completed texture check for {0} {1}", sp.Name, sp.UUID);
 | 
			
		||||
 | 
			
		||||
            // If we only found default textures, then the appearance is not cached
 | 
			
		||||
            return (defonly ? false : true);
 | 
			
		||||
| 
						 | 
				
			
			@ -417,7 +418,8 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
 | 
			
		|||
//                    acd.AgentID, i, acd.Appearance.Texture.FaceTextures[i]);
 | 
			
		||||
 | 
			
		||||
                int ftIndex = (int)AppearanceManager.BakeTypeToAgentTextureIndex(bakeType);
 | 
			
		||||
                bakedTextures[bakeType] = faceTextures[ftIndex];
 | 
			
		||||
                Primitive.TextureEntryFace texture = faceTextures[ftIndex];    // this will be null if there's no such baked texture
 | 
			
		||||
                bakedTextures[bakeType] = texture;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            return bakedTextures;
 | 
			
		||||
| 
						 | 
				
			
			@ -482,7 +484,8 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
 | 
			
		|||
            ScenePresence sp = m_scene.GetScenePresence(agentid);
 | 
			
		||||
            if (sp == null)
 | 
			
		||||
            {
 | 
			
		||||
                m_log.WarnFormat("[AVFACTORY]: Agent {0} no longer in the scene", agentid);
 | 
			
		||||
                // This is expected if the user has gone away.
 | 
			
		||||
//                m_log.DebugFormat("[AVFACTORY]: Agent {0} no longer in the scene", agentid);
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -186,6 +186,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat
 | 
			
		|||
        {
 | 
			
		||||
            string fromName = c.From;
 | 
			
		||||
            UUID fromID = UUID.Zero;
 | 
			
		||||
            UUID targetID = c.TargetUUID;
 | 
			
		||||
            string message = c.Message;
 | 
			
		||||
            IScene scene = c.Scene;
 | 
			
		||||
            Vector3 fromPos = c.Position;
 | 
			
		||||
| 
						 | 
				
			
			@ -221,24 +222,38 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat
 | 
			
		|||
                message = message.Substring(0, 1000);
 | 
			
		||||
 | 
			
		||||
//            m_log.DebugFormat(
 | 
			
		||||
//                "[CHAT]: DCTA: fromID {0} fromName {1}, region{2}, cType {3}, sType {4}", 
 | 
			
		||||
//                fromID, fromName, scene.RegionInfo.RegionName, c.Type, sourceType);
 | 
			
		||||
//                "[CHAT]: DCTA: fromID {0} fromName {1}, region{2}, cType {3}, sType {4}, targetID {5}",
 | 
			
		||||
//                fromID, fromName, scene.RegionInfo.RegionName, c.Type, sourceType, targetID);
 | 
			
		||||
 | 
			
		||||
            HashSet<UUID> receiverIDs = new HashSet<UUID>();
 | 
			
		||||
            
 | 
			
		||||
 | 
			
		||||
            foreach (Scene s in m_scenes)
 | 
			
		||||
            {
 | 
			
		||||
                // This should use ForEachClient, but clients don't have a position.
 | 
			
		||||
                // If camera is moved into client, then camera position can be used
 | 
			
		||||
                s.ForEachRootScenePresence(
 | 
			
		||||
                    delegate(ScenePresence presence)
 | 
			
		||||
                if (targetID == UUID.Zero)
 | 
			
		||||
                {
 | 
			
		||||
                    // This should use ForEachClient, but clients don't have a position.
 | 
			
		||||
                    // If camera is moved into client, then camera position can be used
 | 
			
		||||
                    s.ForEachRootScenePresence(
 | 
			
		||||
                        delegate(ScenePresence presence)
 | 
			
		||||
                        {
 | 
			
		||||
                            if (TrySendChatMessage(presence, fromPos, regionPos, fromID, fromName, c.Type, message, sourceType, false))
 | 
			
		||||
                                receiverIDs.Add(presence.UUID);
 | 
			
		||||
                        }
 | 
			
		||||
                    );
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    // This is a send to a specific client eg from llRegionSayTo
 | 
			
		||||
                    // no need to check distance etc, jand send is as say
 | 
			
		||||
                    ScenePresence presence = s.GetScenePresence(targetID);
 | 
			
		||||
                    if (presence != null && !presence.IsChildAgent)
 | 
			
		||||
                    {
 | 
			
		||||
                        if (TrySendChatMessage(presence, fromPos, regionPos, fromID, fromName, c.Type, message, sourceType))
 | 
			
		||||
                            receiverIDs.Add(presence.UUID);
 | 
			
		||||
                        if (TrySendChatMessage(presence, fromPos, regionPos, fromID, fromName, ChatTypeEnum.Say, message, sourceType, true))
 | 
			
		||||
                                receiverIDs.Add(presence.UUID);
 | 
			
		||||
                    }
 | 
			
		||||
                );
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            
 | 
			
		||||
 | 
			
		||||
            (scene as Scene).EventManager.TriggerOnChatToClients(
 | 
			
		||||
                fromID, receiverIDs, message, c.Type, fromPos, fromName, sourceType, ChatAudibleLevel.Fully);
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			@ -315,7 +330,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat
 | 
			
		|||
        /// precondition</returns>
 | 
			
		||||
        protected virtual bool TrySendChatMessage(ScenePresence presence, Vector3 fromPos, Vector3 regionPos,
 | 
			
		||||
                                                  UUID fromAgentID, string fromName, ChatTypeEnum type,
 | 
			
		||||
                                                  string message, ChatSourceType src)
 | 
			
		||||
                                                  string message, ChatSourceType src, bool ignoreDistance)
 | 
			
		||||
        {
 | 
			
		||||
            // don't send stuff to child agents
 | 
			
		||||
            if (presence.IsChildAgent) return false;
 | 
			
		||||
| 
						 | 
				
			
			@ -326,12 +341,15 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat
 | 
			
		|||
                            presence.Scene.RegionInfo.RegionLocY * Constants.RegionSize, 0);
 | 
			
		||||
 | 
			
		||||
            int dis = (int)Util.GetDistanceTo(toRegionPos, fromRegionPos);
 | 
			
		||||
            
 | 
			
		||||
            if (type == ChatTypeEnum.Whisper && dis > m_whisperdistance ||
 | 
			
		||||
                type == ChatTypeEnum.Say && dis > m_saydistance ||
 | 
			
		||||
                type == ChatTypeEnum.Shout && dis > m_shoutdistance)
 | 
			
		||||
 | 
			
		||||
            if (!ignoreDistance)
 | 
			
		||||
            {
 | 
			
		||||
                return false;
 | 
			
		||||
                if (type == ChatTypeEnum.Whisper && dis > m_whisperdistance ||
 | 
			
		||||
                    type == ChatTypeEnum.Say && dis > m_saydistance ||
 | 
			
		||||
                    type == ChatTypeEnum.Shout && dis > m_shoutdistance)
 | 
			
		||||
                {
 | 
			
		||||
                    return false;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // TODO: should change so the message is sent through the avatar rather than direct to the ClientView
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -151,11 +151,17 @@ namespace OpenSim.Region.CoreModules.Avatar.Lure
 | 
			
		|||
            Scene scene = (Scene)(client.Scene);
 | 
			
		||||
            ScenePresence presence = scene.GetScenePresence(client.AgentId);
 | 
			
		||||
 | 
			
		||||
            // Round up Z co-ordinate rather than round-down by casting.  This stops tall avatars from being given
 | 
			
		||||
            // a teleport Z co-ordinate by short avatars that drops them through or embeds them in thin floors on
 | 
			
		||||
            // arrival.
 | 
			
		||||
            //
 | 
			
		||||
            // Ideally we would give the exact float position adjusting for the relative height of the two avatars
 | 
			
		||||
            // but it looks like a float component isn't possible with a parcel ID.
 | 
			
		||||
            UUID dest = Util.BuildFakeParcelID(
 | 
			
		||||
                    scene.RegionInfo.RegionHandle,
 | 
			
		||||
                    (uint)presence.AbsolutePosition.X,
 | 
			
		||||
                    (uint)presence.AbsolutePosition.Y,
 | 
			
		||||
                    (uint)presence.AbsolutePosition.Z);
 | 
			
		||||
                    (uint)Math.Ceiling(presence.AbsolutePosition.Z));
 | 
			
		||||
 | 
			
		||||
            m_log.DebugFormat("TP invite with message {0}", message);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -61,8 +61,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
 | 
			
		|||
            set { m_MaxTransferDistance = value; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private int m_levelHGTeleport = 0;
 | 
			
		||||
 | 
			
		||||
        protected bool m_Enabled = false;
 | 
			
		||||
        protected Scene m_aScene;
 | 
			
		||||
        protected List<Scene> m_Scenes = new List<Scene>();
 | 
			
		||||
| 
						 | 
				
			
			@ -106,7 +104,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
 | 
			
		|||
            if (transferConfig != null)
 | 
			
		||||
            {
 | 
			
		||||
                MaxTransferDistance = transferConfig.GetInt("max_distance", 4095);
 | 
			
		||||
                m_levelHGTeleport = transferConfig.GetInt("LevelHGTeleport", 0);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            m_agentsInTransit = new List<UUID>();
 | 
			
		||||
| 
						 | 
				
			
			@ -172,13 +169,17 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
 | 
			
		|||
            // Reset animations; the viewer does that in teleports.
 | 
			
		||||
            sp.Animator.ResetAnimations();
 | 
			
		||||
 | 
			
		||||
            string destinationRegionName = "(not found)";
 | 
			
		||||
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                if (regionHandle == sp.Scene.RegionInfo.RegionHandle)
 | 
			
		||||
                {
 | 
			
		||||
                    destinationRegionName = sp.Scene.RegionInfo.RegionName;
 | 
			
		||||
 | 
			
		||||
                    m_log.DebugFormat(
 | 
			
		||||
                        "[ENTITY TRANSFER MODULE]: RequestTeleportToLocation {0} within {1}",
 | 
			
		||||
                        position, sp.Scene.RegionInfo.RegionName);
 | 
			
		||||
                        "[ENTITY TRANSFER MODULE]: RequestTeleportToLocation for {0} to {1} within existing region {2}",
 | 
			
		||||
                        sp.Name, position, destinationRegionName);
 | 
			
		||||
 | 
			
		||||
                    // Teleport within the same region
 | 
			
		||||
                    if (IsOutsideRegion(sp.Scene, position) || position.Z < 0)
 | 
			
		||||
| 
						 | 
				
			
			@ -188,6 +189,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
 | 
			
		|||
                        m_log.WarnFormat(
 | 
			
		||||
                            "[ENTITY TRANSFER MODULE]: RequestTeleportToLocation() was given an illegal position of {0} for avatar {1}, {2}.  Substituting {3}",
 | 
			
		||||
                            position, sp.Name, sp.UUID, emergencyPos);
 | 
			
		||||
 | 
			
		||||
                        position = emergencyPos;
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -210,6 +212,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
 | 
			
		|||
                    sp.ControllingClient.SendTeleportStart(teleportFlags);
 | 
			
		||||
 | 
			
		||||
                    sp.ControllingClient.SendLocalTeleport(position, lookAt, teleportFlags);
 | 
			
		||||
                    sp.Velocity = Vector3.Zero;
 | 
			
		||||
                    sp.Teleport(position);
 | 
			
		||||
 | 
			
		||||
                    foreach (SceneObjectGroup grp in sp.GetAttachments())
 | 
			
		||||
| 
						 | 
				
			
			@ -233,15 +236,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
 | 
			
		|||
                            return;
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                        // check if HyperGrid teleport is allowed, based on user level
 | 
			
		||||
                        int flags = m_aScene.GridService.GetRegionFlags(sp.Scene.RegionInfo.ScopeID, reg.RegionID);
 | 
			
		||||
 | 
			
		||||
                        if (((flags & (int)OpenSim.Data.RegionFlags.Hyperlink) != 0) && (sp.UserLevel < m_levelHGTeleport))
 | 
			
		||||
                        {
 | 
			
		||||
                            m_log.WarnFormat("[ENTITY TRANSFER MODULE]: Final destination link is non permitted hypergrid region. Unable to teleport agent.");
 | 
			
		||||
                            sp.ControllingClient.SendTeleportFailed("HyperGrid teleport not permitted");
 | 
			
		||||
                            return;
 | 
			
		||||
                        }
 | 
			
		||||
                        destinationRegionName = finalDestination.RegionName;
 | 
			
		||||
 | 
			
		||||
                        uint curX = 0, curY = 0;
 | 
			
		||||
                        Utils.LongToUInts(sp.Scene.RegionInfo.RegionHandle, out curX, out curY);
 | 
			
		||||
| 
						 | 
				
			
			@ -307,7 +302,11 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
 | 
			
		|||
            }
 | 
			
		||||
            catch (Exception e)
 | 
			
		||||
            {
 | 
			
		||||
                m_log.WarnFormat("[ENTITY TRANSFER MODULE]: Exception on teleport: {0} {1}", e.Message, e.StackTrace);
 | 
			
		||||
                m_log.ErrorFormat(
 | 
			
		||||
                    "[ENTITY TRANSFER MODULE]: Exception on teleport of {0} from {1}@{2} to {3}@{4}: {5}{6}",
 | 
			
		||||
                    sp.Name, sp.AbsolutePosition, sp.Scene.RegionInfo.RegionName, position, destinationRegionName,
 | 
			
		||||
                    e.Message, e.StackTrace);
 | 
			
		||||
 | 
			
		||||
                sp.ControllingClient.SendTeleportFailed("Internal error");
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			@ -402,7 +401,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
 | 
			
		|||
                bool logout = false;
 | 
			
		||||
                if (!CreateAgent(sp, reg, finalDestination, agentCircuit, teleportFlags, out reason, out logout))
 | 
			
		||||
                {
 | 
			
		||||
                    sp.ControllingClient.SendTeleportFailed(String.Format("Destination refused: {0}",
 | 
			
		||||
                    sp.ControllingClient.SendTeleportFailed(String.Format("Teleport refused: {0}",
 | 
			
		||||
                                                                              reason));
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -50,6 +50,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
 | 
			
		|||
        private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
 | 
			
		||||
 | 
			
		||||
        private bool m_Initialized = false;
 | 
			
		||||
        private int m_levelHGTeleport = 0;
 | 
			
		||||
 | 
			
		||||
        private GatekeeperServiceConnector m_GatekeeperConnector;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -68,6 +69,10 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
 | 
			
		|||
                string name = moduleConfig.GetString("EntityTransferModule", "");
 | 
			
		||||
                if (name == Name)
 | 
			
		||||
                {
 | 
			
		||||
                    IConfig transferConfig = source.Configs["EntityTransfer"];
 | 
			
		||||
                    if (transferConfig != null)
 | 
			
		||||
                        m_levelHGTeleport = transferConfig.GetInt("LevelHGTeleport", 0);
 | 
			
		||||
 | 
			
		||||
                    InitialiseCommon(source);
 | 
			
		||||
                    m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: {0} enabled.", Name);
 | 
			
		||||
                }
 | 
			
		||||
| 
						 | 
				
			
			@ -164,6 +169,14 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
 | 
			
		|||
            if (flags == -1 /* no region in DB */ || (flags & (int)OpenSim.Data.RegionFlags.Hyperlink) != 0)
 | 
			
		||||
            {
 | 
			
		||||
                // this user is going to another grid
 | 
			
		||||
                // check if HyperGrid teleport is allowed, based on user level
 | 
			
		||||
                if (sp.UserLevel < m_levelHGTeleport)
 | 
			
		||||
                {
 | 
			
		||||
                    m_log.WarnFormat("[HG ENTITY TRANSFER MODULE]: Unable to HG teleport agent due to insufficient UserLevel.");
 | 
			
		||||
                    reason = "HyperGrid teleport not permitted";
 | 
			
		||||
                    return false;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                if (agentCircuit.ServiceURLs.ContainsKey("HomeURI"))
 | 
			
		||||
                {
 | 
			
		||||
                    string userAgentDriver = agentCircuit.ServiceURLs["HomeURI"].ToString();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -308,56 +308,56 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm
 | 
			
		|||
        /// <param name='msg'>
 | 
			
		||||
        /// Message.
 | 
			
		||||
        /// </param>
 | 
			
		||||
        public bool DeliverMessageTo(UUID target, int channel, Vector3 pos, string name, UUID id, string msg, out string error)
 | 
			
		||||
        public void DeliverMessageTo(UUID target, int channel, Vector3 pos, string name, UUID id, string msg)
 | 
			
		||||
        {
 | 
			
		||||
            error = null;
 | 
			
		||||
            // Is id an avatar?
 | 
			
		||||
            ScenePresence sp = m_scene.GetScenePresence(target);
 | 
			
		||||
 | 
			
		||||
            if (sp != null)
 | 
			
		||||
            {
 | 
			
		||||
                // Send message to avatar
 | 
			
		||||
                // ignore if a child agent this is restricted to inside one region
 | 
			
		||||
                if (sp.IsChildAgent)
 | 
			
		||||
                    return;
 | 
			
		||||
 | 
			
		||||
                // Send message to the avatar.
 | 
			
		||||
                // Channel zero only goes to the avatar
 | 
			
		||||
                // non zero channel messages only go to the attachments
 | 
			
		||||
                if (channel == 0)
 | 
			
		||||
                {
 | 
			
		||||
                    m_scene.SimChatBroadcast(Utils.StringToBytes(msg), ChatTypeEnum.Broadcast, 0, pos, name, id, false);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                List<SceneObjectGroup> attachments = sp.GetAttachments();
 | 
			
		||||
 | 
			
		||||
                if (attachments.Count == 0)
 | 
			
		||||
                    return true;
 | 
			
		||||
 | 
			
		||||
                // Get uuid of attachments
 | 
			
		||||
                List<UUID> targets = new List<UUID>();
 | 
			
		||||
                foreach (SceneObjectGroup sog in attachments)
 | 
			
		||||
                    m_scene.SimChatToAgent(target, Utils.StringToBytes(msg), pos, name, id, false);
 | 
			
		||||
               }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    if (!sog.IsDeleted)
 | 
			
		||||
                        targets.Add(sog.UUID);
 | 
			
		||||
                    List<SceneObjectGroup> attachments = sp.GetAttachments();
 | 
			
		||||
                    if (attachments.Count == 0)
 | 
			
		||||
                        return;
 | 
			
		||||
 | 
			
		||||
                    // Get uuid of attachments
 | 
			
		||||
                    List<UUID> targets = new List<UUID>();
 | 
			
		||||
                    foreach (SceneObjectGroup sog in attachments)
 | 
			
		||||
                    {
 | 
			
		||||
                        if (!sog.IsDeleted)
 | 
			
		||||
                            targets.Add(sog.UUID);
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    // Need to check each attachment
 | 
			
		||||
                    foreach (ListenerInfo li in m_listenerManager.GetListeners(UUID.Zero, channel, name, id, msg))
 | 
			
		||||
                    {
 | 
			
		||||
                        if (li.GetHostID().Equals(id))
 | 
			
		||||
                            continue;
 | 
			
		||||
 | 
			
		||||
                        if (m_scene.GetSceneObjectPart(li.GetHostID()) == null)
 | 
			
		||||
                            continue;
 | 
			
		||||
 | 
			
		||||
                        if (targets.Contains(li.GetHostID()))
 | 
			
		||||
                            QueueMessage(new ListenerInfo(li, name, id, msg));
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                // Need to check each attachment
 | 
			
		||||
                foreach (ListenerInfo li in m_listenerManager.GetListeners(UUID.Zero, channel, name, id, msg))
 | 
			
		||||
                {
 | 
			
		||||
                    if (li.GetHostID().Equals(id))
 | 
			
		||||
                        continue;
 | 
			
		||||
 | 
			
		||||
                    if (m_scene.GetSceneObjectPart(li.GetHostID()) == null)
 | 
			
		||||
                        continue;
 | 
			
		||||
 | 
			
		||||
                    if (targets.Contains(li.GetHostID()))
 | 
			
		||||
                        QueueMessage(new ListenerInfo(li, name, id, msg));
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                return true;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // Need to toss an error here
 | 
			
		||||
            if (channel == 0)
 | 
			
		||||
            {
 | 
			
		||||
                error = "Cannot use llRegionSayTo to message objects on channel 0";
 | 
			
		||||
                return false;
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // No avatar found so look for an object
 | 
			
		||||
            foreach (ListenerInfo li in m_listenerManager.GetListeners(UUID.Zero, channel, name, id, msg))
 | 
			
		||||
            {
 | 
			
		||||
                // Dont process if this message is from yourself!
 | 
			
		||||
| 
						 | 
				
			
			@ -375,7 +375,7 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm
 | 
			
		|||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            return true;
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        protected void QueueMessage(ListenerInfo li)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -102,9 +102,9 @@ namespace OpenSim.Region.CoreModules.World.Archiver.Tests
 | 
			
		|||
            PrimitiveBaseShape shape = PrimitiveBaseShape.CreateSphere();
 | 
			
		||||
            Vector3 groupPosition = new Vector3(10, 20, 30);
 | 
			
		||||
            Quaternion rotationOffset = new Quaternion(20, 30, 40, 50);
 | 
			
		||||
            Vector3 offsetPosition = new Vector3(5, 10, 15);
 | 
			
		||||
//            Vector3 offsetPosition = new Vector3(5, 10, 15);
 | 
			
		||||
 | 
			
		||||
            return new SceneObjectPart(ownerId, shape, groupPosition, rotationOffset, offsetPosition) { Name = partName };
 | 
			
		||||
            return new SceneObjectPart(ownerId, shape, groupPosition, rotationOffset, Vector3.Zero) { Name = partName };
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        protected SceneObjectPart CreateSceneObjectPart2()
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -225,7 +225,7 @@ namespace OpenSim.Region.CoreModules.World.LegacyMap
 | 
			
		|||
            int tc = 0;
 | 
			
		||||
            double[,] hm = whichScene.Heightmap.GetDoubles();
 | 
			
		||||
            tc = Environment.TickCount;
 | 
			
		||||
            m_log.Info("[MAPTILE]: Generating Maptile Step 2: Object Volume Profile");
 | 
			
		||||
            m_log.Debug("[MAPTILE]: Generating Maptile Step 2: Object Volume Profile");
 | 
			
		||||
            EntityBase[] objs = whichScene.GetEntities();
 | 
			
		||||
            Dictionary<uint, DrawStruct> z_sort = new Dictionary<uint, DrawStruct>();
 | 
			
		||||
            //SortedList<float, RectangleDrawStruct> z_sort = new SortedList<float, RectangleDrawStruct>();
 | 
			
		||||
| 
						 | 
				
			
			@ -541,7 +541,7 @@ namespace OpenSim.Region.CoreModules.World.LegacyMap
 | 
			
		|||
                g.Dispose();
 | 
			
		||||
            } // lock entities objs
 | 
			
		||||
 | 
			
		||||
            m_log.Info("[MAPTILE]: Generating Maptile Step 2: Done in " + (Environment.TickCount - tc) + " ms");
 | 
			
		||||
            m_log.Debug("[MAPTILE]: Generating Maptile Step 2: Done in " + (Environment.TickCount - tc) + " ms");
 | 
			
		||||
            return mapbmp;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -54,7 +54,7 @@ namespace OpenSim.Region.CoreModules.World.LegacyMap
 | 
			
		|||
        public void TerrainToBitmap(Bitmap mapbmp)
 | 
			
		||||
        {
 | 
			
		||||
            int tc = Environment.TickCount;
 | 
			
		||||
            m_log.Info("[MAPTILE]: Generating Maptile Step 1: Terrain");
 | 
			
		||||
            m_log.Debug("[MAPTILE]: Generating Maptile Step 1: Terrain");
 | 
			
		||||
 | 
			
		||||
            double[,] hm = m_scene.Heightmap.GetDoubles();
 | 
			
		||||
            bool ShadowDebugContinue = true;
 | 
			
		||||
| 
						 | 
				
			
			@ -238,7 +238,7 @@ namespace OpenSim.Region.CoreModules.World.LegacyMap
 | 
			
		|||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            m_log.Info("[MAPTILE]: Generating Maptile Step 1: Done in " + (Environment.TickCount - tc) + " ms");
 | 
			
		||||
            m_log.Debug("[MAPTILE]: Generating Maptile Step 1: Done in " + (Environment.TickCount - tc) + " ms");
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -278,7 +278,7 @@ namespace OpenSim.Region.CoreModules.World.LegacyMap
 | 
			
		|||
        public void TerrainToBitmap(Bitmap mapbmp)
 | 
			
		||||
        {
 | 
			
		||||
            int tc = Environment.TickCount;
 | 
			
		||||
            m_log.Info("[MAPTILE]: Generating Maptile Step 1: Terrain");
 | 
			
		||||
            m_log.Debug("[MAPTILE]: Generating Maptile Step 1: Terrain");
 | 
			
		||||
 | 
			
		||||
            // These textures should be in the AssetCache anyway, as every client conneting to this
 | 
			
		||||
            // region needs them. Except on start, when the map is recreated (before anyone connected),
 | 
			
		||||
| 
						 | 
				
			
			@ -412,7 +412,7 @@ namespace OpenSim.Region.CoreModules.World.LegacyMap
 | 
			
		|||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            m_log.Info("[MAPTILE]: Generating Maptile Step 1: Done in " + (Environment.TickCount - tc) + " ms");
 | 
			
		||||
            m_log.Debug("[MAPTILE]: Generating Maptile Step 1: Done in " + (Environment.TickCount - tc) + " ms");
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -282,7 +282,7 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands
 | 
			
		|||
            sb.AppendFormat("Location:    {0} @ {1}\n", sop.AbsolutePosition, sop.ParentGroup.Scene.RegionInfo.RegionName);
 | 
			
		||||
            sb.AppendFormat("Parent:      {0}",
 | 
			
		||||
                sop.IsRoot ? "Is Root\n" : string.Format("{0} {1}\n", sop.ParentGroup.Name, sop.ParentGroup.UUID));
 | 
			
		||||
            sb.AppendFormat("Parts:       {0}\n", !sop.IsRoot ? "1" : sop.ParentGroup.PrimCount.ToString());;
 | 
			
		||||
            sb.AppendFormat("Link number: {0}\n", sop.LinkNum);
 | 
			
		||||
 | 
			
		||||
            return sb;
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -59,28 +59,32 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders
 | 
			
		|||
        /// <returns>A terrain channel generated from the image.</returns>
 | 
			
		||||
        public virtual ITerrainChannel LoadFile(string filename)
 | 
			
		||||
        {
 | 
			
		||||
            return LoadBitmap(new Bitmap(filename));
 | 
			
		||||
            using (Bitmap b = new Bitmap(filename))
 | 
			
		||||
                return LoadBitmap(b);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public virtual ITerrainChannel LoadFile(string filename, int offsetX, int offsetY, int fileWidth, int fileHeight, int w, int h)
 | 
			
		||||
        {
 | 
			
		||||
            Bitmap bitmap = new Bitmap(filename);
 | 
			
		||||
            ITerrainChannel retval = new TerrainChannel(true);
 | 
			
		||||
 | 
			
		||||
            for (int x = 0; x < retval.Width; x++)
 | 
			
		||||
            using (Bitmap bitmap = new Bitmap(filename))
 | 
			
		||||
            {
 | 
			
		||||
                for (int y = 0; y < retval.Height; y++)
 | 
			
		||||
                {
 | 
			
		||||
                    retval[x, y] = bitmap.GetPixel(offsetX * retval.Width + x, (bitmap.Height - (retval.Height * (offsetY + 1))) + retval.Height - y - 1).GetBrightness() * 128;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
                ITerrainChannel retval = new TerrainChannel(true);
 | 
			
		||||
 | 
			
		||||
            return retval;
 | 
			
		||||
                for (int x = 0; x < retval.Width; x++)
 | 
			
		||||
                {
 | 
			
		||||
                    for (int y = 0; y < retval.Height; y++)
 | 
			
		||||
                    {
 | 
			
		||||
                        retval[x, y] = bitmap.GetPixel(offsetX * retval.Width + x, (bitmap.Height - (retval.Height * (offsetY + 1))) + retval.Height - y - 1).GetBrightness() * 128;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                return retval;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public virtual ITerrainChannel LoadStream(Stream stream)
 | 
			
		||||
        {
 | 
			
		||||
            return LoadBitmap(new Bitmap(stream));
 | 
			
		||||
            using (Bitmap b = new Bitmap(stream))
 | 
			
		||||
                return LoadBitmap(b);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        protected virtual ITerrainChannel LoadBitmap(Bitmap bitmap)
 | 
			
		||||
| 
						 | 
				
			
			@ -134,35 +138,53 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders
 | 
			
		|||
            // "Saving the image to the same file it was constructed from is not allowed and throws an exception."
 | 
			
		||||
            string tempName = Path.GetTempFileName();
 | 
			
		||||
 | 
			
		||||
            Bitmap entireBitmap = null;
 | 
			
		||||
            Bitmap existingBitmap = null;
 | 
			
		||||
            Bitmap thisBitmap = null;
 | 
			
		||||
            if (File.Exists(filename))
 | 
			
		||||
            Bitmap newBitmap = null;
 | 
			
		||||
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                File.Copy(filename, tempName, true);
 | 
			
		||||
                entireBitmap = new Bitmap(tempName);
 | 
			
		||||
                if (entireBitmap.Width != fileWidth * regionSizeX || entireBitmap.Height != fileHeight * regionSizeY)
 | 
			
		||||
                if (File.Exists(filename))
 | 
			
		||||
                {
 | 
			
		||||
                    // old file, let's overwrite it
 | 
			
		||||
                    entireBitmap = new Bitmap(fileWidth * regionSizeX, fileHeight * regionSizeY);
 | 
			
		||||
                    File.Copy(filename, tempName, true);
 | 
			
		||||
                    existingBitmap = new Bitmap(tempName);
 | 
			
		||||
                    if (existingBitmap.Width != fileWidth * regionSizeX || existingBitmap.Height != fileHeight * regionSizeY)
 | 
			
		||||
                    {
 | 
			
		||||
                        // old file, let's overwrite it
 | 
			
		||||
                        newBitmap = new Bitmap(fileWidth * regionSizeX, fileHeight * regionSizeY);
 | 
			
		||||
                    }
 | 
			
		||||
                    else
 | 
			
		||||
                    {
 | 
			
		||||
                        newBitmap = existingBitmap;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    newBitmap = new Bitmap(fileWidth * regionSizeX, fileHeight * regionSizeY);
 | 
			
		||||
                }
 | 
			
		||||
    
 | 
			
		||||
                thisBitmap = CreateGrayscaleBitmapFromMap(m_channel);
 | 
			
		||||
    //            Console.WriteLine("offsetX=" + offsetX + " offsetY=" + offsetY);
 | 
			
		||||
                for (int x = 0; x < regionSizeX; x++)
 | 
			
		||||
                    for (int y = 0; y < regionSizeY; y++)
 | 
			
		||||
                        newBitmap.SetPixel(x + offsetX * regionSizeX, y + (fileHeight - 1 - offsetY) * regionSizeY, thisBitmap.GetPixel(x, y));
 | 
			
		||||
    
 | 
			
		||||
                Save(newBitmap, filename);
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            finally
 | 
			
		||||
            {
 | 
			
		||||
                entireBitmap = new Bitmap(fileWidth * regionSizeX, fileHeight * regionSizeY);
 | 
			
		||||
                if (existingBitmap != null)
 | 
			
		||||
                    existingBitmap.Dispose();
 | 
			
		||||
 | 
			
		||||
                if (thisBitmap != null)
 | 
			
		||||
                    thisBitmap.Dispose();
 | 
			
		||||
 | 
			
		||||
                if (newBitmap != null)
 | 
			
		||||
                    newBitmap.Dispose();
 | 
			
		||||
 | 
			
		||||
                if (File.Exists(tempName))
 | 
			
		||||
                    File.Delete(tempName);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            thisBitmap = CreateGrayscaleBitmapFromMap(m_channel);
 | 
			
		||||
//            Console.WriteLine("offsetX=" + offsetX + " offsetY=" + offsetY);
 | 
			
		||||
            for (int x = 0; x < regionSizeX; x++)
 | 
			
		||||
                for (int y = 0; y < regionSizeY; y++)
 | 
			
		||||
                    entireBitmap.SetPixel(x + offsetX * regionSizeX, y + (fileHeight - 1 - offsetY) * regionSizeY, thisBitmap.GetPixel(x, y));
 | 
			
		||||
 | 
			
		||||
            Save(entireBitmap, filename);
 | 
			
		||||
            thisBitmap.Dispose();
 | 
			
		||||
            entireBitmap.Dispose();
 | 
			
		||||
 | 
			
		||||
            if (File.Exists(tempName))
 | 
			
		||||
                File.Delete(tempName);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        protected virtual void Save(Bitmap bmp, string filename)
 | 
			
		||||
| 
						 | 
				
			
			@ -226,16 +248,21 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders
 | 
			
		|||
        /// <returns>A System.Drawing.Bitmap containing a coloured image</returns>
 | 
			
		||||
        protected static Bitmap CreateBitmapFromMap(ITerrainChannel map)
 | 
			
		||||
        {
 | 
			
		||||
            Bitmap gradientmapLd = new Bitmap("defaultstripe.png");
 | 
			
		||||
            int pallete;
 | 
			
		||||
            Bitmap bmp;
 | 
			
		||||
            Color[] colours;
 | 
			
		||||
 | 
			
		||||
            int pallete = gradientmapLd.Height;
 | 
			
		||||
 | 
			
		||||
            Bitmap bmp = new Bitmap(map.Width, map.Height);
 | 
			
		||||
            Color[] colours = new Color[pallete];
 | 
			
		||||
 | 
			
		||||
            for (int i = 0; i < pallete; i++)
 | 
			
		||||
            using (Bitmap gradientmapLd = new Bitmap("defaultstripe.png"))
 | 
			
		||||
            {
 | 
			
		||||
                colours[i] = gradientmapLd.GetPixel(0, i);
 | 
			
		||||
                pallete = gradientmapLd.Height;
 | 
			
		||||
    
 | 
			
		||||
                bmp = new Bitmap(map.Width, map.Height);
 | 
			
		||||
                colours = new Color[pallete];
 | 
			
		||||
    
 | 
			
		||||
                for (int i = 0; i < pallete; i++)
 | 
			
		||||
                {
 | 
			
		||||
                    colours[i] = gradientmapLd.GetPixel(0, i);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            for (int y = 0; y < map.Height; y++)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -99,16 +99,21 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders
 | 
			
		|||
 | 
			
		||||
        private static Bitmap CreateBitmapFromMap(ITerrainChannel map)
 | 
			
		||||
        {
 | 
			
		||||
            Bitmap gradientmapLd = new Bitmap("defaultstripe.png");
 | 
			
		||||
            int pallete;
 | 
			
		||||
            Bitmap bmp;
 | 
			
		||||
            Color[] colours;
 | 
			
		||||
 | 
			
		||||
            int pallete = gradientmapLd.Height;
 | 
			
		||||
 | 
			
		||||
            Bitmap bmp = new Bitmap(map.Width, map.Height);
 | 
			
		||||
            Color[] colours = new Color[pallete];
 | 
			
		||||
 | 
			
		||||
            for (int i = 0; i < pallete; i++)
 | 
			
		||||
            using (Bitmap gradientmapLd = new Bitmap("defaultstripe.png"))
 | 
			
		||||
            {
 | 
			
		||||
                colours[i] = gradientmapLd.GetPixel(0, i);
 | 
			
		||||
                pallete = gradientmapLd.Height;
 | 
			
		||||
    
 | 
			
		||||
                bmp = new Bitmap(map.Width, map.Height);
 | 
			
		||||
                colours = new Color[pallete];
 | 
			
		||||
    
 | 
			
		||||
                for (int i = 0; i < pallete; i++)
 | 
			
		||||
                {
 | 
			
		||||
                    colours[i] = gradientmapLd.GetPixel(0, i);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            for (int y = 0; y < map.Height; y++)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -88,11 +88,11 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap
 | 
			
		|||
            if (renderers.Count > 0)
 | 
			
		||||
            {
 | 
			
		||||
                m_primMesher = RenderingLoader.LoadRenderer(renderers[0]);
 | 
			
		||||
                m_log.Info("[MAPTILE]: Loaded prim mesher " + m_primMesher.ToString());
 | 
			
		||||
                m_log.Debug("[MAPTILE]: Loaded prim mesher " + m_primMesher.ToString());
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                m_log.Info("[MAPTILE]: No prim mesher loaded, prim rendering will be disabled");
 | 
			
		||||
                m_log.Debug("[MAPTILE]: No prim mesher loaded, prim rendering will be disabled");
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            m_scene.RegisterModuleInterface<IMapImageGenerator>(this);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -103,7 +103,7 @@ namespace OpenSim.Region.Framework.Interfaces
 | 
			
		|||
        /// <param name='msg'>
 | 
			
		||||
        /// Message.
 | 
			
		||||
        /// </param>
 | 
			
		||||
        bool DeliverMessageTo(UUID target, int channel, Vector3 pos, string name, UUID id, string msg, out string error);
 | 
			
		||||
        void DeliverMessageTo(UUID target, int channel, Vector3 pos, string name, UUID id, string msg);
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Are there any listen events ready to be dispatched?
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -38,8 +38,9 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
{
 | 
			
		||||
    public partial class Scene
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
        protected void SimChat(byte[] message, ChatTypeEnum type, int channel, Vector3 fromPos, string fromName,
 | 
			
		||||
                               UUID fromID, bool fromAgent, bool broadcast)
 | 
			
		||||
                               UUID fromID, UUID targetID, bool fromAgent, bool broadcast)
 | 
			
		||||
        {
 | 
			
		||||
            OSChatMessage args = new OSChatMessage();
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -63,14 +64,20 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
            }
 | 
			
		||||
 | 
			
		||||
            args.From = fromName;
 | 
			
		||||
            //args.
 | 
			
		||||
            args.TargetUUID = targetID;
 | 
			
		||||
 | 
			
		||||
            if (broadcast)
 | 
			
		||||
                EventManager.TriggerOnChatBroadcast(this, args);
 | 
			
		||||
            else
 | 
			
		||||
                EventManager.TriggerOnChatFromWorld(this, args);
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        protected void SimChat(byte[] message, ChatTypeEnum type, int channel, Vector3 fromPos, string fromName,
 | 
			
		||||
                               UUID fromID, bool fromAgent, bool broadcast)
 | 
			
		||||
        {
 | 
			
		||||
            SimChat(message, type, channel, fromPos, fromName, fromID, UUID.Zero, fromAgent, broadcast);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        ///
 | 
			
		||||
        /// </summary>
 | 
			
		||||
| 
						 | 
				
			
			@ -108,6 +115,19 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
        {
 | 
			
		||||
            SimChat(message, type, channel, fromPos, fromName, fromID, fromAgent, true);
 | 
			
		||||
        }
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        ///
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <param name="message"></param>
 | 
			
		||||
        /// <param name="type"></param>
 | 
			
		||||
        /// <param name="fromPos"></param>
 | 
			
		||||
        /// <param name="fromName"></param>
 | 
			
		||||
        /// <param name="fromAgentID"></param>
 | 
			
		||||
        /// <param name="targetID"></param>
 | 
			
		||||
        public void SimChatToAgent(UUID targetID, byte[] message, Vector3 fromPos, string fromName, UUID fromID, bool fromAgent)
 | 
			
		||||
        {
 | 
			
		||||
            SimChat(message, ChatTypeEnum.Say, 0, fromPos, fromName, fromID, targetID, fromAgent, false);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Invoked when the client requests a prim.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -684,8 +684,8 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
                //Animation states
 | 
			
		||||
                m_useFlySlow = startupConfig.GetBoolean("enableflyslow", false);
 | 
			
		||||
 | 
			
		||||
                PhysicalPrims = startupConfig.GetBoolean("physical_prim", true);
 | 
			
		||||
                CollidablePrims = startupConfig.GetBoolean("collidable_prim", true);
 | 
			
		||||
                PhysicalPrims = startupConfig.GetBoolean("physical_prim", PhysicalPrims);
 | 
			
		||||
                CollidablePrims = startupConfig.GetBoolean("collidable_prim", CollidablePrims);
 | 
			
		||||
 | 
			
		||||
                m_maxNonphys = startupConfig.GetFloat("NonphysicalPrimMax", m_maxNonphys);
 | 
			
		||||
                if (RegionInfo.NonphysPrimMax > 0)
 | 
			
		||||
| 
						 | 
				
			
			@ -800,13 +800,11 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
            StatsReporter.OnStatsIncorrect += m_sceneGraph.RecalculateStats;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Mock constructor for scene group persistency unit tests.
 | 
			
		||||
        /// SceneObjectGroup RegionId property is delegated to Scene.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <param name="regInfo"></param>
 | 
			
		||||
        public Scene(RegionInfo regInfo)
 | 
			
		||||
        {
 | 
			
		||||
            PhysicalPrims = true;
 | 
			
		||||
            CollidablePrims = true;
 | 
			
		||||
 | 
			
		||||
            BordersLocked = true;
 | 
			
		||||
            Border northBorder = new Border();
 | 
			
		||||
            northBorder.BorderLine = new Vector3(float.MinValue, float.MaxValue, (int)Constants.RegionSize);  //<---
 | 
			
		||||
| 
						 | 
				
			
			@ -833,8 +831,6 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
            m_eventManager = new EventManager();
 | 
			
		||||
 | 
			
		||||
            m_permissions = new ScenePermissions(this);
 | 
			
		||||
 | 
			
		||||
//            m_lastUpdate = Util.EnvironmentTickCount();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        #endregion
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -91,6 +91,9 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
        /// </summary>
 | 
			
		||||
        protected internal Dictionary<uint, SceneObjectGroup> SceneObjectGroupsByLocalPartID = new Dictionary<uint, SceneObjectGroup>();        
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Lock to prevent object group update, linking and delinking operations from running concurrently.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        private Object m_updateLock = new Object();
 | 
			
		||||
 | 
			
		||||
        #endregion
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1962,6 +1962,10 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
        /// <summary>
 | 
			
		||||
        /// Link the prims in a given group to this group
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <remarks>
 | 
			
		||||
        /// Do not call this method directly - use Scene.LinkObjects() instead to avoid races between threads.
 | 
			
		||||
        /// FIXME: There are places where scripts call these methods directly without locking.  This is a potential race condition.
 | 
			
		||||
        /// </remarks>
 | 
			
		||||
        /// <param name="objectGroup">The group of prims which should be linked to this group</param>
 | 
			
		||||
        public void LinkToGroup(SceneObjectGroup objectGroup)
 | 
			
		||||
        {
 | 
			
		||||
| 
						 | 
				
			
			@ -2006,6 +2010,7 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
                linkPart.CreateSelected = true;
 | 
			
		||||
 | 
			
		||||
                linkPart.LinkNum = linkNum++;
 | 
			
		||||
                linkPart.UpdatePrimFlags(UsesPhysics, IsTemporary, IsPhantom, IsVolumeDetect);
 | 
			
		||||
 | 
			
		||||
                SceneObjectPart[] ogParts = objectGroup.Parts;
 | 
			
		||||
                Array.Sort(ogParts, delegate(SceneObjectPart a, SceneObjectPart b)
 | 
			
		||||
| 
						 | 
				
			
			@ -2045,6 +2050,11 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
        /// Delink the given prim from this group.  The delinked prim is established as
 | 
			
		||||
        /// an independent SceneObjectGroup.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <remarks>
 | 
			
		||||
        /// FIXME: This method should not be called directly since it bypasses update locking, allowing a potential race
 | 
			
		||||
        /// condition.  But currently there is no
 | 
			
		||||
        /// alternative method that does take a lonk to delink a single prim.
 | 
			
		||||
        /// </remarks>
 | 
			
		||||
        /// <param name="partID"></param>
 | 
			
		||||
        /// <returns>The object group of the newly delinked prim.  Null if part could not be found</returns>
 | 
			
		||||
        public SceneObjectGroup DelinkFromGroup(uint partID)
 | 
			
		||||
| 
						 | 
				
			
			@ -2056,6 +2066,11 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
        /// Delink the given prim from this group.  The delinked prim is established as
 | 
			
		||||
        /// an independent SceneObjectGroup.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <remarks>
 | 
			
		||||
        /// FIXME: This method should not be called directly since it bypasses update locking, allowing a potential race
 | 
			
		||||
        /// condition.  But currently there is no
 | 
			
		||||
        /// alternative method that does take a lonk to delink a single prim.
 | 
			
		||||
        /// </remarks>
 | 
			
		||||
        /// <param name="partID"></param>
 | 
			
		||||
        /// <param name="sendEvents"></param>
 | 
			
		||||
        /// <returns>The object group of the newly delinked prim.  Null if part could not be found</returns>
 | 
			
		||||
| 
						 | 
				
			
			@ -2081,6 +2096,11 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
        /// Delink the given prim from this group.  The delinked prim is established as
 | 
			
		||||
        /// an independent SceneObjectGroup.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <remarks>
 | 
			
		||||
        /// FIXME: This method should not be called directly since it bypasses update locking, allowing a potential race
 | 
			
		||||
        /// condition.  But currently there is no
 | 
			
		||||
        /// alternative method that does take a lonk to delink a single prim.
 | 
			
		||||
        /// </remarks>
 | 
			
		||||
        /// <param name="partID"></param>
 | 
			
		||||
        /// <param name="sendEvents"></param>
 | 
			
		||||
        /// <returns>The object group of the newly delinked prim.</returns>
 | 
			
		||||
| 
						 | 
				
			
			@ -2201,6 +2221,8 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
            oldRot = part.RotationOffset;
 | 
			
		||||
            Quaternion newRot = Quaternion.Inverse(parentRot) * oldRot;
 | 
			
		||||
            part.RotationOffset = newRot;
 | 
			
		||||
 | 
			
		||||
            part.UpdatePrimFlags(UsesPhysics, IsTemporary, IsPhantom, IsVolumeDetect);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1706,6 +1706,9 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
        /// <param name="isNew"></param>
 | 
			
		||||
        public void DoPhysicsPropertyUpdate(bool UsePhysics, bool isNew)
 | 
			
		||||
        {
 | 
			
		||||
            if (ParentGroup.Scene == null)
 | 
			
		||||
                return;
 | 
			
		||||
 | 
			
		||||
            if (!ParentGroup.Scene.PhysicalPrims && UsePhysics)
 | 
			
		||||
                return;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -4161,7 +4164,7 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
            // For now, we use the NINJA naming scheme for identifying joints.
 | 
			
		||||
            // In the future, we can support other joint specification schemes such as a 
 | 
			
		||||
            // custom checkbox in the viewer GUI.
 | 
			
		||||
            if (ParentGroup.Scene.PhysicsScene.SupportsNINJAJoints)
 | 
			
		||||
            if (ParentGroup.Scene != null && ParentGroup.Scene.PhysicsScene.SupportsNINJAJoints)
 | 
			
		||||
            {
 | 
			
		||||
                string hingeString = "hingejoint";
 | 
			
		||||
                return (Name.Length >= hingeString.Length && Name.Substring(0, hingeString.Length) == hingeString);
 | 
			
		||||
| 
						 | 
				
			
			@ -4177,7 +4180,7 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
            // For now, we use the NINJA naming scheme for identifying joints.
 | 
			
		||||
            // In the future, we can support other joint specification schemes such as a 
 | 
			
		||||
            // custom checkbox in the viewer GUI.
 | 
			
		||||
            if (ParentGroup.Scene.PhysicsScene.SupportsNINJAJoints)
 | 
			
		||||
            if (ParentGroup.Scene != null && ParentGroup.Scene.PhysicsScene.SupportsNINJAJoints)
 | 
			
		||||
            {
 | 
			
		||||
                string ballString = "balljoint";
 | 
			
		||||
                return (Name.Length >= ballString.Length && Name.Substring(0, ballString.Length) == ballString);
 | 
			
		||||
| 
						 | 
				
			
			@ -4193,7 +4196,7 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
            // For now, we use the NINJA naming scheme for identifying joints.
 | 
			
		||||
            // In the future, we can support other joint specification schemes such as a 
 | 
			
		||||
            // custom checkbox in the viewer GUI.
 | 
			
		||||
            if (ParentGroup.Scene.PhysicsScene.SupportsNINJAJoints)
 | 
			
		||||
            if (ParentGroup.Scene != null && ParentGroup.Scene.PhysicsScene.SupportsNINJAJoints)
 | 
			
		||||
            {
 | 
			
		||||
                return IsHingeJoint() || IsBallJoint();
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -4287,7 +4290,10 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
                AddFlag(PrimFlags.Phantom);
 | 
			
		||||
 | 
			
		||||
                if (PhysActor != null)
 | 
			
		||||
                {
 | 
			
		||||
                    RemoveFromPhysics();
 | 
			
		||||
                    pa = null;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            else // Not phantom
 | 
			
		||||
            {
 | 
			
		||||
| 
						 | 
				
			
			@ -4353,7 +4359,7 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
                {
 | 
			
		||||
                    pa.SetVolumeDetect(1);
 | 
			
		||||
                    AddFlag(PrimFlags.Phantom); // We set this flag also if VD is active
 | 
			
		||||
                    this.VolumeDetectActive = true;
 | 
			
		||||
                    VolumeDetectActive = true;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
| 
						 | 
				
			
			@ -4361,9 +4367,9 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
                // Remove VolumeDetect in any case. Note, it's safe to call SetVolumeDetect as often as you like
 | 
			
		||||
                // (mumbles, well, at least if you have infinte CPU powers :-))
 | 
			
		||||
                if (pa != null)
 | 
			
		||||
                    PhysActor.SetVolumeDetect(0);
 | 
			
		||||
                    pa.SetVolumeDetect(0);
 | 
			
		||||
 | 
			
		||||
                this.VolumeDetectActive = false;
 | 
			
		||||
                VolumeDetectActive = false;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (SetTemporary)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -990,23 +990,24 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
        /// <param name="pos"></param>
 | 
			
		||||
        public void Teleport(Vector3 pos)
 | 
			
		||||
        {
 | 
			
		||||
            bool isFlying = Flying;
 | 
			
		||||
            RemoveFromPhysicalScene();
 | 
			
		||||
            Velocity = Vector3.Zero;
 | 
			
		||||
            CheckLandingPoint(ref pos);
 | 
			
		||||
            AbsolutePosition = pos;
 | 
			
		||||
            AddToPhysicalScene(isFlying);
 | 
			
		||||
 | 
			
		||||
            SendTerseUpdateToAllClients();
 | 
			
		||||
            TeleportWithMomentum(pos, null);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void TeleportWithMomentum(Vector3 pos)
 | 
			
		||||
        public void TeleportWithMomentum(Vector3 pos, Vector3? v)
 | 
			
		||||
        {
 | 
			
		||||
            bool isFlying = Flying;
 | 
			
		||||
            Vector3 vel = Velocity;
 | 
			
		||||
            RemoveFromPhysicalScene();
 | 
			
		||||
            CheckLandingPoint(ref pos);
 | 
			
		||||
            AbsolutePosition = pos;
 | 
			
		||||
            AddToPhysicalScene(isFlying);
 | 
			
		||||
            if (PhysicsActor != null)
 | 
			
		||||
            {
 | 
			
		||||
                if (v.HasValue)
 | 
			
		||||
                    PhysicsActor.SetMomentum((Vector3)v);
 | 
			
		||||
                else
 | 
			
		||||
                    PhysicsActor.SetMomentum(vel);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            SendTerseUpdateToAllClients();
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -26,6 +26,7 @@
 | 
			
		|||
 */
 | 
			
		||||
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Reflection;
 | 
			
		||||
using NUnit.Framework;
 | 
			
		||||
using OpenMetaverse;
 | 
			
		||||
| 
						 | 
				
			
			@ -43,24 +44,141 @@ namespace OpenSim.Region.Framework.Scenes.Tests
 | 
			
		|||
    [TestFixture]
 | 
			
		||||
    public class SceneObjectStatusTests
 | 
			
		||||
    {
 | 
			
		||||
        private TestScene m_scene;
 | 
			
		||||
        private UUID m_ownerId = TestHelpers.ParseTail(0x1);
 | 
			
		||||
        private SceneObjectGroup m_so1;
 | 
			
		||||
        private SceneObjectGroup m_so2;
 | 
			
		||||
 | 
			
		||||
        [SetUp]
 | 
			
		||||
        public void Init()
 | 
			
		||||
        {
 | 
			
		||||
            m_scene = SceneHelpers.SetupScene();
 | 
			
		||||
            m_so1 = SceneHelpers.CreateSceneObject(1, m_ownerId, "so1", 0x10);
 | 
			
		||||
            m_so2 = SceneHelpers.CreateSceneObject(1, m_ownerId, "so2", 0x20);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Test]
 | 
			
		||||
        public void TestSetPhantom()
 | 
			
		||||
        public void TestSetPhantomSinglePrim()
 | 
			
		||||
        {
 | 
			
		||||
            TestHelpers.InMethod();
 | 
			
		||||
 | 
			
		||||
//            Scene scene = SceneSetupHelpers.SetupScene();
 | 
			
		||||
            SceneObjectGroup so = SceneHelpers.CreateSceneObject(1, UUID.Zero);
 | 
			
		||||
            SceneObjectPart rootPart = so.RootPart;
 | 
			
		||||
            m_scene.AddSceneObject(m_so1);
 | 
			
		||||
 | 
			
		||||
            SceneObjectPart rootPart = m_so1.RootPart;
 | 
			
		||||
            Assert.That(rootPart.Flags, Is.EqualTo(PrimFlags.None));
 | 
			
		||||
 | 
			
		||||
            so.ScriptSetPhantomStatus(true);
 | 
			
		||||
            m_so1.ScriptSetPhantomStatus(true);
 | 
			
		||||
 | 
			
		||||
//            Console.WriteLine("so.RootPart.Flags [{0}]", so.RootPart.Flags);
 | 
			
		||||
            Assert.That(rootPart.Flags, Is.EqualTo(PrimFlags.Phantom));
 | 
			
		||||
 | 
			
		||||
            so.ScriptSetPhantomStatus(false);
 | 
			
		||||
            m_so1.ScriptSetPhantomStatus(false);
 | 
			
		||||
 | 
			
		||||
            Assert.That(rootPart.Flags, Is.EqualTo(PrimFlags.None));            
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Test]
 | 
			
		||||
        public void TestSetPhysicsSinglePrim()
 | 
			
		||||
        {
 | 
			
		||||
            TestHelpers.InMethod();
 | 
			
		||||
 | 
			
		||||
            m_scene.AddSceneObject(m_so1);
 | 
			
		||||
 | 
			
		||||
            SceneObjectPart rootPart = m_so1.RootPart;
 | 
			
		||||
            Assert.That(rootPart.Flags, Is.EqualTo(PrimFlags.None));
 | 
			
		||||
 | 
			
		||||
            m_so1.ScriptSetPhysicsStatus(true);
 | 
			
		||||
 | 
			
		||||
//            Console.WriteLine("so.RootPart.Flags [{0}]", so.RootPart.Flags);
 | 
			
		||||
            Assert.That(rootPart.Flags, Is.EqualTo(PrimFlags.Physics));
 | 
			
		||||
 | 
			
		||||
            m_so1.ScriptSetPhysicsStatus(false);
 | 
			
		||||
 | 
			
		||||
            Assert.That(rootPart.Flags, Is.EqualTo(PrimFlags.None));
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        [Test]
 | 
			
		||||
        public void TestSetPhysicsLinkset()
 | 
			
		||||
        {
 | 
			
		||||
            TestHelpers.InMethod();
 | 
			
		||||
 | 
			
		||||
            m_scene.AddSceneObject(m_so1);
 | 
			
		||||
            m_scene.AddSceneObject(m_so2);
 | 
			
		||||
 | 
			
		||||
            m_scene.LinkObjects(m_ownerId, m_so1.LocalId, new List<uint>() { m_so2.LocalId });
 | 
			
		||||
 | 
			
		||||
            m_so1.ScriptSetPhysicsStatus(true);
 | 
			
		||||
 | 
			
		||||
            Assert.That(m_so1.RootPart.Flags, Is.EqualTo(PrimFlags.Physics));
 | 
			
		||||
            Assert.That(m_so1.Parts[1].Flags, Is.EqualTo(PrimFlags.Physics));
 | 
			
		||||
 | 
			
		||||
            m_so1.ScriptSetPhysicsStatus(false);
 | 
			
		||||
 | 
			
		||||
            Assert.That(m_so1.RootPart.Flags, Is.EqualTo(PrimFlags.None));
 | 
			
		||||
            Assert.That(m_so1.Parts[1].Flags, Is.EqualTo(PrimFlags.None));
 | 
			
		||||
 | 
			
		||||
            m_so1.ScriptSetPhysicsStatus(true);
 | 
			
		||||
 | 
			
		||||
            Assert.That(m_so1.RootPart.Flags, Is.EqualTo(PrimFlags.Physics));
 | 
			
		||||
            Assert.That(m_so1.Parts[1].Flags, Is.EqualTo(PrimFlags.Physics));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Test that linking results in the correct physical status for all linkees.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        [Test]
 | 
			
		||||
        public void TestLinkPhysicsBothPhysical()
 | 
			
		||||
        {
 | 
			
		||||
            TestHelpers.InMethod();
 | 
			
		||||
 | 
			
		||||
            m_scene.AddSceneObject(m_so1);
 | 
			
		||||
            m_scene.AddSceneObject(m_so2);
 | 
			
		||||
 | 
			
		||||
            m_so1.ScriptSetPhysicsStatus(true);
 | 
			
		||||
            m_so2.ScriptSetPhysicsStatus(true);
 | 
			
		||||
 | 
			
		||||
            m_scene.LinkObjects(m_ownerId, m_so1.LocalId, new List<uint>() { m_so2.LocalId });
 | 
			
		||||
 | 
			
		||||
            Assert.That(m_so1.RootPart.Flags, Is.EqualTo(PrimFlags.Physics));
 | 
			
		||||
            Assert.That(m_so1.Parts[1].Flags, Is.EqualTo(PrimFlags.Physics));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Test that linking results in the correct physical status for all linkees.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        [Test]
 | 
			
		||||
        public void TestLinkPhysicsRootPhysicalOnly()
 | 
			
		||||
        {
 | 
			
		||||
            TestHelpers.InMethod();
 | 
			
		||||
 | 
			
		||||
            m_scene.AddSceneObject(m_so1);
 | 
			
		||||
            m_scene.AddSceneObject(m_so2);
 | 
			
		||||
 | 
			
		||||
            m_so1.ScriptSetPhysicsStatus(true);
 | 
			
		||||
 | 
			
		||||
            m_scene.LinkObjects(m_ownerId, m_so1.LocalId, new List<uint>() { m_so2.LocalId });
 | 
			
		||||
 | 
			
		||||
            Assert.That(m_so1.RootPart.Flags, Is.EqualTo(PrimFlags.Physics));
 | 
			
		||||
            Assert.That(m_so1.Parts[1].Flags, Is.EqualTo(PrimFlags.Physics));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Test that linking results in the correct physical status for all linkees.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        [Test]
 | 
			
		||||
        public void TestLinkPhysicsChildPhysicalOnly()
 | 
			
		||||
        {
 | 
			
		||||
            TestHelpers.InMethod();
 | 
			
		||||
 | 
			
		||||
            m_scene.AddSceneObject(m_so1);
 | 
			
		||||
            m_scene.AddSceneObject(m_so2);
 | 
			
		||||
 | 
			
		||||
            m_so2.ScriptSetPhysicsStatus(true);
 | 
			
		||||
 | 
			
		||||
            m_scene.LinkObjects(m_ownerId, m_so1.LocalId, new List<uint>() { m_so2.LocalId });
 | 
			
		||||
 | 
			
		||||
            Assert.That(m_so1.RootPart.Flags, Is.EqualTo(PrimFlags.None));
 | 
			
		||||
            Assert.That(m_so1.Parts[1].Flags, Is.EqualTo(PrimFlags.None));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -33,6 +33,7 @@ using OpenMetaverse;
 | 
			
		|||
using OpenSim.Framework;
 | 
			
		||||
using OpenSim.Framework.Communications;
 | 
			
		||||
using OpenSim.Framework.Servers;
 | 
			
		||||
using OpenSim.Region.CoreModules.Framework.EntityTransfer;
 | 
			
		||||
using OpenSim.Region.Framework.Interfaces;
 | 
			
		||||
using OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation;
 | 
			
		||||
using OpenSim.Tests.Common;
 | 
			
		||||
| 
						 | 
				
			
			@ -47,6 +48,41 @@ namespace OpenSim.Region.Framework.Scenes.Tests
 | 
			
		|||
    [TestFixture]
 | 
			
		||||
    public class ScenePresenceTeleportTests
 | 
			
		||||
    {
 | 
			
		||||
        [Test]
 | 
			
		||||
        public void TestSameRegionTeleport()
 | 
			
		||||
        {
 | 
			
		||||
            TestHelpers.InMethod();
 | 
			
		||||
//            log4net.Config.XmlConfigurator.Configure();
 | 
			
		||||
 | 
			
		||||
            EntityTransferModule etm = new EntityTransferModule();
 | 
			
		||||
 | 
			
		||||
            IConfigSource config = new IniConfigSource();
 | 
			
		||||
            config.AddConfig("Modules");
 | 
			
		||||
            // Not strictly necessary since FriendsModule assumes it is the default (!)
 | 
			
		||||
            config.Configs["Modules"].Set("EntityTransferModule", etm.Name);
 | 
			
		||||
 | 
			
		||||
            TestScene scene = SceneHelpers.SetupScene("sceneA", TestHelpers.ParseTail(0x100), 1000, 1000);
 | 
			
		||||
            SceneHelpers.SetupSceneModules(scene, config, etm);
 | 
			
		||||
 | 
			
		||||
            Vector3 teleportPosition = new Vector3(10, 11, 12);
 | 
			
		||||
            Vector3 teleportLookAt = new Vector3(20, 21, 22);
 | 
			
		||||
 | 
			
		||||
            ScenePresence sp = SceneHelpers.AddScenePresence(scene, TestHelpers.ParseTail(0x1));
 | 
			
		||||
            sp.AbsolutePosition = new Vector3(30, 31, 32);
 | 
			
		||||
            scene.RequestTeleportLocation(
 | 
			
		||||
                sp.ControllingClient,
 | 
			
		||||
                scene.RegionInfo.RegionHandle,
 | 
			
		||||
                teleportPosition,
 | 
			
		||||
                teleportLookAt,
 | 
			
		||||
                (uint)TeleportFlags.ViaLocation);
 | 
			
		||||
 | 
			
		||||
            Assert.That(sp.AbsolutePosition, Is.EqualTo(teleportPosition));
 | 
			
		||||
 | 
			
		||||
            // Lookat is sent to the client only - sp.Lookat does not yield the same thing (calculation from camera
 | 
			
		||||
            // position instead).
 | 
			
		||||
//            Assert.That(sp.Lookat, Is.EqualTo(teleportLookAt));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Test a teleport between two regions that are not neighbours and do not share any neighbours in common.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -58,6 +58,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.Friends
 | 
			
		|||
        private Scene m_scene;
 | 
			
		||||
        private IFriendsModule m_friendsModule;
 | 
			
		||||
        private IUserManagement m_userManagementModule;
 | 
			
		||||
        private IPresenceService m_presenceService;
 | 
			
		||||
 | 
			
		||||
//        private IAvatarFactoryModule m_avatarFactory;
 | 
			
		||||
        
 | 
			
		||||
| 
						 | 
				
			
			@ -99,8 +100,9 @@ namespace OpenSim.Region.OptionalModules.Avatar.Friends
 | 
			
		|||
 | 
			
		||||
            m_friendsModule = m_scene.RequestModuleInterface<IFriendsModule>();
 | 
			
		||||
            m_userManagementModule = m_scene.RequestModuleInterface<IUserManagement>();
 | 
			
		||||
            m_presenceService = m_scene.RequestModuleInterface<IPresenceService>();
 | 
			
		||||
 | 
			
		||||
            if (m_friendsModule != null && m_userManagementModule != null)
 | 
			
		||||
            if (m_friendsModule != null && m_userManagementModule != null && m_presenceService != null)
 | 
			
		||||
            {
 | 
			
		||||
                m_scene.AddCommand(
 | 
			
		||||
                    "Friends", this, "friends show",
 | 
			
		||||
| 
						 | 
				
			
			@ -162,7 +164,8 @@ namespace OpenSim.Region.OptionalModules.Avatar.Friends
 | 
			
		|||
 | 
			
		||||
            MainConsole.Instance.OutputFormat("Friends for {0} {1} {2}:", firstName, lastName, userId);
 | 
			
		||||
 | 
			
		||||
            MainConsole.Instance.OutputFormat("UUID, Name, MyFlags, TheirFlags");
 | 
			
		||||
            MainConsole.Instance.OutputFormat(
 | 
			
		||||
                "{0,-36}  {1,-36}  {2,-7}  {3,7}  {4,10}", "UUID", "Name", "Status", "MyFlags", "TheirFlags");
 | 
			
		||||
 | 
			
		||||
            foreach (FriendInfo friend in friends)
 | 
			
		||||
            {
 | 
			
		||||
| 
						 | 
				
			
			@ -175,14 +178,22 @@ namespace OpenSim.Region.OptionalModules.Avatar.Friends
 | 
			
		|||
 | 
			
		||||
                UUID friendId;
 | 
			
		||||
                string friendName;
 | 
			
		||||
                string onlineText;
 | 
			
		||||
 | 
			
		||||
                if (UUID.TryParse(friend.Friend, out friendId))
 | 
			
		||||
                    friendName = m_userManagementModule.GetUserName(friendId);
 | 
			
		||||
                else
 | 
			
		||||
                    friendName = friend.Friend;
 | 
			
		||||
 | 
			
		||||
                OpenSim.Services.Interfaces.PresenceInfo[] pi = m_presenceService.GetAgents(new string[] { friend.Friend });
 | 
			
		||||
                if (pi.Length > 0)
 | 
			
		||||
                    onlineText = "online";
 | 
			
		||||
                else
 | 
			
		||||
                    onlineText = "offline";
 | 
			
		||||
 | 
			
		||||
                MainConsole.Instance.OutputFormat(
 | 
			
		||||
                    "{0} {1} {2} {3}", friend.Friend, friendName, friend.MyFlags, friend.TheirFlags);
 | 
			
		||||
                    "{0,-36}  {1,-36}  {2,-7}  {3,-7}  {4,-10}",
 | 
			
		||||
                    friend.Friend, friendName, onlineText, friend.MyFlags, friend.TheirFlags);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -68,7 +68,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
 | 
			
		|||
        public Vector3 WorldPosition
 | 
			
		||||
        {
 | 
			
		||||
            get { return GetSP().AbsolutePosition; }
 | 
			
		||||
            set { GetSP().TeleportWithMomentum(value); }
 | 
			
		||||
            set { GetSP().Teleport(value); }
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        public bool IsChildAgent
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -157,7 +157,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC
 | 
			
		|||
 | 
			
		||||
                    sp.CompleteMovement(npcAvatar, false);
 | 
			
		||||
                    m_avatars.Add(npcAvatar.AgentId, npcAvatar);
 | 
			
		||||
                    m_log.DebugFormat("[NPC MODULE]: Created NPC with id {0}", npcAvatar.AgentId);
 | 
			
		||||
                    m_log.DebugFormat("[NPC MODULE]: Created NPC {0} {1}", npcAvatar.AgentId, sp.Name);
 | 
			
		||||
 | 
			
		||||
                    return npcAvatar.AgentId;
 | 
			
		||||
                }
 | 
			
		||||
| 
						 | 
				
			
			@ -299,7 +299,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC
 | 
			
		|||
                    scene.RemoveClient(agentID, false);
 | 
			
		||||
                    m_avatars.Remove(agentID);
 | 
			
		||||
 | 
			
		||||
//                    m_log.DebugFormat("[NPC MODULE]: Removed {0} {1}", agentID, av.Name);
 | 
			
		||||
                    m_log.DebugFormat("[NPC MODULE]: Removed NPC {0} {1}", agentID, av.Name);
 | 
			
		||||
                    return true;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -36,13 +36,7 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin
 | 
			
		|||
{
 | 
			
		||||
    public class BasicActor : PhysicsActor
 | 
			
		||||
    {
 | 
			
		||||
        private Vector3 _position;
 | 
			
		||||
        private Vector3 _velocity;
 | 
			
		||||
        private Vector3 _acceleration;
 | 
			
		||||
        private Vector3 _size;
 | 
			
		||||
        private Vector3 m_rotationalVelocity;
 | 
			
		||||
        private bool flying;
 | 
			
		||||
        private bool iscolliding;
 | 
			
		||||
 | 
			
		||||
        public BasicActor(Vector3 size)
 | 
			
		||||
        {
 | 
			
		||||
| 
						 | 
				
			
			@ -55,11 +49,7 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin
 | 
			
		|||
            set { return; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override Vector3 RotationalVelocity
 | 
			
		||||
        {
 | 
			
		||||
            get { return m_rotationalVelocity; }
 | 
			
		||||
            set { m_rotationalVelocity = value; }
 | 
			
		||||
        }
 | 
			
		||||
        public override Vector3 RotationalVelocity { get; set; }
 | 
			
		||||
 | 
			
		||||
        public override bool SetAlwaysRun
 | 
			
		||||
        {
 | 
			
		||||
| 
						 | 
				
			
			@ -105,17 +95,9 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin
 | 
			
		|||
            set { return; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override bool Flying
 | 
			
		||||
        {
 | 
			
		||||
            get { return flying; }
 | 
			
		||||
            set { flying = value; }
 | 
			
		||||
        }
 | 
			
		||||
        public override bool Flying { get; set; }
 | 
			
		||||
 | 
			
		||||
        public override bool IsColliding
 | 
			
		||||
        {
 | 
			
		||||
            get { return iscolliding; }
 | 
			
		||||
            set { iscolliding = value; }
 | 
			
		||||
        }
 | 
			
		||||
        public override bool IsColliding { get; set; }
 | 
			
		||||
 | 
			
		||||
        public override bool CollidingGround
 | 
			
		||||
        {
 | 
			
		||||
| 
						 | 
				
			
			@ -134,11 +116,7 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin
 | 
			
		|||
            get { return false; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override Vector3 Position
 | 
			
		||||
        {
 | 
			
		||||
            get { return _position; }
 | 
			
		||||
            set { _position = value; }
 | 
			
		||||
        }
 | 
			
		||||
        public override Vector3 Position { get; set; }
 | 
			
		||||
 | 
			
		||||
        public override Vector3 Size
 | 
			
		||||
        {
 | 
			
		||||
| 
						 | 
				
			
			@ -206,11 +184,7 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin
 | 
			
		|||
            get { return Vector3.Zero; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override Vector3 Velocity
 | 
			
		||||
        {
 | 
			
		||||
            get { return _velocity; }
 | 
			
		||||
            set { _velocity = value; }
 | 
			
		||||
        }
 | 
			
		||||
        public override Vector3 Velocity { get; set; }
 | 
			
		||||
 | 
			
		||||
        public override Vector3 Torque
 | 
			
		||||
        {
 | 
			
		||||
| 
						 | 
				
			
			@ -230,11 +204,7 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin
 | 
			
		|||
            set { }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override Vector3 Acceleration
 | 
			
		||||
        {
 | 
			
		||||
            get { return _acceleration; }
 | 
			
		||||
            set { _acceleration = value; }
 | 
			
		||||
        }
 | 
			
		||||
        public override Vector3 Acceleration { get; set; }
 | 
			
		||||
 | 
			
		||||
        public override bool Kinematic
 | 
			
		||||
        {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,314 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright (c) Contributors, http://opensimulator.org/
 | 
			
		||||
 * See CONTRIBUTORS.TXT for a full list of copyright holders.
 | 
			
		||||
 *
 | 
			
		||||
 * Redistribution and use in source and binary forms, with or without
 | 
			
		||||
 * modification, are permitted provided that the following conditions are met:
 | 
			
		||||
 *     * Redistributions of source code must retain the above copyright
 | 
			
		||||
 *       notice, this list of conditions and the following disclaimer.
 | 
			
		||||
 *     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
 *       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
 *       documentation and/or other materials provided with the distribution.
 | 
			
		||||
 *     * Neither the name of the OpenSimulator Project nor the
 | 
			
		||||
 *       names of its contributors may be used to endorse or promote products
 | 
			
		||||
 *       derived from this software without specific prior written permission.
 | 
			
		||||
 *
 | 
			
		||||
 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
 | 
			
		||||
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
 | 
			
		||||
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 | 
			
		||||
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using Nini.Config;
 | 
			
		||||
using OpenMetaverse;
 | 
			
		||||
using OpenSim.Framework;
 | 
			
		||||
using OpenSim.Region.Physics.Manager;
 | 
			
		||||
 | 
			
		||||
namespace OpenSim.Region.Physics.BasicPhysicsPlugin
 | 
			
		||||
{
 | 
			
		||||
    public class BasicPhysicsPrim : PhysicsActor
 | 
			
		||||
    {
 | 
			
		||||
        private Vector3 _size;
 | 
			
		||||
        private PrimitiveBaseShape _shape;
 | 
			
		||||
 | 
			
		||||
        public BasicPhysicsPrim(
 | 
			
		||||
            string name, uint localId, Vector3 position, Vector3 size, Quaternion orientation, PrimitiveBaseShape shape)
 | 
			
		||||
        {
 | 
			
		||||
            Name = name;
 | 
			
		||||
            LocalID = localId;
 | 
			
		||||
            Position = position;
 | 
			
		||||
            Size = size;
 | 
			
		||||
            Orientation = orientation;
 | 
			
		||||
            Shape = shape;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override int PhysicsActorType
 | 
			
		||||
        {
 | 
			
		||||
            get { return (int) ActorTypes.Agent; }
 | 
			
		||||
            set { return; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override Vector3 RotationalVelocity { get; set; }
 | 
			
		||||
 | 
			
		||||
        public override bool SetAlwaysRun
 | 
			
		||||
        {
 | 
			
		||||
            get { return false; }
 | 
			
		||||
            set { return; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override uint LocalID
 | 
			
		||||
        {
 | 
			
		||||
            set { return; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override bool Grabbed
 | 
			
		||||
        {
 | 
			
		||||
            set { return; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override bool Selected
 | 
			
		||||
        {
 | 
			
		||||
            set { return; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override float Buoyancy
 | 
			
		||||
        {
 | 
			
		||||
            get { return 0f; }
 | 
			
		||||
            set { return; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override bool FloatOnWater
 | 
			
		||||
        {
 | 
			
		||||
            set { return; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override bool IsPhysical
 | 
			
		||||
        {
 | 
			
		||||
            get { return false; }
 | 
			
		||||
            set { return; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override bool ThrottleUpdates
 | 
			
		||||
        {
 | 
			
		||||
            get { return false; }
 | 
			
		||||
            set { return; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override bool Flying { get; set; }
 | 
			
		||||
 | 
			
		||||
        public override bool IsColliding { get; set; }
 | 
			
		||||
 | 
			
		||||
        public override bool CollidingGround
 | 
			
		||||
        {
 | 
			
		||||
            get { return false; }
 | 
			
		||||
            set { return; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override bool CollidingObj
 | 
			
		||||
        {
 | 
			
		||||
            get { return false; }
 | 
			
		||||
            set { return; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override bool Stopped
 | 
			
		||||
        {
 | 
			
		||||
            get { return false; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override Vector3 Position { get; set; }
 | 
			
		||||
 | 
			
		||||
        public override Vector3 Size
 | 
			
		||||
        {
 | 
			
		||||
            get { return _size; }
 | 
			
		||||
            set {
 | 
			
		||||
                  _size = value;
 | 
			
		||||
                  _size.Z = _size.Z / 2.0f;
 | 
			
		||||
                }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override PrimitiveBaseShape Shape
 | 
			
		||||
        {
 | 
			
		||||
            set { _shape = value; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override float Mass
 | 
			
		||||
        {
 | 
			
		||||
            get { return 0f; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override Vector3 Force
 | 
			
		||||
        {
 | 
			
		||||
            get { return Vector3.Zero; }
 | 
			
		||||
            set { return; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override int VehicleType
 | 
			
		||||
        {
 | 
			
		||||
            get { return 0; }
 | 
			
		||||
            set { return; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override void VehicleFloatParam(int param, float value)
 | 
			
		||||
        {
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override void VehicleVectorParam(int param, Vector3 value)
 | 
			
		||||
        {
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override void VehicleRotationParam(int param, Quaternion rotation)
 | 
			
		||||
        {
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override void VehicleFlags(int param, bool remove)
 | 
			
		||||
        {
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override void SetVolumeDetect(int param)
 | 
			
		||||
        {
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override Vector3 CenterOfMass
 | 
			
		||||
        {
 | 
			
		||||
            get { return Vector3.Zero; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override Vector3 GeometricCenter
 | 
			
		||||
        {
 | 
			
		||||
            get { return Vector3.Zero; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override Vector3 Velocity { get; set; }
 | 
			
		||||
 | 
			
		||||
        public override Vector3 Torque
 | 
			
		||||
        {
 | 
			
		||||
            get { return Vector3.Zero; }
 | 
			
		||||
            set { return; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override float CollisionScore
 | 
			
		||||
        {
 | 
			
		||||
            get { return 0f; }
 | 
			
		||||
            set { }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override Quaternion Orientation { get; set; }
 | 
			
		||||
 | 
			
		||||
        public override Vector3 Acceleration { get; set; }
 | 
			
		||||
 | 
			
		||||
        public override bool Kinematic
 | 
			
		||||
        {
 | 
			
		||||
            get { return true; }
 | 
			
		||||
            set { }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override void link(PhysicsActor obj)
 | 
			
		||||
        {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override void delink()
 | 
			
		||||
        {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override void LockAngularMotion(Vector3 axis)
 | 
			
		||||
        {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override void AddForce(Vector3 force, bool pushforce)
 | 
			
		||||
        {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override void AddAngularForce(Vector3 force, bool pushforce)
 | 
			
		||||
        {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override void SetMomentum(Vector3 momentum)
 | 
			
		||||
        {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override void CrossingFailure()
 | 
			
		||||
        {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override Vector3 PIDTarget
 | 
			
		||||
        {
 | 
			
		||||
            set { return; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override bool PIDActive
 | 
			
		||||
        {
 | 
			
		||||
            set { return; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override float PIDTau
 | 
			
		||||
        {
 | 
			
		||||
            set { return; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override float PIDHoverHeight
 | 
			
		||||
        {
 | 
			
		||||
            set { return; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override bool PIDHoverActive
 | 
			
		||||
        {
 | 
			
		||||
            set { return; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override PIDHoverType PIDHoverType
 | 
			
		||||
        {
 | 
			
		||||
            set { return; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override float PIDHoverTau
 | 
			
		||||
        {
 | 
			
		||||
            set { return; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override Quaternion APIDTarget 
 | 
			
		||||
        { 
 | 
			
		||||
            set { return; }
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        public override bool APIDActive
 | 
			
		||||
        { 
 | 
			
		||||
            set { return; }
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        public override float APIDStrength
 | 
			
		||||
        { 
 | 
			
		||||
            set { return; }
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        public override float APIDDamping
 | 
			
		||||
        { 
 | 
			
		||||
            set { return; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override void SubscribeEvents(int ms)
 | 
			
		||||
        {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override void UnSubscribeEvents()
 | 
			
		||||
        {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override bool SubscribedEvents()
 | 
			
		||||
        {
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -34,9 +34,17 @@ using OpenSim.Region.Physics.Manager;
 | 
			
		|||
 | 
			
		||||
namespace OpenSim.Region.Physics.BasicPhysicsPlugin
 | 
			
		||||
{
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// This is an incomplete extremely basic physics implementation
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    /// <remarks>
 | 
			
		||||
    /// Not useful for anything at the moment apart from some regression testing in other components where some form
 | 
			
		||||
    /// of physics plugin is needed.
 | 
			
		||||
    /// </remarks>
 | 
			
		||||
    public class BasicScene : PhysicsScene
 | 
			
		||||
    {
 | 
			
		||||
        private List<BasicActor> _actors = new List<BasicActor>();
 | 
			
		||||
        private List<BasicPhysicsPrim> _prims = new List<BasicPhysicsPrim>();
 | 
			
		||||
        private float[] _heightMap;
 | 
			
		||||
 | 
			
		||||
        //protected internal string sceneIdentifier;
 | 
			
		||||
| 
						 | 
				
			
			@ -50,10 +58,19 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin
 | 
			
		|||
        {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override void Dispose()
 | 
			
		||||
        {
 | 
			
		||||
        public override void Dispose() {}
 | 
			
		||||
 | 
			
		||||
        public override PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, Vector3 position,
 | 
			
		||||
                                                  Vector3 size, Quaternion rotation, bool isPhysical, uint localid)
 | 
			
		||||
        {
 | 
			
		||||
            BasicPhysicsPrim prim = new BasicPhysicsPrim(primName, localid, position, size, rotation, pbs);
 | 
			
		||||
            prim.IsPhysical = isPhysical;
 | 
			
		||||
 | 
			
		||||
            _prims.Add(prim);
 | 
			
		||||
 | 
			
		||||
            return prim;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override PhysicsActor AddAvatar(string avName, Vector3 position, Vector3 size, bool isFlying)
 | 
			
		||||
        {
 | 
			
		||||
            BasicActor act = new BasicActor(size);
 | 
			
		||||
| 
						 | 
				
			
			@ -63,30 +80,18 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin
 | 
			
		|||
            return act;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override void RemovePrim(PhysicsActor prim)
 | 
			
		||||
        public override void RemovePrim(PhysicsActor actor)
 | 
			
		||||
        {
 | 
			
		||||
            BasicPhysicsPrim prim = (BasicPhysicsPrim)actor;
 | 
			
		||||
            if (_prims.Contains(prim))
 | 
			
		||||
                _prims.Remove(prim);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override void RemoveAvatar(PhysicsActor actor)
 | 
			
		||||
        {
 | 
			
		||||
            BasicActor act = (BasicActor) actor;
 | 
			
		||||
            BasicActor act = (BasicActor)actor;
 | 
			
		||||
            if (_actors.Contains(act))
 | 
			
		||||
            {
 | 
			
		||||
                _actors.Remove(act);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
        public override PhysicsActor AddPrim(Vector3 position, Vector3 size, Quaternion rotation)
 | 
			
		||||
        {
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
        public override PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, Vector3 position,
 | 
			
		||||
                                                  Vector3 size, Quaternion rotation, bool isPhysical, uint localid)
 | 
			
		||||
        {
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override void AddPhysicsActorTaint(PhysicsActor prim)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -156,7 +156,15 @@ namespace OpenSim.Region.Physics.OdePlugin
 | 
			
		|||
        /// </summary>
 | 
			
		||||
        public IntPtr m_targetSpace = IntPtr.Zero;
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// The prim geometry, used for collision detection.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <remarks>
 | 
			
		||||
        /// This is never null except for a brief period when the geometry needs to be replaced (due to resizing or
 | 
			
		||||
        /// mesh change) or when the physical prim is being removed from the scene.
 | 
			
		||||
        /// </remarks>
 | 
			
		||||
        public IntPtr prim_geom { get; private set; }
 | 
			
		||||
 | 
			
		||||
        public IntPtr _triMeshData { get; private set; }
 | 
			
		||||
 | 
			
		||||
        private IntPtr _linkJointGroup = IntPtr.Zero;
 | 
			
		||||
| 
						 | 
				
			
			@ -325,14 +333,12 @@ namespace OpenSim.Region.Physics.OdePlugin
 | 
			
		|||
        {
 | 
			
		||||
            prim_geom = geom;
 | 
			
		||||
//Console.WriteLine("SetGeom to " + prim_geom + " for " + Name);
 | 
			
		||||
            if (prim_geom != IntPtr.Zero)
 | 
			
		||||
            {
 | 
			
		||||
                d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories);
 | 
			
		||||
                d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags);
 | 
			
		||||
 | 
			
		||||
                _parent_scene.geom_name_map[prim_geom] = Name;
 | 
			
		||||
                _parent_scene.actor_name_map[prim_geom] = this;
 | 
			
		||||
            }
 | 
			
		||||
            d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories);
 | 
			
		||||
            d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags);
 | 
			
		||||
 | 
			
		||||
            _parent_scene.geom_name_map[prim_geom] = Name;
 | 
			
		||||
            _parent_scene.actor_name_map[prim_geom] = this;
 | 
			
		||||
 | 
			
		||||
            if (childPrim)
 | 
			
		||||
            {
 | 
			
		||||
| 
						 | 
				
			
			@ -765,11 +771,8 @@ namespace OpenSim.Region.Physics.OdePlugin
 | 
			
		|||
                        m_collisionCategories &= ~CollisionCategories.Body;
 | 
			
		||||
                        m_collisionFlags &= ~(CollisionCategories.Wind | CollisionCategories.Land);
 | 
			
		||||
 | 
			
		||||
                        if (prim_geom != IntPtr.Zero)
 | 
			
		||||
                        {
 | 
			
		||||
                            d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories);
 | 
			
		||||
                            d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags);
 | 
			
		||||
                        }
 | 
			
		||||
                        d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories);
 | 
			
		||||
                        d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags);
 | 
			
		||||
 | 
			
		||||
                        d.BodyDestroy(Body);
 | 
			
		||||
                        lock (childrenPrim)
 | 
			
		||||
| 
						 | 
				
			
			@ -793,11 +796,8 @@ namespace OpenSim.Region.Physics.OdePlugin
 | 
			
		|||
                    m_collisionCategories &= ~CollisionCategories.Body;
 | 
			
		||||
                    m_collisionFlags &= ~(CollisionCategories.Wind | CollisionCategories.Land);
 | 
			
		||||
 | 
			
		||||
                    if (prim_geom != IntPtr.Zero)
 | 
			
		||||
                    {
 | 
			
		||||
                        d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories);
 | 
			
		||||
                        d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags);
 | 
			
		||||
                    }
 | 
			
		||||
                    d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories);
 | 
			
		||||
                    d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags);
 | 
			
		||||
 | 
			
		||||
                    Body = IntPtr.Zero;
 | 
			
		||||
                }
 | 
			
		||||
| 
						 | 
				
			
			@ -864,10 +864,7 @@ namespace OpenSim.Region.Physics.OdePlugin
 | 
			
		|||
//            _parent_scene.waitForSpaceUnlock(m_targetSpace);
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                if (prim_geom == IntPtr.Zero)
 | 
			
		||||
                {
 | 
			
		||||
                    SetGeom(d.CreateTriMesh(m_targetSpace, _triMeshData, parent_scene.triCallback, null, null));
 | 
			
		||||
                }
 | 
			
		||||
                SetGeom(d.CreateTriMesh(m_targetSpace, _triMeshData, parent_scene.triCallback, null, null));
 | 
			
		||||
            }
 | 
			
		||||
            catch (AccessViolationException)
 | 
			
		||||
            {
 | 
			
		||||
| 
						 | 
				
			
			@ -890,73 +887,67 @@ namespace OpenSim.Region.Physics.OdePlugin
 | 
			
		|||
#if SPAM
 | 
			
		||||
Console.WriteLine("ZProcessTaints for " + Name);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
            // This must be processed as the very first taint so that later operations have a prim_geom to work with
 | 
			
		||||
            // if this is a new prim.
 | 
			
		||||
            if (m_taintadd)
 | 
			
		||||
            {
 | 
			
		||||
                changeadd();
 | 
			
		||||
            }
 | 
			
		||||
            
 | 
			
		||||
            if (prim_geom != IntPtr.Zero)
 | 
			
		||||
            {
 | 
			
		||||
                 if (!_position.ApproxEquals(m_taintposition, 0f))
 | 
			
		||||
                     changemove();
 | 
			
		||||
 | 
			
		||||
                 if (m_taintrot != _orientation)
 | 
			
		||||
                 {
 | 
			
		||||
                    if (childPrim && IsPhysical)    // For physical child prim...
 | 
			
		||||
                    {
 | 
			
		||||
                        rotate();
 | 
			
		||||
                        // KF: ODE will also rotate the parent prim!
 | 
			
		||||
                        // so rotate the root back to where it was
 | 
			
		||||
                        OdePrim parent = (OdePrim)_parent;
 | 
			
		||||
                        parent.rotate();
 | 
			
		||||
                    }
 | 
			
		||||
                    else
 | 
			
		||||
                    {
 | 
			
		||||
                        //Just rotate the prim
 | 
			
		||||
                        rotate();
 | 
			
		||||
                    }
 | 
			
		||||
            if (!_position.ApproxEquals(m_taintposition, 0f))
 | 
			
		||||
                 changemove();
 | 
			
		||||
 | 
			
		||||
            if (m_taintrot != _orientation)
 | 
			
		||||
            {
 | 
			
		||||
                if (childPrim && IsPhysical)    // For physical child prim...
 | 
			
		||||
                {
 | 
			
		||||
                    rotate();
 | 
			
		||||
                    // KF: ODE will also rotate the parent prim!
 | 
			
		||||
                    // so rotate the root back to where it was
 | 
			
		||||
                    OdePrim parent = (OdePrim)_parent;
 | 
			
		||||
                    parent.rotate();
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    //Just rotate the prim
 | 
			
		||||
                    rotate();
 | 
			
		||||
                }
 | 
			
		||||
            
 | 
			
		||||
                if (m_taintPhysics != IsPhysical && !(m_taintparent != _parent))
 | 
			
		||||
                    changePhysicsStatus();
 | 
			
		||||
 | 
			
		||||
                if (!_size.ApproxEquals(m_taintsize, 0f))
 | 
			
		||||
                    changesize();
 | 
			
		||||
 | 
			
		||||
                if (m_taintshape)
 | 
			
		||||
                    changeshape();
 | 
			
		||||
 | 
			
		||||
                if (m_taintforce)
 | 
			
		||||
                    changeAddForce();
 | 
			
		||||
 | 
			
		||||
                if (m_taintaddangularforce)
 | 
			
		||||
                    changeAddAngularForce();
 | 
			
		||||
 | 
			
		||||
                if (!m_taintTorque.ApproxEquals(Vector3.Zero, 0.001f))
 | 
			
		||||
                    changeSetTorque();
 | 
			
		||||
 | 
			
		||||
                if (m_taintdisable)
 | 
			
		||||
                    changedisable();
 | 
			
		||||
 | 
			
		||||
                if (m_taintselected != m_isSelected)
 | 
			
		||||
                    changeSelectedStatus();
 | 
			
		||||
 | 
			
		||||
                if (!m_taintVelocity.ApproxEquals(Vector3.Zero, 0.001f))
 | 
			
		||||
                    changevelocity();
 | 
			
		||||
 | 
			
		||||
                if (m_taintparent != _parent)
 | 
			
		||||
                    changelink();
 | 
			
		||||
 | 
			
		||||
                if (m_taintCollidesWater != m_collidesWater)
 | 
			
		||||
                    changefloatonwater();
 | 
			
		||||
 | 
			
		||||
                if (!m_angularlock.ApproxEquals(m_taintAngularLock,0f))
 | 
			
		||||
                    changeAngularLock();
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                m_log.ErrorFormat("[PHYSICS]: The scene reused a disposed PhysActor for {0}! *waves finger*, Don't be evil.  A couple of things can cause this.   An improper prim breakdown(be sure to set prim_geom to zero after d.GeomDestroy!   An improper buildup (creating the geom failed).   Or, the Scene Reused a physics actor after disposing it.)", Name);
 | 
			
		||||
            }
 | 
			
		||||
        
 | 
			
		||||
            if (m_taintPhysics != IsPhysical && !(m_taintparent != _parent))
 | 
			
		||||
                changePhysicsStatus();
 | 
			
		||||
 | 
			
		||||
            if (!_size.ApproxEquals(m_taintsize, 0f))
 | 
			
		||||
                changesize();
 | 
			
		||||
 | 
			
		||||
            if (m_taintshape)
 | 
			
		||||
                changeshape();
 | 
			
		||||
 | 
			
		||||
            if (m_taintforce)
 | 
			
		||||
                changeAddForce();
 | 
			
		||||
 | 
			
		||||
            if (m_taintaddangularforce)
 | 
			
		||||
                changeAddAngularForce();
 | 
			
		||||
 | 
			
		||||
            if (!m_taintTorque.ApproxEquals(Vector3.Zero, 0.001f))
 | 
			
		||||
                changeSetTorque();
 | 
			
		||||
 | 
			
		||||
            if (m_taintdisable)
 | 
			
		||||
                changedisable();
 | 
			
		||||
 | 
			
		||||
            if (m_taintselected != m_isSelected)
 | 
			
		||||
                changeSelectedStatus();
 | 
			
		||||
 | 
			
		||||
            if (!m_taintVelocity.ApproxEquals(Vector3.Zero, 0.001f))
 | 
			
		||||
                changevelocity();
 | 
			
		||||
 | 
			
		||||
            if (m_taintparent != _parent)
 | 
			
		||||
                changelink();
 | 
			
		||||
 | 
			
		||||
            if (m_taintCollidesWater != m_collidesWater)
 | 
			
		||||
                changefloatonwater();
 | 
			
		||||
 | 
			
		||||
            if (!m_angularlock.ApproxEquals(m_taintAngularLock,0f))
 | 
			
		||||
                changeAngularLock();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
| 
						 | 
				
			
			@ -1052,150 +1043,146 @@ Console.WriteLine("ZProcessTaints for " + Name);
 | 
			
		|||
        /// <param name="prim">Child prim</param>
 | 
			
		||||
        private void AddChildPrim(OdePrim prim)
 | 
			
		||||
        {
 | 
			
		||||
//Console.WriteLine("AddChildPrim  " + Name);
 | 
			
		||||
            if (LocalID != prim.LocalID)
 | 
			
		||||
            if (LocalID == prim.LocalID)
 | 
			
		||||
                return;
 | 
			
		||||
 | 
			
		||||
            if (Body == IntPtr.Zero)
 | 
			
		||||
            {
 | 
			
		||||
                if (Body == IntPtr.Zero)
 | 
			
		||||
                Body = d.BodyCreate(_parent_scene.world);
 | 
			
		||||
                setMass();
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            lock (childrenPrim)
 | 
			
		||||
            {
 | 
			
		||||
                if (childrenPrim.Contains(prim))
 | 
			
		||||
                    return;
 | 
			
		||||
 | 
			
		||||
//                m_log.DebugFormat(
 | 
			
		||||
//                    "[ODE PRIM]: Linking prim {0} {1} to {2} {3}", prim.Name, prim.LocalID, Name, LocalID);
 | 
			
		||||
 | 
			
		||||
                childrenPrim.Add(prim);
 | 
			
		||||
 | 
			
		||||
                foreach (OdePrim prm in childrenPrim)
 | 
			
		||||
                {
 | 
			
		||||
                    Body = d.BodyCreate(_parent_scene.world);
 | 
			
		||||
                    setMass();
 | 
			
		||||
                    d.Mass m2;
 | 
			
		||||
                    d.MassSetZero(out m2);
 | 
			
		||||
                    d.MassSetBoxTotal(out m2, prim.CalculateMass(), prm._size.X, prm._size.Y, prm._size.Z);
 | 
			
		||||
 | 
			
		||||
                    d.Quaternion quat = new d.Quaternion();
 | 
			
		||||
                    quat.W = prm._orientation.W;
 | 
			
		||||
                    quat.X = prm._orientation.X;
 | 
			
		||||
                    quat.Y = prm._orientation.Y;
 | 
			
		||||
                    quat.Z = prm._orientation.Z;
 | 
			
		||||
 | 
			
		||||
                    d.Matrix3 mat = new d.Matrix3();
 | 
			
		||||
                    d.RfromQ(out mat, ref quat);
 | 
			
		||||
                    d.MassRotate(ref m2, ref mat);
 | 
			
		||||
                    d.MassTranslate(ref m2, Position.X - prm.Position.X, Position.Y - prm.Position.Y, Position.Z - prm.Position.Z);
 | 
			
		||||
                    d.MassAdd(ref pMass, ref m2);
 | 
			
		||||
                }
 | 
			
		||||
                if (Body != IntPtr.Zero)
 | 
			
		||||
 | 
			
		||||
                foreach (OdePrim prm in childrenPrim)
 | 
			
		||||
                {
 | 
			
		||||
                    lock (childrenPrim)
 | 
			
		||||
                    {
 | 
			
		||||
                        if (!childrenPrim.Contains(prim))
 | 
			
		||||
                        {
 | 
			
		||||
//Console.WriteLine("childrenPrim.Add " + prim);
 | 
			
		||||
                            childrenPrim.Add(prim);
 | 
			
		||||
                            
 | 
			
		||||
                            foreach (OdePrim prm in childrenPrim)
 | 
			
		||||
                            {
 | 
			
		||||
                                d.Mass m2;
 | 
			
		||||
                                d.MassSetZero(out m2);
 | 
			
		||||
                                d.MassSetBoxTotal(out m2, prim.CalculateMass(), prm._size.X, prm._size.Y, prm._size.Z);
 | 
			
		||||
                    prm.m_collisionCategories |= CollisionCategories.Body;
 | 
			
		||||
                    prm.m_collisionFlags |= (CollisionCategories.Land | CollisionCategories.Wind);
 | 
			
		||||
 | 
			
		||||
                                d.Quaternion quat = new d.Quaternion();
 | 
			
		||||
                                quat.W = prm._orientation.W;
 | 
			
		||||
                                quat.X = prm._orientation.X;
 | 
			
		||||
                                quat.Y = prm._orientation.Y;
 | 
			
		||||
                                quat.Z = prm._orientation.Z;
 | 
			
		||||
 | 
			
		||||
                                d.Matrix3 mat = new d.Matrix3();
 | 
			
		||||
                                d.RfromQ(out mat, ref quat);
 | 
			
		||||
                                d.MassRotate(ref m2, ref mat);
 | 
			
		||||
                                d.MassTranslate(ref m2, Position.X - prm.Position.X, Position.Y - prm.Position.Y, Position.Z - prm.Position.Z);
 | 
			
		||||
                                d.MassAdd(ref pMass, ref m2);
 | 
			
		||||
                            }
 | 
			
		||||
                            
 | 
			
		||||
                            foreach (OdePrim prm in childrenPrim)
 | 
			
		||||
                            {
 | 
			
		||||
                                prm.m_collisionCategories |= CollisionCategories.Body;
 | 
			
		||||
                                prm.m_collisionFlags |= (CollisionCategories.Land | CollisionCategories.Wind);
 | 
			
		||||
 | 
			
		||||
                                if (prm.prim_geom == IntPtr.Zero)
 | 
			
		||||
                                {
 | 
			
		||||
                                    m_log.WarnFormat(
 | 
			
		||||
                                        "[PHYSICS]: Unable to link one of the linkset elements {0} for parent {1}.  No geom yet", 
 | 
			
		||||
                                        prm.Name, prim.Name);
 | 
			
		||||
                                    continue;
 | 
			
		||||
                                }
 | 
			
		||||
//Console.WriteLine(" GeomSetCategoryBits 1: " + prm.prim_geom + " - " + (int)prm.m_collisionCategories + " for " + Name);
 | 
			
		||||
                                d.GeomSetCategoryBits(prm.prim_geom, (int)prm.m_collisionCategories);
 | 
			
		||||
                                d.GeomSetCollideBits(prm.prim_geom, (int)prm.m_collisionFlags);
 | 
			
		||||
                    d.GeomSetCategoryBits(prm.prim_geom, (int)prm.m_collisionCategories);
 | 
			
		||||
                    d.GeomSetCollideBits(prm.prim_geom, (int)prm.m_collisionFlags);
 | 
			
		||||
 | 
			
		||||
                    d.Quaternion quat = new d.Quaternion();
 | 
			
		||||
                    quat.W = prm._orientation.W;
 | 
			
		||||
                    quat.X = prm._orientation.X;
 | 
			
		||||
                    quat.Y = prm._orientation.Y;
 | 
			
		||||
                    quat.Z = prm._orientation.Z;
 | 
			
		||||
 | 
			
		||||
                                d.Quaternion quat = new d.Quaternion();
 | 
			
		||||
                                quat.W = prm._orientation.W;
 | 
			
		||||
                                quat.X = prm._orientation.X;
 | 
			
		||||
                                quat.Y = prm._orientation.Y;
 | 
			
		||||
                                quat.Z = prm._orientation.Z;
 | 
			
		||||
                    d.Matrix3 mat = new d.Matrix3();
 | 
			
		||||
                    d.RfromQ(out mat, ref quat);
 | 
			
		||||
                    if (Body != IntPtr.Zero)
 | 
			
		||||
                    {
 | 
			
		||||
                        d.GeomSetBody(prm.prim_geom, Body);
 | 
			
		||||
                        prm.childPrim = true;
 | 
			
		||||
                        d.GeomSetOffsetWorldPosition(prm.prim_geom, prm.Position.X , prm.Position.Y, prm.Position.Z);
 | 
			
		||||
                        //d.GeomSetOffsetPosition(prim.prim_geom,
 | 
			
		||||
                        //    (Position.X - prm.Position.X) - pMass.c.X,
 | 
			
		||||
                        //    (Position.Y - prm.Position.Y) - pMass.c.Y,
 | 
			
		||||
                        //    (Position.Z - prm.Position.Z) - pMass.c.Z);
 | 
			
		||||
                        d.GeomSetOffsetWorldRotation(prm.prim_geom, ref mat);
 | 
			
		||||
                        //d.GeomSetOffsetRotation(prm.prim_geom, ref mat);
 | 
			
		||||
                        d.MassTranslate(ref pMass, -pMass.c.X, -pMass.c.Y, -pMass.c.Z);
 | 
			
		||||
                        d.BodySetMass(Body, ref pMass);
 | 
			
		||||
                    }
 | 
			
		||||
                    else
 | 
			
		||||
                    {
 | 
			
		||||
                        m_log.DebugFormat("[PHYSICS]: {0} ain't got no boooooooooddy, no body", Name);
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                                d.Matrix3 mat = new d.Matrix3();
 | 
			
		||||
                                d.RfromQ(out mat, ref quat);
 | 
			
		||||
                                if (Body != IntPtr.Zero)
 | 
			
		||||
                                {
 | 
			
		||||
                                    d.GeomSetBody(prm.prim_geom, Body);
 | 
			
		||||
                                    prm.childPrim = true;
 | 
			
		||||
                                    d.GeomSetOffsetWorldPosition(prm.prim_geom, prm.Position.X , prm.Position.Y, prm.Position.Z);
 | 
			
		||||
                                    //d.GeomSetOffsetPosition(prim.prim_geom,
 | 
			
		||||
                                    //    (Position.X - prm.Position.X) - pMass.c.X,
 | 
			
		||||
                                    //    (Position.Y - prm.Position.Y) - pMass.c.Y,
 | 
			
		||||
                                    //    (Position.Z - prm.Position.Z) - pMass.c.Z);
 | 
			
		||||
                                    d.GeomSetOffsetWorldRotation(prm.prim_geom, ref mat);
 | 
			
		||||
                                    //d.GeomSetOffsetRotation(prm.prim_geom, ref mat);
 | 
			
		||||
                                    d.MassTranslate(ref pMass, -pMass.c.X, -pMass.c.Y, -pMass.c.Z);
 | 
			
		||||
                                    d.BodySetMass(Body, ref pMass);
 | 
			
		||||
                                }
 | 
			
		||||
                                else
 | 
			
		||||
                                {
 | 
			
		||||
                                    m_log.DebugFormat("[PHYSICS]: {0} ain't got no boooooooooddy, no body", Name);
 | 
			
		||||
                                }
 | 
			
		||||
                    prm.m_interpenetrationcount = 0;
 | 
			
		||||
                    prm.m_collisionscore = 0;
 | 
			
		||||
                    prm.m_disabled = false;
 | 
			
		||||
 | 
			
		||||
                                prm.m_interpenetrationcount = 0;
 | 
			
		||||
                                prm.m_collisionscore = 0;
 | 
			
		||||
                                prm.m_disabled = false;
 | 
			
		||||
                    // The body doesn't already have a finite rotation mode set here
 | 
			
		||||
                    if ((!m_angularlock.ApproxEquals(Vector3.Zero, 0f)) && _parent == null)
 | 
			
		||||
                    {
 | 
			
		||||
                        prm.createAMotor(m_angularlock);
 | 
			
		||||
                    }
 | 
			
		||||
                    prm.Body = Body;
 | 
			
		||||
                    _parent_scene.ActivatePrim(prm);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                                // The body doesn't already have a finite rotation mode set here
 | 
			
		||||
                                if ((!m_angularlock.ApproxEquals(Vector3.Zero, 0f)) && _parent == null)
 | 
			
		||||
                                {
 | 
			
		||||
                                    prm.createAMotor(m_angularlock);
 | 
			
		||||
                                }
 | 
			
		||||
                                prm.Body = Body;
 | 
			
		||||
                                _parent_scene.ActivatePrim(prm);
 | 
			
		||||
                            }
 | 
			
		||||
 | 
			
		||||
                            m_collisionCategories |= CollisionCategories.Body;
 | 
			
		||||
                            m_collisionFlags |= (CollisionCategories.Land | CollisionCategories.Wind);
 | 
			
		||||
                m_collisionCategories |= CollisionCategories.Body;
 | 
			
		||||
                m_collisionFlags |= (CollisionCategories.Land | CollisionCategories.Wind);
 | 
			
		||||
 | 
			
		||||
//Console.WriteLine("GeomSetCategoryBits 2: " + prim_geom + " - " + (int)m_collisionCategories + " for " + Name);
 | 
			
		||||
                            d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories);
 | 
			
		||||
                d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories);
 | 
			
		||||
//Console.WriteLine(" Post GeomSetCategoryBits 2");
 | 
			
		||||
                            d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags);
 | 
			
		||||
                d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags);
 | 
			
		||||
 | 
			
		||||
                            d.Quaternion quat2 = new d.Quaternion();
 | 
			
		||||
                            quat2.W = _orientation.W;
 | 
			
		||||
                            quat2.X = _orientation.X;
 | 
			
		||||
                            quat2.Y = _orientation.Y;
 | 
			
		||||
                            quat2.Z = _orientation.Z;
 | 
			
		||||
                d.Quaternion quat2 = new d.Quaternion();
 | 
			
		||||
                quat2.W = _orientation.W;
 | 
			
		||||
                quat2.X = _orientation.X;
 | 
			
		||||
                quat2.Y = _orientation.Y;
 | 
			
		||||
                quat2.Z = _orientation.Z;
 | 
			
		||||
 | 
			
		||||
                            d.Matrix3 mat2 = new d.Matrix3();
 | 
			
		||||
                            d.RfromQ(out mat2, ref quat2);
 | 
			
		||||
                            d.GeomSetBody(prim_geom, Body);
 | 
			
		||||
                            d.GeomSetOffsetWorldPosition(prim_geom, Position.X - pMass.c.X, Position.Y - pMass.c.Y, Position.Z - pMass.c.Z);
 | 
			
		||||
                            //d.GeomSetOffsetPosition(prim.prim_geom,
 | 
			
		||||
                            //    (Position.X - prm.Position.X) - pMass.c.X,
 | 
			
		||||
                            //    (Position.Y - prm.Position.Y) - pMass.c.Y,
 | 
			
		||||
                            //    (Position.Z - prm.Position.Z) - pMass.c.Z);
 | 
			
		||||
                            //d.GeomSetOffsetRotation(prim_geom, ref mat2);
 | 
			
		||||
                            d.MassTranslate(ref pMass, -pMass.c.X, -pMass.c.Y, -pMass.c.Z);
 | 
			
		||||
                            d.BodySetMass(Body, ref pMass);
 | 
			
		||||
                d.Matrix3 mat2 = new d.Matrix3();
 | 
			
		||||
                d.RfromQ(out mat2, ref quat2);
 | 
			
		||||
                d.GeomSetBody(prim_geom, Body);
 | 
			
		||||
                d.GeomSetOffsetWorldPosition(prim_geom, Position.X - pMass.c.X, Position.Y - pMass.c.Y, Position.Z - pMass.c.Z);
 | 
			
		||||
                //d.GeomSetOffsetPosition(prim.prim_geom,
 | 
			
		||||
                //    (Position.X - prm.Position.X) - pMass.c.X,
 | 
			
		||||
                //    (Position.Y - prm.Position.Y) - pMass.c.Y,
 | 
			
		||||
                //    (Position.Z - prm.Position.Z) - pMass.c.Z);
 | 
			
		||||
                //d.GeomSetOffsetRotation(prim_geom, ref mat2);
 | 
			
		||||
                d.MassTranslate(ref pMass, -pMass.c.X, -pMass.c.Y, -pMass.c.Z);
 | 
			
		||||
                d.BodySetMass(Body, ref pMass);
 | 
			
		||||
 | 
			
		||||
                            d.BodySetAutoDisableFlag(Body, true);
 | 
			
		||||
                            d.BodySetAutoDisableSteps(Body, body_autodisable_frames);
 | 
			
		||||
                d.BodySetAutoDisableFlag(Body, true);
 | 
			
		||||
                d.BodySetAutoDisableSteps(Body, body_autodisable_frames);
 | 
			
		||||
 | 
			
		||||
                            m_interpenetrationcount = 0;
 | 
			
		||||
                            m_collisionscore = 0;
 | 
			
		||||
                            m_disabled = false;
 | 
			
		||||
                m_interpenetrationcount = 0;
 | 
			
		||||
                m_collisionscore = 0;
 | 
			
		||||
                m_disabled = false;
 | 
			
		||||
 | 
			
		||||
                            // The body doesn't already have a finite rotation mode set here
 | 
			
		||||
                            if ((!m_angularlock.ApproxEquals(Vector3.Zero, 0f)) && _parent == null)
 | 
			
		||||
                            {
 | 
			
		||||
                                createAMotor(m_angularlock);
 | 
			
		||||
                            }
 | 
			
		||||
                            d.BodySetPosition(Body, Position.X, Position.Y, Position.Z);
 | 
			
		||||
                            if (m_vehicle.Type != Vehicle.TYPE_NONE)
 | 
			
		||||
                                m_vehicle.Enable(Body, _parent_scene);
 | 
			
		||||
 | 
			
		||||
                            _parent_scene.ActivatePrim(this);
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                // The body doesn't already have a finite rotation mode set here
 | 
			
		||||
                if ((!m_angularlock.ApproxEquals(Vector3.Zero, 0f)) && _parent == null)
 | 
			
		||||
                {
 | 
			
		||||
                    createAMotor(m_angularlock);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                d.BodySetPosition(Body, Position.X, Position.Y, Position.Z);
 | 
			
		||||
 | 
			
		||||
                if (m_vehicle.Type != Vehicle.TYPE_NONE)
 | 
			
		||||
                    m_vehicle.Enable(Body, _parent_scene);
 | 
			
		||||
 | 
			
		||||
                _parent_scene.ActivatePrim(this);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void ChildSetGeom(OdePrim odePrim)
 | 
			
		||||
        {
 | 
			
		||||
//            m_log.DebugFormat(
 | 
			
		||||
//                "[ODE PRIM]: ChildSetGeom {0} {1} for {2} {3}", odePrim.Name, odePrim.LocalID, Name, LocalID);
 | 
			
		||||
 | 
			
		||||
            //if (IsPhysical && Body != IntPtr.Zero)
 | 
			
		||||
            lock (childrenPrim)
 | 
			
		||||
            {
 | 
			
		||||
| 
						 | 
				
			
			@ -1210,12 +1197,14 @@ Console.WriteLine("ZProcessTaints for " + Name);
 | 
			
		|||
                    //prm.childPrim = false;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            disableBody();
 | 
			
		||||
 | 
			
		||||
            if (Body != IntPtr.Zero)
 | 
			
		||||
            {
 | 
			
		||||
                _parent_scene.DeactivatePrim(this);
 | 
			
		||||
            }
 | 
			
		||||
            // Spurious - Body == IntPtr.Zero after disableBody()
 | 
			
		||||
//            if (Body != IntPtr.Zero)
 | 
			
		||||
//            {
 | 
			
		||||
//                _parent_scene.DeactivatePrim(this);
 | 
			
		||||
//            }
 | 
			
		||||
 | 
			
		||||
            lock (childrenPrim)
 | 
			
		||||
            {
 | 
			
		||||
| 
						 | 
				
			
			@ -1229,6 +1218,9 @@ Console.WriteLine("ZProcessTaints for " + Name);
 | 
			
		|||
 | 
			
		||||
        private void ChildDelink(OdePrim odePrim)
 | 
			
		||||
        {
 | 
			
		||||
//            m_log.DebugFormat(
 | 
			
		||||
//                "[ODE PRIM]: Delinking prim {0} {1} from {2} {3}", odePrim.Name, odePrim.LocalID, Name, LocalID);
 | 
			
		||||
 | 
			
		||||
            // Okay, we have a delinked child..   need to rebuild the body.
 | 
			
		||||
            lock (childrenPrim)
 | 
			
		||||
            {
 | 
			
		||||
| 
						 | 
				
			
			@ -1243,6 +1235,7 @@ Console.WriteLine("ZProcessTaints for " + Name);
 | 
			
		|||
                    //prm.childPrim = false;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            disableBody();
 | 
			
		||||
 | 
			
		||||
            lock (childrenPrim)
 | 
			
		||||
| 
						 | 
				
			
			@ -1251,10 +1244,11 @@ Console.WriteLine("ZProcessTaints for " + Name);
 | 
			
		|||
                childrenPrim.Remove(odePrim);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (Body != IntPtr.Zero)
 | 
			
		||||
            {
 | 
			
		||||
                _parent_scene.DeactivatePrim(this);
 | 
			
		||||
            }
 | 
			
		||||
            // Spurious - Body == IntPtr.Zero after disableBody()
 | 
			
		||||
//            if (Body != IntPtr.Zero)
 | 
			
		||||
//            {
 | 
			
		||||
//                _parent_scene.DeactivatePrim(this);
 | 
			
		||||
//            }
 | 
			
		||||
 | 
			
		||||
            lock (childrenPrim)
 | 
			
		||||
            {
 | 
			
		||||
| 
						 | 
				
			
			@ -1303,11 +1297,8 @@ Console.WriteLine("ZProcessTaints for " + Name);
 | 
			
		|||
                    disableBodySoft();
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                if (prim_geom != IntPtr.Zero)
 | 
			
		||||
                {
 | 
			
		||||
                    d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories);
 | 
			
		||||
                    d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags);
 | 
			
		||||
                }
 | 
			
		||||
                d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories);
 | 
			
		||||
                d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags);
 | 
			
		||||
 | 
			
		||||
                if (IsPhysical)
 | 
			
		||||
                {
 | 
			
		||||
| 
						 | 
				
			
			@ -1328,11 +1319,8 @@ Console.WriteLine("ZProcessTaints for " + Name);
 | 
			
		|||
                if (m_collidesWater)
 | 
			
		||||
                    m_collisionFlags |= CollisionCategories.Water;
 | 
			
		||||
 | 
			
		||||
                if (prim_geom != IntPtr.Zero)
 | 
			
		||||
                {
 | 
			
		||||
                    d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories);
 | 
			
		||||
                    d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags);
 | 
			
		||||
                }
 | 
			
		||||
                d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories);
 | 
			
		||||
                d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags);
 | 
			
		||||
 | 
			
		||||
                if (IsPhysical)
 | 
			
		||||
                {
 | 
			
		||||
| 
						 | 
				
			
			@ -1472,6 +1460,9 @@ Console.WriteLine("CreateGeom:");
 | 
			
		|||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                m_log.WarnFormat(
 | 
			
		||||
                    "[ODE PRIM]: Called RemoveGeom() on {0} {1} where geometry was already null.", Name, LocalID);
 | 
			
		||||
 | 
			
		||||
                return false;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			@ -1505,16 +1496,13 @@ Console.WriteLine("changeadd 1");
 | 
			
		|||
#endif
 | 
			
		||||
            CreateGeom(m_targetSpace, mesh);
 | 
			
		||||
 | 
			
		||||
            if (prim_geom != IntPtr.Zero)
 | 
			
		||||
            {
 | 
			
		||||
                d.GeomSetPosition(prim_geom, _position.X, _position.Y, _position.Z);
 | 
			
		||||
                d.Quaternion myrot = new d.Quaternion();
 | 
			
		||||
                myrot.X = _orientation.X;
 | 
			
		||||
                myrot.Y = _orientation.Y;
 | 
			
		||||
                myrot.Z = _orientation.Z;
 | 
			
		||||
                myrot.W = _orientation.W;
 | 
			
		||||
                d.GeomSetQuaternion(prim_geom, ref myrot);
 | 
			
		||||
            }
 | 
			
		||||
            d.GeomSetPosition(prim_geom, _position.X, _position.Y, _position.Z);
 | 
			
		||||
            d.Quaternion myrot = new d.Quaternion();
 | 
			
		||||
            myrot.X = _orientation.X;
 | 
			
		||||
            myrot.Y = _orientation.Y;
 | 
			
		||||
            myrot.Z = _orientation.Z;
 | 
			
		||||
            myrot.W = _orientation.W;
 | 
			
		||||
            d.GeomSetQuaternion(prim_geom, ref myrot);
 | 
			
		||||
 | 
			
		||||
            if (IsPhysical && Body == IntPtr.Zero)
 | 
			
		||||
                enableBody();
 | 
			
		||||
| 
						 | 
				
			
			@ -1579,24 +1567,20 @@ Console.WriteLine(" JointCreateFixed");
 | 
			
		|||
                    //m_log.Debug("[BUG]: race!");
 | 
			
		||||
                //}
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                // string primScenAvatarIn = _parent_scene.whichspaceamIin(_position);
 | 
			
		||||
                // int[] arrayitem = _parent_scene.calculateSpaceArrayItemFromPos(_position);
 | 
			
		||||
//                _parent_scene.waitForSpaceUnlock(m_targetSpace);
 | 
			
		||||
 | 
			
		||||
                IntPtr tempspace = _parent_scene.recalculateSpaceForGeom(prim_geom, _position, m_targetSpace);
 | 
			
		||||
                m_targetSpace = tempspace;
 | 
			
		||||
            // string primScenAvatarIn = _parent_scene.whichspaceamIin(_position);
 | 
			
		||||
            // int[] arrayitem = _parent_scene.calculateSpaceArrayItemFromPos(_position);
 | 
			
		||||
//          _parent_scene.waitForSpaceUnlock(m_targetSpace);
 | 
			
		||||
 | 
			
		||||
            IntPtr tempspace = _parent_scene.recalculateSpaceForGeom(prim_geom, _position, m_targetSpace);
 | 
			
		||||
            m_targetSpace = tempspace;
 | 
			
		||||
 | 
			
		||||
//                _parent_scene.waitForSpaceUnlock(m_targetSpace);
 | 
			
		||||
                if (prim_geom != IntPtr.Zero)
 | 
			
		||||
                {
 | 
			
		||||
                    d.GeomSetPosition(prim_geom, _position.X, _position.Y, _position.Z);
 | 
			
		||||
 | 
			
		||||
            d.GeomSetPosition(prim_geom, _position.X, _position.Y, _position.Z);
 | 
			
		||||
 | 
			
		||||
//                    _parent_scene.waitForSpaceUnlock(m_targetSpace);
 | 
			
		||||
                    d.SpaceAdd(m_targetSpace, prim_geom);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            d.SpaceAdd(m_targetSpace, prim_geom);
 | 
			
		||||
 | 
			
		||||
            changeSelectedStatus();
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -2047,18 +2031,16 @@ Console.WriteLine(" JointCreateFixed");
 | 
			
		|||
        {
 | 
			
		||||
            m_collidesWater = m_taintCollidesWater;
 | 
			
		||||
 | 
			
		||||
            if (prim_geom != IntPtr.Zero)
 | 
			
		||||
            if (m_collidesWater)
 | 
			
		||||
            {
 | 
			
		||||
                if (m_collidesWater)
 | 
			
		||||
                {
 | 
			
		||||
                    m_collisionFlags |= CollisionCategories.Water;
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    m_collisionFlags &= ~CollisionCategories.Water;
 | 
			
		||||
                }
 | 
			
		||||
                d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags);
 | 
			
		||||
                m_collisionFlags |= CollisionCategories.Water;
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                m_collisionFlags &= ~CollisionCategories.Water;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2226,7 +2226,8 @@ namespace OpenSim.Region.Physics.OdePlugin
 | 
			
		|||
        /// <param name="prim"></param>
 | 
			
		||||
        internal void RemovePrimThreadLocked(OdePrim prim)
 | 
			
		||||
        {
 | 
			
		||||
//Console.WriteLine("RemovePrimThreadLocked " +  prim.m_primName);
 | 
			
		||||
//            m_log.DebugFormat("[ODE SCENE]: Removing physical prim {0} {1}", prim.Name, prim.LocalID);
 | 
			
		||||
 | 
			
		||||
            lock (prim)
 | 
			
		||||
            {
 | 
			
		||||
                RemoveCollisionEventReporting(prim);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -29,42 +29,43 @@ using System;
 | 
			
		|||
using System.Collections;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Reflection;
 | 
			
		||||
using log4net;
 | 
			
		||||
using OpenSim.Region.ScriptEngine.Interfaces;
 | 
			
		||||
 | 
			
		||||
namespace OpenSim.Region.ScriptEngine.Shared.Api
 | 
			
		||||
{
 | 
			
		||||
    public class ApiManager
 | 
			
		||||
    {
 | 
			
		||||
//        private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
 | 
			
		||||
 | 
			
		||||
        private Dictionary<string,Type> m_Apis = new Dictionary<string,Type>();
 | 
			
		||||
 | 
			
		||||
        public string[] GetApis()
 | 
			
		||||
        {
 | 
			
		||||
            if (m_Apis.Count > 0)
 | 
			
		||||
            if (m_Apis.Count <= 0)
 | 
			
		||||
            {
 | 
			
		||||
                List<string> l = new List<string>(m_Apis.Keys);
 | 
			
		||||
                return l.ToArray();
 | 
			
		||||
            }
 | 
			
		||||
                Assembly a = Assembly.GetExecutingAssembly();
 | 
			
		||||
 | 
			
		||||
            Assembly a = Assembly.GetExecutingAssembly();
 | 
			
		||||
                Type[] types = a.GetExportedTypes();
 | 
			
		||||
 | 
			
		||||
            Type[] types = a.GetExportedTypes();
 | 
			
		||||
 | 
			
		||||
            foreach (Type t in types)
 | 
			
		||||
            {
 | 
			
		||||
                string name = t.ToString();
 | 
			
		||||
                int idx = name.LastIndexOf('.');
 | 
			
		||||
                if (idx != -1)
 | 
			
		||||
                    name = name.Substring(idx+1);
 | 
			
		||||
 | 
			
		||||
                if (name.EndsWith("_Api"))
 | 
			
		||||
                foreach (Type t in types)
 | 
			
		||||
                {
 | 
			
		||||
                    name = name.Substring(0, name.Length - 4);
 | 
			
		||||
                    m_Apis[name] = t;
 | 
			
		||||
                    string name = t.ToString();
 | 
			
		||||
                    int idx = name.LastIndexOf('.');
 | 
			
		||||
                    if (idx != -1)
 | 
			
		||||
                        name = name.Substring(idx+1);
 | 
			
		||||
 | 
			
		||||
                    if (name.EndsWith("_Api"))
 | 
			
		||||
                    {
 | 
			
		||||
                        name = name.Substring(0, name.Length - 4);
 | 
			
		||||
                        m_Apis[name] = t;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            List<string> ret = new List<string>(m_Apis.Keys);
 | 
			
		||||
            return ret.ToArray();
 | 
			
		||||
//            m_log.DebugFormat("[API MANAGER]: Found {0} apis", m_Apis.Keys.Count);
 | 
			
		||||
 | 
			
		||||
            return new List<string>(m_Apis.Keys).ToArray();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public IScriptApi CreateApi(string api)
 | 
			
		||||
| 
						 | 
				
			
			@ -76,4 +77,4 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
 | 
			
		|||
            return ret;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -85,7 +85,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
 | 
			
		|||
        protected IScriptEngine m_ScriptEngine;
 | 
			
		||||
        protected SceneObjectPart m_host;
 | 
			
		||||
        protected uint m_localID;
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// The UUID of the item that hosts this script
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        protected UUID m_itemID;
 | 
			
		||||
 | 
			
		||||
        protected bool throwErrorOnNotImplemented = true;
 | 
			
		||||
        protected AsyncCommandManager AsyncCommands = null;
 | 
			
		||||
        protected float m_ScriptDelayFactor = 1.0f;
 | 
			
		||||
| 
						 | 
				
			
			@ -267,23 +272,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
 | 
			
		|||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        protected UUID InventorySelf()
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Get the inventory item that hosts ourselves.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <remarks>
 | 
			
		||||
        /// FIXME: It would be far easier to pass in TaskInventoryItem rather than just m_itemID so that we don't need
 | 
			
		||||
        /// to keep looking ourselves up.
 | 
			
		||||
        /// </remarks>
 | 
			
		||||
        /// <returns></returns>
 | 
			
		||||
        protected TaskInventoryItem GetSelfInventoryItem()
 | 
			
		||||
        {
 | 
			
		||||
            UUID invItemID = new UUID();
 | 
			
		||||
 | 
			
		||||
            lock (m_host.TaskInventory)
 | 
			
		||||
            {
 | 
			
		||||
                foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
 | 
			
		||||
                {
 | 
			
		||||
                    if (inv.Value.Type == 10 && inv.Value.ItemID == m_itemID)
 | 
			
		||||
                    {
 | 
			
		||||
                        invItemID = inv.Key;
 | 
			
		||||
                        break;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            return invItemID;
 | 
			
		||||
                return m_host.TaskInventory[m_itemID];
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        protected UUID InventoryKey(string name, int type)
 | 
			
		||||
| 
						 | 
				
			
			@ -839,13 +839,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
 | 
			
		|||
 | 
			
		||||
            m_host.AddScriptLPS(1);
 | 
			
		||||
 | 
			
		||||
            if (channel == ScriptBaseClass.DEBUG_CHANNEL)
 | 
			
		||||
            {
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            UUID TargetID;
 | 
			
		||||
            UUID.TryParse(target, out TargetID);
 | 
			
		||||
 | 
			
		||||
            IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>();
 | 
			
		||||
            if (wComm != null)
 | 
			
		||||
                if (!wComm.DeliverMessageTo(TargetID, channel, m_host.AbsolutePosition, m_host.Name, m_host.UUID, msg, out error))
 | 
			
		||||
                    LSLError(error);
 | 
			
		||||
                wComm.DeliverMessageTo(TargetID, channel, m_host.AbsolutePosition, m_host.Name, m_host.UUID, msg);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public LSL_Integer llListen(int channelID, string name, string ID, string msg)
 | 
			
		||||
| 
						 | 
				
			
			@ -2697,18 +2701,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
 | 
			
		|||
 | 
			
		||||
        public LSL_Integer llGiveMoney(string destination, int amount)
 | 
			
		||||
        {
 | 
			
		||||
            UUID invItemID=InventorySelf();
 | 
			
		||||
            if (invItemID == UUID.Zero)
 | 
			
		||||
                return 0;
 | 
			
		||||
 | 
			
		||||
            m_host.AddScriptLPS(1);
 | 
			
		||||
 | 
			
		||||
            TaskInventoryItem item = m_host.TaskInventory[invItemID];
 | 
			
		||||
 | 
			
		||||
            lock (m_host.TaskInventory)
 | 
			
		||||
            {
 | 
			
		||||
                item = m_host.TaskInventory[invItemID];
 | 
			
		||||
            }
 | 
			
		||||
            TaskInventoryItem item = GetSelfInventoryItem();
 | 
			
		||||
 | 
			
		||||
            if (item.PermsGranter == UUID.Zero)
 | 
			
		||||
                return 0;
 | 
			
		||||
| 
						 | 
				
			
			@ -2951,15 +2946,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
 | 
			
		|||
 | 
			
		||||
        public void llTakeControls(int controls, int accept, int pass_on)
 | 
			
		||||
        {
 | 
			
		||||
            TaskInventoryItem item;
 | 
			
		||||
 | 
			
		||||
            lock (m_host.TaskInventory)
 | 
			
		||||
            {
 | 
			
		||||
                if (!m_host.TaskInventory.ContainsKey(InventorySelf()))
 | 
			
		||||
                    return;
 | 
			
		||||
                else
 | 
			
		||||
                    item = m_host.TaskInventory[InventorySelf()];
 | 
			
		||||
            }
 | 
			
		||||
            TaskInventoryItem item = GetSelfInventoryItem();
 | 
			
		||||
 | 
			
		||||
            if (item.PermsGranter != UUID.Zero)
 | 
			
		||||
            {
 | 
			
		||||
| 
						 | 
				
			
			@ -2979,18 +2966,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
 | 
			
		|||
 | 
			
		||||
        public void llReleaseControls()
 | 
			
		||||
        {
 | 
			
		||||
            TaskInventoryItem item;
 | 
			
		||||
 | 
			
		||||
            lock (m_host.TaskInventory)
 | 
			
		||||
            {
 | 
			
		||||
                if (!m_host.TaskInventory.ContainsKey(InventorySelf()))
 | 
			
		||||
                    return;
 | 
			
		||||
                else
 | 
			
		||||
                    item = m_host.TaskInventory[InventorySelf()];
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            m_host.AddScriptLPS(1);
 | 
			
		||||
 | 
			
		||||
            TaskInventoryItem item = GetSelfInventoryItem();
 | 
			
		||||
 | 
			
		||||
            if (item.PermsGranter != UUID.Zero)
 | 
			
		||||
            {
 | 
			
		||||
                ScenePresence presence = World.GetScenePresence(item.PermsGranter);
 | 
			
		||||
| 
						 | 
				
			
			@ -3015,64 +2994,33 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
 | 
			
		|||
                m_UrlModule.ReleaseURL(url);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void llAttachToAvatar(int attachment)
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Attach the object containing this script to the avatar that owns it.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <param name='attachment'>The attachment point (e.g. ATTACH_CHEST)</param>
 | 
			
		||||
        /// <returns>true if the attach suceeded, false if it did not</returns>
 | 
			
		||||
        public bool AttachToAvatar(int attachmentPoint)
 | 
			
		||||
        {
 | 
			
		||||
            m_host.AddScriptLPS(1);
 | 
			
		||||
            SceneObjectGroup grp = m_host.ParentGroup;
 | 
			
		||||
            ScenePresence presence = World.GetScenePresence(m_host.OwnerID);
 | 
			
		||||
 | 
			
		||||
//            if (m_host.ParentGroup.RootPart.AttachmentPoint == 0)
 | 
			
		||||
//                return;
 | 
			
		||||
            IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule;
 | 
			
		||||
 | 
			
		||||
            TaskInventoryItem item;
 | 
			
		||||
 | 
			
		||||
            lock (m_host.TaskInventory)
 | 
			
		||||
            {
 | 
			
		||||
                if (!m_host.TaskInventory.ContainsKey(InventorySelf()))
 | 
			
		||||
                    return;
 | 
			
		||||
                else
 | 
			
		||||
                    item = m_host.TaskInventory[InventorySelf()];
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (item.PermsGranter != m_host.OwnerID)
 | 
			
		||||
                return;
 | 
			
		||||
 | 
			
		||||
            if ((item.PermsMask & ScriptBaseClass.PERMISSION_ATTACH) != 0)
 | 
			
		||||
            {
 | 
			
		||||
                SceneObjectGroup grp = m_host.ParentGroup;
 | 
			
		||||
 | 
			
		||||
                ScenePresence presence = World.GetScenePresence(m_host.OwnerID);
 | 
			
		||||
 | 
			
		||||
                IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule;
 | 
			
		||||
                if (attachmentsModule != null)
 | 
			
		||||
                    attachmentsModule.AttachObject(presence, grp, (uint)attachment, false);
 | 
			
		||||
            }
 | 
			
		||||
            if (attachmentsModule != null)
 | 
			
		||||
                return attachmentsModule.AttachObject(presence, grp, (uint)attachmentPoint, false);
 | 
			
		||||
            else
 | 
			
		||||
                return false;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void llDetachFromAvatar()
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Detach the object containing this script from the avatar it is attached to.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <remarks>
 | 
			
		||||
        /// Nothing happens if the object is not attached.
 | 
			
		||||
        /// </remarks>
 | 
			
		||||
        public void DetachFromAvatar()
 | 
			
		||||
        {
 | 
			
		||||
            m_host.AddScriptLPS(1);
 | 
			
		||||
 | 
			
		||||
            if (m_host.ParentGroup.AttachmentPoint == 0)
 | 
			
		||||
                return;
 | 
			
		||||
 | 
			
		||||
            TaskInventoryItem item;
 | 
			
		||||
 | 
			
		||||
            lock (m_host.TaskInventory)
 | 
			
		||||
            {
 | 
			
		||||
                if (!m_host.TaskInventory.ContainsKey(InventorySelf()))
 | 
			
		||||
                    return;
 | 
			
		||||
                else
 | 
			
		||||
                    item = m_host.TaskInventory[InventorySelf()];
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (item.PermsGranter != m_host.OwnerID)
 | 
			
		||||
                return;
 | 
			
		||||
 | 
			
		||||
            if ((item.PermsMask & ScriptBaseClass.PERMISSION_ATTACH) != 0)
 | 
			
		||||
            {
 | 
			
		||||
                IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule;
 | 
			
		||||
                if (attachmentsModule != null)
 | 
			
		||||
                    Util.FireAndForget(DetachWrapper, m_host);
 | 
			
		||||
            }
 | 
			
		||||
            Util.FireAndForget(DetachWrapper, m_host);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void DetachWrapper(object o)
 | 
			
		||||
| 
						 | 
				
			
			@ -3088,6 +3036,38 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
 | 
			
		|||
                attachmentsModule.DetachSingleAttachmentToInv(presence, itemID);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void llAttachToAvatar(int attachmentPoint)
 | 
			
		||||
        {
 | 
			
		||||
            m_host.AddScriptLPS(1);
 | 
			
		||||
 | 
			
		||||
//            if (m_host.ParentGroup.RootPart.AttachmentPoint == 0)
 | 
			
		||||
//                return;
 | 
			
		||||
 | 
			
		||||
            TaskInventoryItem item = GetSelfInventoryItem();
 | 
			
		||||
 | 
			
		||||
            if (item.PermsGranter != m_host.OwnerID)
 | 
			
		||||
                return;
 | 
			
		||||
 | 
			
		||||
            if ((item.PermsMask & ScriptBaseClass.PERMISSION_ATTACH) != 0)
 | 
			
		||||
                AttachToAvatar(attachmentPoint);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void llDetachFromAvatar()
 | 
			
		||||
        {
 | 
			
		||||
            m_host.AddScriptLPS(1);
 | 
			
		||||
 | 
			
		||||
            if (m_host.ParentGroup.AttachmentPoint == 0)
 | 
			
		||||
                return;
 | 
			
		||||
 | 
			
		||||
            TaskInventoryItem item = GetSelfInventoryItem();
 | 
			
		||||
 | 
			
		||||
            if (item.PermsGranter != m_host.OwnerID)
 | 
			
		||||
                return;
 | 
			
		||||
 | 
			
		||||
            if ((item.PermsMask & ScriptBaseClass.PERMISSION_ATTACH) != 0)
 | 
			
		||||
                DetachFromAvatar();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void llTakeCamera(string avatar)
 | 
			
		||||
        {
 | 
			
		||||
            m_host.AddScriptLPS(1);
 | 
			
		||||
| 
						 | 
				
			
			@ -3313,19 +3293,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
 | 
			
		|||
        {
 | 
			
		||||
            m_host.AddScriptLPS(1);
 | 
			
		||||
 | 
			
		||||
            UUID invItemID = InventorySelf();
 | 
			
		||||
            if (invItemID == UUID.Zero)
 | 
			
		||||
                return;
 | 
			
		||||
 | 
			
		||||
            TaskInventoryItem item;
 | 
			
		||||
 | 
			
		||||
            lock (m_host.TaskInventory)
 | 
			
		||||
            {
 | 
			
		||||
                if (!m_host.TaskInventory.ContainsKey(InventorySelf()))
 | 
			
		||||
                    return;
 | 
			
		||||
                else
 | 
			
		||||
                    item = m_host.TaskInventory[InventorySelf()];
 | 
			
		||||
            }
 | 
			
		||||
            TaskInventoryItem item = GetSelfInventoryItem();
 | 
			
		||||
 | 
			
		||||
            if (item.PermsGranter == UUID.Zero)
 | 
			
		||||
                return;
 | 
			
		||||
| 
						 | 
				
			
			@ -3350,19 +3318,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
 | 
			
		|||
        {
 | 
			
		||||
            m_host.AddScriptLPS(1);
 | 
			
		||||
 | 
			
		||||
            UUID invItemID=InventorySelf();
 | 
			
		||||
            if (invItemID == UUID.Zero)
 | 
			
		||||
                return;
 | 
			
		||||
 | 
			
		||||
            TaskInventoryItem item;
 | 
			
		||||
 | 
			
		||||
            lock (m_host.TaskInventory)
 | 
			
		||||
            {
 | 
			
		||||
                if (!m_host.TaskInventory.ContainsKey(InventorySelf()))
 | 
			
		||||
                    return;
 | 
			
		||||
                else
 | 
			
		||||
                    item = m_host.TaskInventory[InventorySelf()];
 | 
			
		||||
            }
 | 
			
		||||
            TaskInventoryItem item = GetSelfInventoryItem();
 | 
			
		||||
 | 
			
		||||
            if (item.PermsGranter == UUID.Zero)
 | 
			
		||||
                return;
 | 
			
		||||
| 
						 | 
				
			
			@ -3417,22 +3373,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
 | 
			
		|||
 | 
			
		||||
        public void llRequestPermissions(string agent, int perm)
 | 
			
		||||
        {
 | 
			
		||||
            UUID agentID = new UUID();
 | 
			
		||||
            UUID agentID;
 | 
			
		||||
 | 
			
		||||
            if (!UUID.TryParse(agent, out agentID))
 | 
			
		||||
                return;
 | 
			
		||||
 | 
			
		||||
            UUID invItemID = InventorySelf();
 | 
			
		||||
 | 
			
		||||
            if (invItemID == UUID.Zero)
 | 
			
		||||
                return; // Not in a prim? How??
 | 
			
		||||
 | 
			
		||||
            TaskInventoryItem item;
 | 
			
		||||
 | 
			
		||||
            lock (m_host.TaskInventory)
 | 
			
		||||
            {
 | 
			
		||||
                item = m_host.TaskInventory[invItemID];
 | 
			
		||||
            }
 | 
			
		||||
            TaskInventoryItem item = GetSelfInventoryItem();
 | 
			
		||||
 | 
			
		||||
            if (agentID == UUID.Zero || perm == 0) // Releasing permissions
 | 
			
		||||
            {
 | 
			
		||||
| 
						 | 
				
			
			@ -3466,8 +3412,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
 | 
			
		|||
                {
 | 
			
		||||
                    lock (m_host.TaskInventory)
 | 
			
		||||
                    {
 | 
			
		||||
                        m_host.TaskInventory[invItemID].PermsGranter = agentID;
 | 
			
		||||
                        m_host.TaskInventory[invItemID].PermsMask = perm;
 | 
			
		||||
                        m_host.TaskInventory[m_itemID].PermsGranter = agentID;
 | 
			
		||||
                        m_host.TaskInventory[m_itemID].PermsMask = perm;
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams(
 | 
			
		||||
| 
						 | 
				
			
			@ -3490,8 +3436,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
 | 
			
		|||
                {
 | 
			
		||||
                    lock (m_host.TaskInventory)
 | 
			
		||||
                    {
 | 
			
		||||
                        m_host.TaskInventory[invItemID].PermsGranter = agentID;
 | 
			
		||||
                        m_host.TaskInventory[invItemID].PermsMask = perm;
 | 
			
		||||
                        m_host.TaskInventory[m_itemID].PermsGranter = agentID;
 | 
			
		||||
                        m_host.TaskInventory[m_itemID].PermsMask = perm;
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams(
 | 
			
		||||
| 
						 | 
				
			
			@ -3515,8 +3461,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
 | 
			
		|||
                {
 | 
			
		||||
                    lock (m_host.TaskInventory)
 | 
			
		||||
                    {
 | 
			
		||||
                        m_host.TaskInventory[invItemID].PermsGranter = agentID;
 | 
			
		||||
                        m_host.TaskInventory[invItemID].PermsMask = 0;
 | 
			
		||||
                        m_host.TaskInventory[m_itemID].PermsGranter = agentID;
 | 
			
		||||
                        m_host.TaskInventory[m_itemID].PermsMask = 0;
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    presence.ControllingClient.OnScriptAnswer += handleScriptAnswer;
 | 
			
		||||
| 
						 | 
				
			
			@ -3524,7 +3470,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
 | 
			
		|||
                }
 | 
			
		||||
 | 
			
		||||
                presence.ControllingClient.SendScriptQuestion(
 | 
			
		||||
                    m_host.UUID, m_host.ParentGroup.RootPart.Name, ownerName, invItemID, perm);
 | 
			
		||||
                    m_host.UUID, m_host.ParentGroup.RootPart.Name, ownerName, m_itemID, perm);
 | 
			
		||||
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -3541,20 +3487,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
 | 
			
		|||
            if (taskID != m_host.UUID)
 | 
			
		||||
                return;
 | 
			
		||||
 | 
			
		||||
            UUID invItemID = InventorySelf();
 | 
			
		||||
 | 
			
		||||
            if (invItemID == UUID.Zero)
 | 
			
		||||
                return;
 | 
			
		||||
 | 
			
		||||
            client.OnScriptAnswer-=handleScriptAnswer;
 | 
			
		||||
            m_waitingForScriptAnswer=false;
 | 
			
		||||
            client.OnScriptAnswer -= handleScriptAnswer;
 | 
			
		||||
            m_waitingForScriptAnswer = false;
 | 
			
		||||
 | 
			
		||||
            if ((answer & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) == 0)
 | 
			
		||||
                llReleaseControls();
 | 
			
		||||
 | 
			
		||||
            lock (m_host.TaskInventory)
 | 
			
		||||
            {
 | 
			
		||||
                m_host.TaskInventory[invItemID].PermsMask = answer;
 | 
			
		||||
                m_host.TaskInventory[m_itemID].PermsMask = answer;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams(
 | 
			
		||||
| 
						 | 
				
			
			@ -3567,39 +3508,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
 | 
			
		|||
        {
 | 
			
		||||
            m_host.AddScriptLPS(1);
 | 
			
		||||
 | 
			
		||||
            lock (m_host.TaskInventory)
 | 
			
		||||
            {
 | 
			
		||||
                foreach (TaskInventoryItem item in m_host.TaskInventory.Values)
 | 
			
		||||
                {
 | 
			
		||||
                    if (item.Type == 10 && item.ItemID == m_itemID)
 | 
			
		||||
                    {
 | 
			
		||||
                        return item.PermsGranter.ToString();
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            return UUID.Zero.ToString();
 | 
			
		||||
            return GetSelfInventoryItem().PermsGranter.ToString();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public LSL_Integer llGetPermissions()
 | 
			
		||||
        {
 | 
			
		||||
            m_host.AddScriptLPS(1);
 | 
			
		||||
 | 
			
		||||
            lock (m_host.TaskInventory)
 | 
			
		||||
            {
 | 
			
		||||
                foreach (TaskInventoryItem item in m_host.TaskInventory.Values)
 | 
			
		||||
                {
 | 
			
		||||
                    if (item.Type == 10 && item.ItemID == m_itemID)
 | 
			
		||||
                    {
 | 
			
		||||
                        int perms = item.PermsMask;
 | 
			
		||||
                        if (m_automaticLinkPermission)
 | 
			
		||||
                            perms |= ScriptBaseClass.PERMISSION_CHANGE_LINKS;
 | 
			
		||||
                        return perms;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            int perms = GetSelfInventoryItem().PermsMask;
 | 
			
		||||
 | 
			
		||||
            return 0;
 | 
			
		||||
            if (m_automaticLinkPermission)
 | 
			
		||||
                perms |= ScriptBaseClass.PERMISSION_CHANGE_LINKS;
 | 
			
		||||
 | 
			
		||||
            return perms;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public LSL_Integer llGetLinkNumber()
 | 
			
		||||
| 
						 | 
				
			
			@ -3627,17 +3548,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
 | 
			
		|||
        public void llCreateLink(string target, int parent)
 | 
			
		||||
        {
 | 
			
		||||
            m_host.AddScriptLPS(1);
 | 
			
		||||
            UUID invItemID = InventorySelf();
 | 
			
		||||
 | 
			
		||||
            UUID targetID;
 | 
			
		||||
 | 
			
		||||
            if (!UUID.TryParse(target, out targetID))
 | 
			
		||||
                return;
 | 
			
		||||
 | 
			
		||||
            TaskInventoryItem item;
 | 
			
		||||
            lock (m_host.TaskInventory)
 | 
			
		||||
            {
 | 
			
		||||
                item = m_host.TaskInventory[invItemID];
 | 
			
		||||
            }
 | 
			
		||||
            TaskInventoryItem item = GetSelfInventoryItem();
 | 
			
		||||
 | 
			
		||||
            if ((item.PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0
 | 
			
		||||
                && !m_automaticLinkPermission)
 | 
			
		||||
| 
						 | 
				
			
			@ -3688,16 +3605,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
 | 
			
		|||
        public void llBreakLink(int linknum)
 | 
			
		||||
        {
 | 
			
		||||
            m_host.AddScriptLPS(1);
 | 
			
		||||
            UUID invItemID = InventorySelf();
 | 
			
		||||
 | 
			
		||||
            lock (m_host.TaskInventory)
 | 
			
		||||
            if ((GetSelfInventoryItem().PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0
 | 
			
		||||
                && !m_automaticLinkPermission)
 | 
			
		||||
            {
 | 
			
		||||
                if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0
 | 
			
		||||
                    && !m_automaticLinkPermission)
 | 
			
		||||
                {
 | 
			
		||||
                    ShoutError("Script trying to link but PERMISSION_CHANGE_LINKS permission not set!");
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
                ShoutError("Script trying to link but PERMISSION_CHANGE_LINKS permission not set!");
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (linknum < ScriptBaseClass.LINK_THIS)
 | 
			
		||||
| 
						 | 
				
			
			@ -4574,23 +4487,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
 | 
			
		|||
 | 
			
		||||
        public LSL_String llGetScriptName()
 | 
			
		||||
        {
 | 
			
		||||
            string result = String.Empty;
 | 
			
		||||
 | 
			
		||||
            m_host.AddScriptLPS(1);
 | 
			
		||||
 | 
			
		||||
            lock (m_host.TaskInventory)
 | 
			
		||||
            {
 | 
			
		||||
                foreach (TaskInventoryItem item in m_host.TaskInventory.Values)
 | 
			
		||||
                {
 | 
			
		||||
                    if (item.Type == 10 && item.ItemID == m_itemID)
 | 
			
		||||
                    {
 | 
			
		||||
                        result = item.Name != null ? item.Name : String.Empty;
 | 
			
		||||
                        break;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            TaskInventoryItem item = GetSelfInventoryItem();
 | 
			
		||||
 | 
			
		||||
            return result;
 | 
			
		||||
            return item.Name != null ? item.Name : String.Empty;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public LSL_Integer llGetLinkNumberOfSides(int link)
 | 
			
		||||
| 
						 | 
				
			
			@ -9691,21 +9592,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
 | 
			
		|||
        public LSL_Vector llGetCameraPos()
 | 
			
		||||
        {
 | 
			
		||||
            m_host.AddScriptLPS(1);
 | 
			
		||||
            UUID invItemID = InventorySelf();
 | 
			
		||||
 | 
			
		||||
            if (invItemID == UUID.Zero)
 | 
			
		||||
                return new LSL_Vector();
 | 
			
		||||
            TaskInventoryItem item = GetSelfInventoryItem();
 | 
			
		||||
 | 
			
		||||
            lock (m_host.TaskInventory)
 | 
			
		||||
            if (item.PermsGranter == UUID.Zero)
 | 
			
		||||
               return new LSL_Vector();
 | 
			
		||||
 | 
			
		||||
            if ((item.PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0)
 | 
			
		||||
            {
 | 
			
		||||
                if (m_host.TaskInventory[invItemID].PermsGranter == UUID.Zero)
 | 
			
		||||
                   return new LSL_Vector();
 | 
			
		||||
 | 
			
		||||
                if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0)
 | 
			
		||||
                {
 | 
			
		||||
                    ShoutError("No permissions to track the camera");
 | 
			
		||||
                    return new LSL_Vector();
 | 
			
		||||
                }
 | 
			
		||||
                ShoutError("No permissions to track the camera");
 | 
			
		||||
                return new LSL_Vector();
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            ScenePresence presence = World.GetScenePresence(m_host.OwnerID);
 | 
			
		||||
| 
						 | 
				
			
			@ -9720,20 +9616,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
 | 
			
		|||
        public LSL_Rotation llGetCameraRot()
 | 
			
		||||
        {
 | 
			
		||||
            m_host.AddScriptLPS(1);
 | 
			
		||||
            UUID invItemID = InventorySelf();
 | 
			
		||||
            if (invItemID == UUID.Zero)
 | 
			
		||||
                return new LSL_Rotation();
 | 
			
		||||
 | 
			
		||||
            lock (m_host.TaskInventory)
 | 
			
		||||
            TaskInventoryItem item = GetSelfInventoryItem();
 | 
			
		||||
 | 
			
		||||
            if (item.PermsGranter == UUID.Zero)
 | 
			
		||||
               return new LSL_Rotation();
 | 
			
		||||
 | 
			
		||||
            if ((item.PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0)
 | 
			
		||||
            {
 | 
			
		||||
                if (m_host.TaskInventory[invItemID].PermsGranter == UUID.Zero)
 | 
			
		||||
                   return new LSL_Rotation();
 | 
			
		||||
 | 
			
		||||
                if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0)
 | 
			
		||||
                {
 | 
			
		||||
                    ShoutError("No permissions to track the camera");
 | 
			
		||||
                    return new LSL_Rotation();
 | 
			
		||||
                }
 | 
			
		||||
                ShoutError("No permissions to track the camera");
 | 
			
		||||
                return new LSL_Rotation();
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            ScenePresence presence = World.GetScenePresence(m_host.OwnerID);
 | 
			
		||||
| 
						 | 
				
			
			@ -9907,23 +9799,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
 | 
			
		|||
        {
 | 
			
		||||
            m_host.AddScriptLPS(1);
 | 
			
		||||
 | 
			
		||||
            // our key in the object we are in
 | 
			
		||||
            UUID invItemID = InventorySelf();
 | 
			
		||||
            if (invItemID == UUID.Zero) return;
 | 
			
		||||
 | 
			
		||||
            // the object we are in
 | 
			
		||||
            UUID objectID = m_host.ParentUUID;
 | 
			
		||||
            if (objectID == UUID.Zero) return;
 | 
			
		||||
            if (objectID == UUID.Zero)
 | 
			
		||||
                return;
 | 
			
		||||
 | 
			
		||||
            UUID agentID;
 | 
			
		||||
            lock (m_host.TaskInventory)
 | 
			
		||||
            {
 | 
			
		||||
                // we need the permission first, to know which avatar we want to set the camera for
 | 
			
		||||
                agentID = m_host.TaskInventory[invItemID].PermsGranter;
 | 
			
		||||
            TaskInventoryItem item = GetSelfInventoryItem();
 | 
			
		||||
 | 
			
		||||
                if (agentID == UUID.Zero) return;
 | 
			
		||||
                if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0) return;
 | 
			
		||||
            }
 | 
			
		||||
            // we need the permission first, to know which avatar we want to set the camera for
 | 
			
		||||
            UUID agentID = item.PermsGranter;
 | 
			
		||||
 | 
			
		||||
            if (agentID == UUID.Zero)
 | 
			
		||||
                return;
 | 
			
		||||
 | 
			
		||||
            if ((item.PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0)
 | 
			
		||||
                return;
 | 
			
		||||
 | 
			
		||||
            ScenePresence presence = World.GetScenePresence(agentID);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -9963,27 +9853,27 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
 | 
			
		|||
        {
 | 
			
		||||
            m_host.AddScriptLPS(1);
 | 
			
		||||
 | 
			
		||||
            // our key in the object we are in
 | 
			
		||||
            UUID invItemID=InventorySelf();
 | 
			
		||||
            if (invItemID == UUID.Zero) return;
 | 
			
		||||
 | 
			
		||||
            // the object we are in
 | 
			
		||||
            UUID objectID = m_host.ParentUUID;
 | 
			
		||||
            if (objectID == UUID.Zero) return;
 | 
			
		||||
            if (objectID == UUID.Zero)
 | 
			
		||||
                return;
 | 
			
		||||
 | 
			
		||||
            TaskInventoryItem item = GetSelfInventoryItem();
 | 
			
		||||
 | 
			
		||||
            // we need the permission first, to know which avatar we want to clear the camera for
 | 
			
		||||
            UUID agentID;
 | 
			
		||||
            lock (m_host.TaskInventory)
 | 
			
		||||
            {
 | 
			
		||||
                agentID = m_host.TaskInventory[invItemID].PermsGranter;
 | 
			
		||||
                if (agentID == UUID.Zero) return;
 | 
			
		||||
                if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0) return;
 | 
			
		||||
            }
 | 
			
		||||
            UUID agentID = item.PermsGranter;
 | 
			
		||||
 | 
			
		||||
            if (agentID == UUID.Zero)
 | 
			
		||||
                return;
 | 
			
		||||
 | 
			
		||||
            if ((item.PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0)
 | 
			
		||||
                return;
 | 
			
		||||
 | 
			
		||||
            ScenePresence presence = World.GetScenePresence(agentID);
 | 
			
		||||
 | 
			
		||||
            // we are not interested in child-agents
 | 
			
		||||
            if (presence.IsChildAgent) return;
 | 
			
		||||
            if (presence.IsChildAgent)
 | 
			
		||||
                return;
 | 
			
		||||
 | 
			
		||||
            presence.ControllingClient.SendClearFollowCamProperties(objectID);
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -209,6 +209,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
 | 
			
		|||
            throw new Exception("OSSL Runtime Error: " + msg);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Initialize the LSL interface.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <remarks>
 | 
			
		||||
        /// FIXME: This is an abomination.  We should be able to set this up earlier but currently we have no
 | 
			
		||||
        /// guarantee the interface is present on Initialize().  There needs to be another post initialize call from
 | 
			
		||||
        /// ScriptInstance.
 | 
			
		||||
        /// </remarks>
 | 
			
		||||
        private void InitLSL()
 | 
			
		||||
        {
 | 
			
		||||
            if (m_LSL_Api != null)
 | 
			
		||||
| 
						 | 
				
			
			@ -1609,7 +1617,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
 | 
			
		|||
 | 
			
		||||
        public Object osParseJSONNew(string JSON)
 | 
			
		||||
        {
 | 
			
		||||
            CheckThreatLevel(ThreatLevel.None, "osParseJSON");
 | 
			
		||||
            CheckThreatLevel(ThreatLevel.None, "osParseJSONNew");
 | 
			
		||||
 | 
			
		||||
            m_host.AddScriptLPS(1);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -3093,5 +3101,25 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
 | 
			
		|||
                    estate.setEstateTerrainTextureHeights(corner, (float)low, (float)high);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void osForceAttachToAvatar(int attachmentPoint)
 | 
			
		||||
        {
 | 
			
		||||
            CheckThreatLevel(ThreatLevel.High, "osForceAttachToAvatar");
 | 
			
		||||
 | 
			
		||||
            m_host.AddScriptLPS(1);
 | 
			
		||||
 | 
			
		||||
            InitLSL();
 | 
			
		||||
            ((LSL_Api)m_LSL_Api).AttachToAvatar(attachmentPoint);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void osForceDetachFromAvatar()
 | 
			
		||||
        {
 | 
			
		||||
            CheckThreatLevel(ThreatLevel.High, "osForceDetachFromAvatar");
 | 
			
		||||
 | 
			
		||||
            m_host.AddScriptLPS(1);
 | 
			
		||||
 | 
			
		||||
            InitLSL();
 | 
			
		||||
            ((LSL_Api)m_LSL_Api).DetachFromAvatar();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -98,6 +98,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
 | 
			
		|||
        void osAvatarPlayAnimation(string avatar, string animation);
 | 
			
		||||
        void osAvatarStopAnimation(string avatar, string animation);
 | 
			
		||||
 | 
			
		||||
        // Attachment commands
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Attach the object containing this script to the avatar that owns it without checking for PERMISSION_ATTACH
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <param name='attachment'>The attachment point.  For example, ATTACH_CHEST</param>
 | 
			
		||||
        void osForceAttachToAvatar(int attachment);
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Detach the object containing this script from the avatar it is attached to without checking for PERMISSION_ATTACH
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <remarks>Nothing happens if the object is not attached.</remarks>
 | 
			
		||||
        void osForceDetachFromAvatar();
 | 
			
		||||
 | 
			
		||||
        //texture draw functions
 | 
			
		||||
        string osMovePen(string drawList, int x, int y);
 | 
			
		||||
        string osDrawLine(string drawList, int startX, int startY, int endX, int endY);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -289,8 +289,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
 | 
			
		|||
            m_OSSL_Functions.osAvatarStopAnimation(avatar, animation);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Avatar functions
 | 
			
		||||
 | 
			
		||||
        //Texture Draw functions
 | 
			
		||||
        public void osForceAttachToAvatar(int attachmentPoint)
 | 
			
		||||
        {
 | 
			
		||||
            m_OSSL_Functions.osForceAttachToAvatar(attachmentPoint);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void osForceDetachFromAvatar()
 | 
			
		||||
        {
 | 
			
		||||
            m_OSSL_Functions.osForceDetachFromAvatar();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Texture Draw functions
 | 
			
		||||
 | 
			
		||||
        public string osMovePen(string drawList, int x, int y)
 | 
			
		||||
        {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -964,7 +964,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
 | 
			
		|||
        public IScriptApi GetApi(string name)
 | 
			
		||||
        {
 | 
			
		||||
            if (m_Apis.ContainsKey(name))
 | 
			
		||||
            {
 | 
			
		||||
//                m_log.DebugFormat("[SCRIPT INSTANCE]: Found api {0} in {1}@{2}", name, ScriptName, PrimName);
 | 
			
		||||
 | 
			
		||||
                return m_Apis[name];
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
//            m_log.DebugFormat("[SCRIPT INSTANCE]: Did not find api {0} in {1}@{2}", name, ScriptName, PrimName);
 | 
			
		||||
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1021,11 +1021,18 @@ namespace OpenSim.Region.ScriptEngine.XEngine
 | 
			
		|||
 | 
			
		||||
                            AppDomain sandbox;
 | 
			
		||||
                            if (m_AppDomainLoading)
 | 
			
		||||
                            {
 | 
			
		||||
                                sandbox = AppDomain.CreateDomain(
 | 
			
		||||
                                                m_Scene.RegionInfo.RegionID.ToString(),
 | 
			
		||||
                                                evidence, appSetup);
 | 
			
		||||
                                sandbox.AssemblyResolve +=
 | 
			
		||||
                                    new ResolveEventHandler(
 | 
			
		||||
                                        AssemblyResolver.OnAssemblyResolve);
 | 
			
		||||
                            }
 | 
			
		||||
                            else
 | 
			
		||||
                            {
 | 
			
		||||
                                sandbox = AppDomain.CurrentDomain;
 | 
			
		||||
                            }
 | 
			
		||||
                            
 | 
			
		||||
                            //PolicyLevel sandboxPolicy = PolicyLevel.CreateAppDomainLevel();
 | 
			
		||||
                            //AllMembershipCondition sandboxMembershipCondition = new AllMembershipCondition();
 | 
			
		||||
| 
						 | 
				
			
			@ -1037,9 +1044,6 @@ namespace OpenSim.Region.ScriptEngine.XEngine
 | 
			
		|||
                            
 | 
			
		||||
                            m_AppDomains[appDomain] = sandbox;
 | 
			
		||||
 | 
			
		||||
                            m_AppDomains[appDomain].AssemblyResolve +=
 | 
			
		||||
                                new ResolveEventHandler(
 | 
			
		||||
                                    AssemblyResolver.OnAssemblyResolve);
 | 
			
		||||
                            m_DomainScripts[appDomain] = new List<UUID>();
 | 
			
		||||
                        }
 | 
			
		||||
                        catch (Exception e)
 | 
			
		||||
| 
						 | 
				
			
			@ -1808,9 +1812,11 @@ namespace OpenSim.Region.ScriptEngine.XEngine
 | 
			
		|||
                        // if there already exists a file at that location, it may be locked.
 | 
			
		||||
                        m_log.ErrorFormat("[XEngine]: File {0} already exists! {1}", path, ex.Message);
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    string textpath = path + ".text";
 | 
			
		||||
                    try
 | 
			
		||||
                    {
 | 
			
		||||
                        using (FileStream fs = File.Create(path + ".text"))
 | 
			
		||||
                        using (FileStream fs = File.Create(textpath))
 | 
			
		||||
                        {
 | 
			
		||||
                            using (StreamWriter sw = new StreamWriter(fs))
 | 
			
		||||
                            {
 | 
			
		||||
| 
						 | 
				
			
			@ -1823,7 +1829,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
 | 
			
		|||
                    catch (IOException ex)
 | 
			
		||||
                    {
 | 
			
		||||
                        // if there already exists a file at that location, it may be locked.
 | 
			
		||||
                        m_log.ErrorFormat("[XEngine]: File {0} already exists! {1}", path, ex.Message);
 | 
			
		||||
                        m_log.ErrorFormat("[XEngine]: File {0} already exists! {1}", textpath, ex.Message);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -1872,7 +1878,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
 | 
			
		|||
                catch (IOException ex)
 | 
			
		||||
                {
 | 
			
		||||
                    // if there already exists a file at that location, it may be locked.
 | 
			
		||||
                    m_log.ErrorFormat("[XEngine]: File {0} already exists! {1}", statepath, ex.Message);
 | 
			
		||||
                    m_log.ErrorFormat("[XEngine]: File {0} already exists! {1}", mappath, ex.Message);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1984,4 +1990,4 @@ namespace OpenSim.Region.ScriptEngine.XEngine
 | 
			
		|||
//                m_log.DebugFormat("[XEngine]: Could not find script with ID {0} to resume", itemID);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -117,7 +117,10 @@ namespace OpenSim.Server.Base
 | 
			
		|||
                            catch (Exception e)
 | 
			
		||||
                            {
 | 
			
		||||
                                if (!(e is System.MissingMethodException))
 | 
			
		||||
                                    m_log.ErrorFormat("Error loading plugin from {0}, exception {1}", dllName, e.InnerException);
 | 
			
		||||
                                {
 | 
			
		||||
                                    m_log.ErrorFormat("Error loading plugin {0} from {1}. Exception: {2}",
 | 
			
		||||
                                        interfaceName, dllName, e.InnerException == null ? e.Message : e.InnerException.Message);
 | 
			
		||||
                                }
 | 
			
		||||
                                return null;
 | 
			
		||||
                            }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -93,7 +93,7 @@ namespace OpenSim.Services.AvatarService
 | 
			
		|||
                if (kvp.Key.StartsWith("_"))
 | 
			
		||||
                    count++;
 | 
			
		||||
 | 
			
		||||
            m_log.DebugFormat("[AVATAR SERVICE]: SetAvatar for {0}, attachs={1}", principalID, count);
 | 
			
		||||
//            m_log.DebugFormat("[AVATAR SERVICE]: SetAvatar for {0}, attachs={1}", principalID, count);
 | 
			
		||||
            m_Database.Delete("PrincipalID", principalID.ToString());
 | 
			
		||||
 | 
			
		||||
            AvatarBaseData av = new AvatarBaseData();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -154,7 +154,7 @@ namespace OpenSim.Services.Connectors.Hypergrid
 | 
			
		|||
 | 
			
		||||
            UUID mapTile = m_HGMapImage;
 | 
			
		||||
            string filename = string.Empty;
 | 
			
		||||
            Bitmap bitmap = null;
 | 
			
		||||
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                WebClient c = new WebClient();
 | 
			
		||||
| 
						 | 
				
			
			@ -167,11 +167,18 @@ namespace OpenSim.Services.Connectors.Hypergrid
 | 
			
		|||
                    c.DownloadFile(imageURL, filename);
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    m_log.DebugFormat("[GATEKEEPER SERVICE CONNECTOR]: using cached image");
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                bitmap = new Bitmap(filename);
 | 
			
		||||
                //m_log.Debug("Size: " + m.PhysicalDimension.Height + "-" + m.PhysicalDimension.Width);
 | 
			
		||||
                byte[] imageData = OpenJPEG.EncodeFromImage(bitmap, true);
 | 
			
		||||
                byte[] imageData = null;
 | 
			
		||||
 | 
			
		||||
                using (Bitmap bitmap = new Bitmap(filename))
 | 
			
		||||
                {
 | 
			
		||||
                    //m_log.Debug("Size: " + m.PhysicalDimension.Height + "-" + m.PhysicalDimension.Width);
 | 
			
		||||
                    imageData = OpenJPEG.EncodeFromImage(bitmap, true);
 | 
			
		||||
                }
 | 
			
		||||
                
 | 
			
		||||
                AssetBase ass = new AssetBase(UUID.Random(), "region " + name, (sbyte)AssetType.Texture, regionID.ToString());
 | 
			
		||||
 | 
			
		||||
                // !!! for now
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -349,7 +349,31 @@ namespace OpenSim.Services.LLLoginService
 | 
			
		|||
 | 
			
		||||
        private void SetDefaultValues()
 | 
			
		||||
        {
 | 
			
		||||
            DST = TimeZone.CurrentTimeZone.IsDaylightSavingTime(DateTime.Now) ? "Y" : "N";
 | 
			
		||||
            TimeZoneInfo gridTimeZone;
 | 
			
		||||
 | 
			
		||||
            // Disabled for now pending making timezone a config value, which can at some point have a default of
 | 
			
		||||
            // a ; separated list of possible timezones.
 | 
			
		||||
            // The problem here is that US/Pacific (or even the Olsen America/Los_Angeles) is not universal across
 | 
			
		||||
            // windows, mac and various distributions of linux, introducing another element of consistency.
 | 
			
		||||
            // The server operator needs to be able to control this setting
 | 
			
		||||
//            try
 | 
			
		||||
//            {
 | 
			
		||||
//                // First try to fetch DST from Pacific Standard Time, because this is
 | 
			
		||||
//                // the one expected by the viewer. "US/Pacific" is the string to search 
 | 
			
		||||
//                // on linux and mac, and should work also on Windows (to confirm)
 | 
			
		||||
//                gridTimeZone = TimeZoneInfo.FindSystemTimeZoneById("US/Pacific");
 | 
			
		||||
//            }
 | 
			
		||||
//            catch (Exception e)
 | 
			
		||||
//            {
 | 
			
		||||
//                m_log.WarnFormat(
 | 
			
		||||
//                    "[TIMEZONE]: {0} Falling back to system time. System time should be set to Pacific Standard Time to provide the expected time",
 | 
			
		||||
//                    e.Message);
 | 
			
		||||
 | 
			
		||||
                gridTimeZone = TimeZoneInfo.Local;
 | 
			
		||||
//            }
 | 
			
		||||
 | 
			
		||||
            DST = gridTimeZone.IsDaylightSavingTime(DateTime.Now) ? "Y" : "N";
 | 
			
		||||
 | 
			
		||||
            StipendSinceLogin = "N";
 | 
			
		||||
            Gendered = "Y";
 | 
			
		||||
            EverLoggedIn = "Y";
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -153,7 +153,7 @@ namespace OpenSim.Tests.Common
 | 
			
		|||
            PhysicsPluginManager physicsPluginManager = new PhysicsPluginManager();
 | 
			
		||||
            physicsPluginManager.LoadPluginsFromAssembly("Physics/OpenSim.Region.Physics.BasicPhysicsPlugin.dll");
 | 
			
		||||
            testScene.PhysicsScene
 | 
			
		||||
                = physicsPluginManager.GetPhysicsScene("basicphysics", "ZeroMesher",   new IniConfigSource(), "test");
 | 
			
		||||
                = physicsPluginManager.GetPhysicsScene("basicphysics", "ZeroMesher", new IniConfigSource(), "test");
 | 
			
		||||
 | 
			
		||||
            testScene.RegionInfo.EstateSettings = new EstateSettings();
 | 
			
		||||
            testScene.LoginsDisabled = false;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue