aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Environment/Scenes
diff options
context:
space:
mode:
authorAdam Frisby2008-05-01 18:04:42 +0000
committerAdam Frisby2008-05-01 18:04:42 +0000
commit20a9bf08f51351e1e0a9de94f184ff56cd572665 (patch)
tree52da64dab26353b903c8e4befed0178fa72a188b /OpenSim/Region/Environment/Scenes
parentMore config cleanup in LaunchSLClient. (diff)
downloadopensim-SC_OLD-20a9bf08f51351e1e0a9de94f184ff56cd572665.zip
opensim-SC_OLD-20a9bf08f51351e1e0a9de94f184ff56cd572665.tar.gz
opensim-SC_OLD-20a9bf08f51351e1e0a9de94f184ff56cd572665.tar.bz2
opensim-SC_OLD-20a9bf08f51351e1e0a9de94f184ff56cd572665.tar.xz
* Rolled back a few changes.
Diffstat (limited to 'OpenSim/Region/Environment/Scenes')
-rw-r--r--OpenSim/Region/Environment/Scenes/AvatarAnimations.cs6
-rw-r--r--OpenSim/Region/Environment/Scenes/AvatarAppearance.cs123
-rw-r--r--OpenSim/Region/Environment/Scenes/EntityBase.cs193
-rw-r--r--OpenSim/Region/Environment/Scenes/IScenePresenceBody.cs2
-rw-r--r--OpenSim/Region/Environment/Scenes/InnerScene.cs198
-rw-r--r--OpenSim/Region/Environment/Scenes/Scene.Inventory.cs316
-rw-r--r--OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs30
-rw-r--r--OpenSim/Region/Environment/Scenes/Scene.cs561
-rw-r--r--OpenSim/Region/Environment/Scenes/SceneBase.cs71
-rw-r--r--OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs534
-rw-r--r--OpenSim/Region/Environment/Scenes/SceneEvents.cs337
-rw-r--r--OpenSim/Region/Environment/Scenes/SceneManager.cs82
-rw-r--r--OpenSim/Region/Environment/Scenes/SceneObjectGroup.Inventory.cs59
-rw-r--r--OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs377
-rw-r--r--OpenSim/Region/Environment/Scenes/SceneObjectPart.Inventory.cs150
-rw-r--r--OpenSim/Region/Environment/Scenes/SceneObjectPart.cs1964
-rw-r--r--OpenSim/Region/Environment/Scenes/ScenePresence.cs1502
-rw-r--r--OpenSim/Region/Environment/Scenes/SceneXmlLoader.cs10
-rw-r--r--OpenSim/Region/Environment/Scenes/Scripting/IScriptHost.cs2
-rw-r--r--OpenSim/Region/Environment/Scenes/Scripting/NullScriptHost.cs8
-rw-r--r--OpenSim/Region/Environment/Scenes/Scripting/ScriptEngineInterface.cs2
-rw-r--r--OpenSim/Region/Environment/Scenes/Scripting/ScriptEngineLoader.cs4
-rw-r--r--OpenSim/Region/Environment/Scenes/SimStatsReporter.cs274
-rw-r--r--OpenSim/Region/Environment/Scenes/UndoState.cs20
24 files changed, 3461 insertions, 3364 deletions
diff --git a/OpenSim/Region/Environment/Scenes/AvatarAnimations.cs b/OpenSim/Region/Environment/Scenes/AvatarAnimations.cs
index 2fc2a10..fe9c8e7 100644
--- a/OpenSim/Region/Environment/Scenes/AvatarAnimations.cs
+++ b/OpenSim/Region/Environment/Scenes/AvatarAnimations.cs
@@ -46,8 +46,8 @@ namespace OpenSim.Region.Environment.Scenes
46 { 46 {
47 if (nod.Attributes["name"] != null) 47 if (nod.Attributes["name"] != null)
48 { 48 {
49 string name = nod.Attributes["name"].Value; 49 string name = (string)nod.Attributes["name"].Value;
50 LLUUID id = (LLUUID) nod.InnerText; 50 LLUUID id = (LLUUID)nod.InnerText;
51 51
52 AnimsLLUUID.Add(name, id); 52 AnimsLLUUID.Add(name, id);
53 AnimsNames.Add(id, name); 53 AnimsNames.Add(id, name);
@@ -56,4 +56,4 @@ namespace OpenSim.Region.Environment.Scenes
56 } 56 }
57 } 57 }
58 } 58 }
59} \ No newline at end of file 59}
diff --git a/OpenSim/Region/Environment/Scenes/AvatarAppearance.cs b/OpenSim/Region/Environment/Scenes/AvatarAppearance.cs
index 860399c..8f29507 100644
--- a/OpenSim/Region/Environment/Scenes/AvatarAppearance.cs
+++ b/OpenSim/Region/Environment/Scenes/AvatarAppearance.cs
@@ -37,54 +37,14 @@ namespace OpenSim.Region.Environment.Scenes
37 [Serializable] 37 [Serializable]
38 public class AvatarAppearance : ISerializable 38 public class AvatarAppearance : ISerializable
39 { 39 {
40 protected float m_avatarHeight;
41 protected LLUUID m_scenePresenceID; 40 protected LLUUID m_scenePresenceID;
42 protected LLObject.TextureEntry m_textureEntry;
43 protected byte[] m_visualParams;
44 protected AvatarWearable[] m_wearables;
45
46 protected int m_wearablesSerial = 1;
47
48 public AvatarAppearance()
49 {
50 }
51
52 public AvatarAppearance(LLUUID avatarID, AvatarWearable[] wearables, byte[] visualParams)
53 {
54 m_scenePresenceID = avatarID;
55 m_wearablesSerial = 1;
56 m_wearables = wearables;
57 m_visualParams = visualParams;
58 m_textureEntry = GetDefaultTextureEntry();
59 }
60
61 protected AvatarAppearance(SerializationInfo info, StreamingContext context)
62 {
63 //System.Console.WriteLine("AvatarAppearance Deserialize BGN");
64
65 if (info == null)
66 {
67 throw new ArgumentNullException("info");
68 }
69
70 m_scenePresenceID = new LLUUID((Guid) info.GetValue("m_scenePresenceID", typeof (Guid)));
71 m_wearablesSerial = (int) info.GetValue("m_wearablesSerial", typeof (int));
72 m_visualParams = (byte[]) info.GetValue("m_visualParams", typeof (byte[]));
73 m_wearables = (AvatarWearable[]) info.GetValue("m_wearables", typeof (AvatarWearable[]));
74
75 byte[] m_textureEntry_work = (byte[]) info.GetValue("m_textureEntry", typeof (byte[]));
76 m_textureEntry = new LLObject.TextureEntry(m_textureEntry_work, 0, m_textureEntry_work.Length);
77
78 m_avatarHeight = (float) info.GetValue("m_avatarHeight", typeof (float));
79
80 //System.Console.WriteLine("AvatarAppearance Deserialize END");
81 }
82 41
83 public LLUUID ScenePresenceID 42 public LLUUID ScenePresenceID
84 { 43 {
85 get { return m_scenePresenceID; } 44 get { return m_scenePresenceID; }
86 set { m_scenePresenceID = value; } 45 set { m_scenePresenceID = value; }
87 } 46 }
47 protected int m_wearablesSerial = 1;
88 48
89 public int WearablesSerial 49 public int WearablesSerial
90 { 50 {
@@ -92,51 +52,50 @@ namespace OpenSim.Region.Environment.Scenes
92 set { m_wearablesSerial = value; } 52 set { m_wearablesSerial = value; }
93 } 53 }
94 54
55 protected byte[] m_visualParams;
56
95 public byte[] VisualParams 57 public byte[] VisualParams
96 { 58 {
97 get { return m_visualParams; } 59 get { return m_visualParams; }
98 set { m_visualParams = value; } 60 set { m_visualParams = value; }
99 } 61 }
100 62
63 protected AvatarWearable[] m_wearables;
64
101 public AvatarWearable[] Wearables 65 public AvatarWearable[] Wearables
102 { 66 {
103 get { return m_wearables; } 67 get { return m_wearables; }
104 set { m_wearables = value; } 68 set { m_wearables = value; }
105 } 69 }
106 70
71 protected LLObject.TextureEntry m_textureEntry;
72
107 public LLObject.TextureEntry TextureEntry 73 public LLObject.TextureEntry TextureEntry
108 { 74 {
109 get { return m_textureEntry; } 75 get { return m_textureEntry; }
110 set { m_textureEntry = value; } 76 set { m_textureEntry = value; }
111 } 77 }
112 78
79 protected float m_avatarHeight = 0;
80
113 public float AvatarHeight 81 public float AvatarHeight
114 { 82 {
115 get { return m_avatarHeight; } 83 get { return m_avatarHeight; }
116 set { m_avatarHeight = value; } 84 set { m_avatarHeight = value; }
117 } 85 }
118 86
119 #region ISerializable Members 87 public AvatarAppearance()
120
121 [SecurityPermission(SecurityAction.LinkDemand,
122 Flags = SecurityPermissionFlag.SerializationFormatter)]
123 public virtual void GetObjectData(
124 SerializationInfo info, StreamingContext context)
125 { 88 {
126 if (info == null)
127 {
128 throw new ArgumentNullException("info");
129 }
130
131 info.AddValue("m_scenePresenceID", m_scenePresenceID.UUID);
132 info.AddValue("m_wearablesSerial", m_wearablesSerial);
133 info.AddValue("m_visualParams", m_visualParams);
134 info.AddValue("m_wearables", m_wearables);
135 info.AddValue("m_textureEntry", m_textureEntry.ToBytes());
136 info.AddValue("m_avatarHeight", m_avatarHeight);
137 } 89 }
138 90
139 #endregion 91 public AvatarAppearance(LLUUID avatarID, AvatarWearable[] wearables, byte[] visualParams)
92 {
93 m_scenePresenceID = avatarID;
94 m_wearablesSerial = 1;
95 m_wearables = wearables;
96 m_visualParams = visualParams;
97 m_textureEntry = GetDefaultTextureEntry();
98 }
140 99
141 /// <summary> 100 /// <summary>
142 /// 101 ///
@@ -156,8 +115,8 @@ namespace OpenSim.Region.Environment.Scenes
156 // Teravus : Nifty AV Height Getting Maaaaagical formula. Oh how we love turning 0-255 into meters. 115 // Teravus : Nifty AV Height Getting Maaaaagical formula. Oh how we love turning 0-255 into meters.
157 // (float)m_visualParams[25] = Height 116 // (float)m_visualParams[25] = Height
158 // (float)m_visualParams[125] = LegLength 117 // (float)m_visualParams[125] = LegLength
159 m_avatarHeight = (1.50856f + ((m_visualParams[25] / 255.0f) * (2.525506f - 1.50856f))) 118 m_avatarHeight = (1.50856f + (((float) m_visualParams[25]/255.0f)*(2.525506f - 1.50856f)))
160 + ((m_visualParams[125] / 255.0f) / 1.5f); 119 + (((float) m_visualParams[125]/255.0f)/1.5f);
161 } 120 }
162 121
163 /// <summary> 122 /// <summary>
@@ -193,5 +152,45 @@ namespace OpenSim.Region.Environment.Scenes
193 textu.CreateFace(6).TextureID = new LLUUID("00000000-0000-1111-9999-000000000011"); 152 textu.CreateFace(6).TextureID = new LLUUID("00000000-0000-1111-9999-000000000011");
194 return textu; 153 return textu;
195 } 154 }
155
156 protected AvatarAppearance(SerializationInfo info, StreamingContext context)
157 {
158 //System.Console.WriteLine("AvatarAppearance Deserialize BGN");
159
160 if (info == null)
161 {
162 throw new ArgumentNullException("info");
163 }
164
165 m_scenePresenceID = new LLUUID((Guid)info.GetValue("m_scenePresenceID", typeof(Guid)));
166 m_wearablesSerial = (int)info.GetValue("m_wearablesSerial", typeof(int));
167 m_visualParams = (byte[])info.GetValue("m_visualParams", typeof(byte[]));
168 m_wearables = (AvatarWearable[])info.GetValue("m_wearables", typeof(AvatarWearable[]));
169
170 byte[] m_textureEntry_work = (byte[])info.GetValue("m_textureEntry", typeof(byte[]));
171 m_textureEntry = new LLObject.TextureEntry(m_textureEntry_work, 0, m_textureEntry_work.Length);
172
173 m_avatarHeight = (float)info.GetValue("m_avatarHeight", typeof(float));
174
175 //System.Console.WriteLine("AvatarAppearance Deserialize END");
176 }
177
178 [SecurityPermission(SecurityAction.LinkDemand,
179 Flags = SecurityPermissionFlag.SerializationFormatter)]
180 public virtual void GetObjectData(
181 SerializationInfo info, StreamingContext context)
182 {
183 if (info == null)
184 {
185 throw new ArgumentNullException("info");
186 }
187
188 info.AddValue("m_scenePresenceID", m_scenePresenceID.UUID);
189 info.AddValue("m_wearablesSerial", m_wearablesSerial);
190 info.AddValue("m_visualParams", m_visualParams);
191 info.AddValue("m_wearables", m_wearables);
192 info.AddValue("m_textureEntry", m_textureEntry.ToBytes());
193 info.AddValue("m_avatarHeight", m_avatarHeight);
194 }
196 } 195 }
197} \ No newline at end of file 196}
diff --git a/OpenSim/Region/Environment/Scenes/EntityBase.cs b/OpenSim/Region/Environment/Scenes/EntityBase.cs
index 7e43718..11bafb7 100644
--- a/OpenSim/Region/Environment/Scenes/EntityBase.cs
+++ b/OpenSim/Region/Environment/Scenes/EntityBase.cs
@@ -36,83 +36,23 @@ namespace OpenSim.Region.Environment.Scenes
36 [Serializable] 36 [Serializable]
37 public abstract class EntityBase : ISerializable 37 public abstract class EntityBase : ISerializable
38 { 38 {
39 protected uint m_localId;
40 protected string m_name;
41 protected LLVector3 m_pos;
42 protected Quaternion m_rotation = new Quaternion(0, 0, 1, 0);
43 protected LLVector3 m_rotationalvelocity;
44 protected Scene m_scene; 39 protected Scene m_scene;
45 40
46 protected LLUUID m_uuid;
47 protected LLVector3 m_velocity;
48
49 /// <summary>
50 /// Creates a new Entity (should not occur on it's own)
51 /// </summary>
52 public EntityBase()
53 {
54 m_uuid = LLUUID.Zero;
55
56 m_pos = new LLVector3();
57 m_velocity = new LLVector3();
58 Rotation = new Quaternion();
59 m_name = "(basic entity)";
60 m_rotationalvelocity = new LLVector3(0, 0, 0);
61 }
62
63 protected EntityBase(SerializationInfo info, StreamingContext context)
64 {
65 //System.Console.WriteLine("EntityBase Deserialize BGN");
66
67 if (info == null)
68 {
69 throw new ArgumentNullException("info");
70 }
71
72 m_uuid = new LLUUID((Guid) info.GetValue("m_uuid", typeof (Guid)));
73 m_name = (string) info.GetValue("m_name", typeof (string));
74
75 m_pos
76 = new LLVector3(
77 (float) info.GetValue("m_pos.X", typeof (float)),
78 (float) info.GetValue("m_pos.Y", typeof (float)),
79 (float) info.GetValue("m_pos.Z", typeof (float)));
80
81 m_velocity
82 = new LLVector3(
83 (float) info.GetValue("m_velocity.X", typeof (float)),
84 (float) info.GetValue("m_velocity.Y", typeof (float)),
85 (float) info.GetValue("m_velocity.Z", typeof (float)));
86
87 m_rotationalvelocity
88 = new LLVector3(
89 (float) info.GetValue("m_rotationalvelocity.X", typeof (float)),
90 (float) info.GetValue("m_rotationalvelocity.Y", typeof (float)),
91 (float) info.GetValue("m_rotationalvelocity.Z", typeof (float)));
92
93 m_rotation
94 = new Quaternion(
95 (float) info.GetValue("m_rotation.w", typeof (float)),
96 (float) info.GetValue("m_rotation.x", typeof (float)),
97 (float) info.GetValue("m_rotation.y", typeof (float)),
98 (float) info.GetValue("m_rotation.z", typeof (float)));
99
100 m_localId = (uint) info.GetValue("m_localId", typeof (uint));
101
102 //System.Console.WriteLine("EntityBase Deserialize END");
103 }
104
105 public Scene Scene 41 public Scene Scene
106 { 42 {
107 get { return m_scene; } 43 get { return m_scene; }
108 } 44 }
109 45
46 protected LLUUID m_uuid;
47
110 public virtual LLUUID UUID 48 public virtual LLUUID UUID
111 { 49 {
112 get { return m_uuid; } 50 get { return m_uuid; }
113 set { m_uuid = value; } 51 set { m_uuid = value; }
114 } 52 }
115 53
54 protected string m_name;
55
116 /// <summary> 56 /// <summary>
117 /// 57 ///
118 /// </summary> 58 /// </summary>
@@ -122,6 +62,8 @@ namespace OpenSim.Region.Environment.Scenes
122 set { m_name = value; } 62 set { m_name = value; }
123 } 63 }
124 64
65 protected LLVector3 m_pos;
66
125 /// <summary> 67 /// <summary>
126 /// 68 ///
127 /// </summary> 69 /// </summary>
@@ -131,6 +73,9 @@ namespace OpenSim.Region.Environment.Scenes
131 set { m_pos = value; } 73 set { m_pos = value; }
132 } 74 }
133 75
76 protected LLVector3 m_velocity;
77 protected LLVector3 m_rotationalvelocity;
78
134 /// <summary> 79 /// <summary>
135 /// 80 ///
136 /// </summary> 81 /// </summary>
@@ -140,24 +85,104 @@ namespace OpenSim.Region.Environment.Scenes
140 set { m_velocity = value; } 85 set { m_velocity = value; }
141 } 86 }
142 87
88 protected Quaternion m_rotation = new Quaternion(0, 0, 1, 0);
89
143 public virtual Quaternion Rotation 90 public virtual Quaternion Rotation
144 { 91 {
145 get { return m_rotation; } 92 get { return m_rotation; }
146 set { m_rotation = value; } 93 set { m_rotation = value; }
147 } 94 }
148 95
96 protected uint m_localId;
97
149 public virtual uint LocalId 98 public virtual uint LocalId
150 { 99 {
151 get { return m_localId; } 100 get { return m_localId; }
152 set { m_localId = value; } 101 set { m_localId = value; }
153 } 102 }
154 103
155 #region ISerializable Members 104 /// <summary>
105 /// Creates a new Entity (should not occur on it's own)
106 /// </summary>
107 public EntityBase()
108 {
109 m_uuid = LLUUID.Zero;
110
111 m_pos = new LLVector3();
112 m_velocity = new LLVector3();
113 Rotation = new Quaternion();
114 m_name = "(basic entity)";
115 m_rotationalvelocity = new LLVector3(0, 0, 0);
116 }
117
118 /// <summary>
119 ///
120 /// </summary>
121 public abstract void UpdateMovement();
122
123 /// <summary>
124 /// Performs any updates that need to be done at each frame.
125 /// </summary>
126 public abstract void Update();
127
128 /// <summary>
129 /// Copies the entity
130 /// </summary>
131 /// <returns></returns>
132 public virtual EntityBase Copy()
133 {
134 return (EntityBase) MemberwiseClone();
135 }
136
137
138 public abstract void SetText(string text, Vector3 color, double alpha);
139
140 protected EntityBase(SerializationInfo info, StreamingContext context)
141 {
142 //System.Console.WriteLine("EntityBase Deserialize BGN");
143
144 if (info == null)
145 {
146 throw new ArgumentNullException("info");
147 }
148
149 m_uuid = new LLUUID((Guid)info.GetValue("m_uuid", typeof(Guid)));
150 m_name = (string)info.GetValue("m_name", typeof(string));
151
152 m_pos
153 = new LLVector3(
154 (float)info.GetValue("m_pos.X", typeof(float)),
155 (float)info.GetValue("m_pos.Y", typeof(float)),
156 (float)info.GetValue("m_pos.Z", typeof(float)));
157
158 m_velocity
159 = new LLVector3(
160 (float)info.GetValue("m_velocity.X", typeof(float)),
161 (float)info.GetValue("m_velocity.Y", typeof(float)),
162 (float)info.GetValue("m_velocity.Z", typeof(float)));
163
164 m_rotationalvelocity
165 = new LLVector3(
166 (float)info.GetValue("m_rotationalvelocity.X", typeof(float)),
167 (float)info.GetValue("m_rotationalvelocity.Y", typeof(float)),
168 (float)info.GetValue("m_rotationalvelocity.Z", typeof(float)));
169
170 m_rotation
171 = new Quaternion(
172 (float)info.GetValue("m_rotation.w", typeof(float)),
173 (float)info.GetValue("m_rotation.x", typeof(float)),
174 (float)info.GetValue("m_rotation.y", typeof(float)),
175 (float)info.GetValue("m_rotation.z", typeof(float)));
176
177 m_localId = (uint)info.GetValue("m_localId", typeof(uint));
178
179 //System.Console.WriteLine("EntityBase Deserialize END");
180 }
156 181
157 [SecurityPermission(SecurityAction.LinkDemand, 182 [SecurityPermission(SecurityAction.LinkDemand,
158 Flags = SecurityPermissionFlag.SerializationFormatter)] 183 Flags = SecurityPermissionFlag.SerializationFormatter)]
159 public virtual void GetObjectData( 184 public virtual void GetObjectData(
160 SerializationInfo info, StreamingContext context) 185 SerializationInfo info, StreamingContext context)
161 { 186 {
162 if (info == null) 187 if (info == null)
163 { 188 {
@@ -190,42 +215,18 @@ namespace OpenSim.Region.Environment.Scenes
190 215
191 info.AddValue("m_localId", m_localId); 216 info.AddValue("m_localId", m_localId);
192 } 217 }
193
194 #endregion
195
196 /// <summary>
197 ///
198 /// </summary>
199 public abstract void UpdateMovement();
200
201 /// <summary>
202 /// Performs any updates that need to be done at each frame.
203 /// </summary>
204 public abstract void Update();
205
206 /// <summary>
207 /// Copies the entity
208 /// </summary>
209 /// <returns></returns>
210 public virtual EntityBase Copy()
211 {
212 return (EntityBase) MemberwiseClone();
213 }
214
215
216 public abstract void SetText(string text, Vector3 color, double alpha);
217 } 218 }
218 219
219 //Nested Classes 220 //Nested Classes
220 public class EntityIntersection 221 public class EntityIntersection
221 { 222 {
222 public Vector3 AAfaceNormal = new Vector3(0, 0, 0);
223 public float distance;
224 public int face = -1;
225 public bool HitTF;
226 public Vector3 ipoint = new Vector3(0, 0, 0); 223 public Vector3 ipoint = new Vector3(0, 0, 0);
227 public Vector3 normal = new Vector3(0, 0, 0); 224 public Vector3 normal = new Vector3(0, 0, 0);
225 public Vector3 AAfaceNormal = new Vector3(0, 0, 0);
226 public int face = -1;
227 public bool HitTF = false;
228 public SceneObjectPart obj; 228 public SceneObjectPart obj;
229 public float distance = 0;
229 230
230 public EntityIntersection() 231 public EntityIntersection()
231 { 232 {
@@ -238,4 +239,4 @@ namespace OpenSim.Region.Environment.Scenes
238 HitTF = _HitTF; 239 HitTF = _HitTF;
239 } 240 }
240 } 241 }
241} \ No newline at end of file 242}
diff --git a/OpenSim/Region/Environment/Scenes/IScenePresenceBody.cs b/OpenSim/Region/Environment/Scenes/IScenePresenceBody.cs
index 508eb67..3a20190 100644
--- a/OpenSim/Region/Environment/Scenes/IScenePresenceBody.cs
+++ b/OpenSim/Region/Environment/Scenes/IScenePresenceBody.cs
@@ -34,4 +34,4 @@ namespace OpenSim.Region.Environment.Scenes
34 { 34 {
35 void processMovement(IClientAPI remoteClient, uint flags, LLQuaternion bodyRotation); 35 void processMovement(IClientAPI remoteClient, uint flags, LLQuaternion bodyRotation);
36 } 36 }
37} \ No newline at end of file 37}
diff --git a/OpenSim/Region/Environment/Scenes/InnerScene.cs b/OpenSim/Region/Environment/Scenes/InnerScene.cs
index 3889741..da286ad 100644
--- a/OpenSim/Region/Environment/Scenes/InnerScene.cs
+++ b/OpenSim/Region/Environment/Scenes/InnerScene.cs
@@ -46,33 +46,36 @@ namespace OpenSim.Region.Environment.Scenes
46 46
47 #region Events 47 #region Events
48 48
49 private PhysicsCrash handlerPhysicsCrash;
50 public event PhysicsCrash UnRecoverableError; 49 public event PhysicsCrash UnRecoverableError;
50 private PhysicsCrash handlerPhysicsCrash = null;
51 51
52 #endregion 52 #endregion
53 53
54 #region Fields 54 #region Fields
55 55
56 public Dictionary<LLUUID, ScenePresence> ScenePresences;
56 // SceneObjects is not currently populated or used. 57 // SceneObjects is not currently populated or used.
57 //public Dictionary<LLUUID, SceneObjectGroup> SceneObjects; 58 //public Dictionary<LLUUID, SceneObjectGroup> SceneObjects;
58 public PhysicsScene _PhyScene;
59 public Dictionary<LLUUID, EntityBase> Entities; 59 public Dictionary<LLUUID, EntityBase> Entities;
60 protected int m_activeScripts; 60 public Dictionary<LLUUID, ScenePresence> RestorePresences;
61 protected int m_numChildAgents; 61
62 protected int m_numPrim; 62 public BasicQuadTreeNode QuadTree;
63 protected int m_numRootAgents; 63
64 protected Scene m_parentScene;
65 protected int m_physicalPrim;
66 protected RegionInfo m_regInfo; 64 protected RegionInfo m_regInfo;
65 protected Scene m_parentScene;
66 protected PermissionManager PermissionsMngr;
67 protected List<EntityBase> m_updateList = new List<EntityBase>();
68 protected int m_numRootAgents = 0;
69 protected int m_numPrim = 0;
70 protected int m_numChildAgents = 0;
71 protected int m_physicalPrim = 0;
67 72
68 protected int m_scriptLPS; 73 protected int m_activeScripts = 0;
74 protected int m_scriptLPS = 0;
69 75
70 internal object m_syncRoot = new object(); 76 internal object m_syncRoot = new object();
71 protected List<EntityBase> m_updateList = new List<EntityBase>(); 77
72 protected PermissionManager PermissionsMngr; 78 public PhysicsScene _PhyScene;
73 public BasicQuadTreeNode QuadTree;
74 public Dictionary<LLUUID, ScenePresence> RestorePresences;
75 public Dictionary<LLUUID, ScenePresence> ScenePresences;
76 79
77 #endregion 80 #endregion
78 81
@@ -81,7 +84,7 @@ namespace OpenSim.Region.Environment.Scenes
81 m_parentScene = parent; 84 m_parentScene = parent;
82 m_regInfo = regInfo; 85 m_regInfo = regInfo;
83 PermissionsMngr = permissionsMngr; 86 PermissionsMngr = permissionsMngr;
84 QuadTree = new BasicQuadTreeNode(null, "/0/", 0, 0, (short) Constants.RegionSize, (short) Constants.RegionSize); 87 QuadTree = new BasicQuadTreeNode(null, "/0/", 0, 0, (short)Constants.RegionSize, (short)Constants.RegionSize);
85 QuadTree.Subdivide(); 88 QuadTree.Subdivide();
86 QuadTree.Subdivide(); 89 QuadTree.Subdivide();
87 } 90 }
@@ -159,7 +162,7 @@ namespace OpenSim.Region.Environment.Scenes
159 { 162 {
160 lock (m_syncRoot) 163 lock (m_syncRoot)
161 { 164 {
162 return _PhyScene.Simulate((float) elapsed); 165 return _PhyScene.Simulate((float)elapsed);
163 } 166 }
164 } 167 }
165 168
@@ -184,6 +187,7 @@ namespace OpenSim.Region.Environment.Scenes
184 foreach (SceneObjectPart part in sceneObject.Children.Values) 187 foreach (SceneObjectPart part in sceneObject.Children.Values)
185 { 188 {
186 part.LocalId = m_parentScene.PrimIDAllocate(); 189 part.LocalId = m_parentScene.PrimIDAllocate();
190
187 } 191 }
188 sceneObject.UpdateParentIDs(); 192 sceneObject.UpdateParentIDs();
189 AddEntity(sceneObject); 193 AddEntity(sceneObject);
@@ -229,7 +233,7 @@ namespace OpenSim.Region.Environment.Scenes
229 for (int i = 0; i < m_updateList.Count; i++) 233 for (int i = 0; i < m_updateList.Count; i++)
230 { 234 {
231 EntityBase entity = m_updateList[i]; 235 EntityBase entity = m_updateList[i];
232 236
233 // Don't abort the whole update if one entity happens to give us an exception. 237 // Don't abort the whole update if one entity happens to give us an exception.
234 try 238 try
235 { 239 {
@@ -245,7 +249,7 @@ namespace OpenSim.Region.Environment.Scenes
245 } 249 }
246 catch (Exception e) 250 catch (Exception e)
247 { 251 {
248 m_log.ErrorFormat("[INNER SCENE]: Failed to update {0}, - {1}", entity.Name, e); //entity.m_uuid 252 m_log.ErrorFormat("[INNER SCENE]: Failed to update {0}, - {1}", entity.Name, e);//entity.m_uuid
249 } 253 }
250 } 254 }
251 m_updateList.Clear(); 255 m_updateList.Clear();
@@ -280,16 +284,15 @@ namespace OpenSim.Region.Environment.Scenes
280 { 284 {
281 if (obj is SceneObjectGroup) 285 if (obj is SceneObjectGroup)
282 { 286 {
283 if ((obj).LocalId == localID) 287 if (((SceneObjectGroup)obj).LocalId == localID)
284 { 288 {
285 m_parentScene.RemoveEntity((SceneObjectGroup) obj); 289 m_parentScene.RemoveEntity((SceneObjectGroup)obj);
286 m_numPrim--; 290 m_numPrim--;
287 return; 291 return;
288 } 292 }
289 } 293 }
290 } 294 }
291 } 295 }
292
293 public void DetachObject(uint objectLocalID, IClientAPI remoteClient) 296 public void DetachObject(uint objectLocalID, IClientAPI remoteClient)
294 { 297 {
295 List<EntityBase> EntityList = GetEntities(); 298 List<EntityBase> EntityList = GetEntities();
@@ -298,25 +301,29 @@ namespace OpenSim.Region.Environment.Scenes
298 { 301 {
299 if (obj is SceneObjectGroup) 302 if (obj is SceneObjectGroup)
300 { 303 {
301 if ((obj).LocalId == objectLocalID) 304 if (((SceneObjectGroup)obj).LocalId == objectLocalID)
302 { 305 {
303 SceneObjectGroup group = (SceneObjectGroup) obj; 306 SceneObjectGroup group = (SceneObjectGroup)obj;
304 307
305 //group.DetachToGround(); 308 //group.DetachToGround();
306 DetachSingleAttachmentToInv(group.GetFromAssetID(), remoteClient); 309 DetachSingleAttachmentToInv(group.GetFromAssetID(),remoteClient);
307 } 310 }
308 } 311 }
309 } 312 }
313
310 } 314 }
311 315
312 public void HandleUndo(IClientAPI remoteClient, LLUUID primId) 316 public void HandleUndo(IClientAPI remoteClient, LLUUID primId)
313 { 317 {
314 if (primId != LLUUID.Zero) 318 if (primId != LLUUID.Zero)
315 { 319 {
316 SceneObjectPart part = m_parentScene.GetSceneObjectPart(primId); 320 SceneObjectPart part = m_parentScene.GetSceneObjectPart(primId);
317 if (part != null) 321 if (part != null)
318 part.Undo(); 322 part.Undo();
323
319 } 324 }
325
326
320 } 327 }
321 328
322 /// <summary> 329 /// <summary>
@@ -331,29 +338,27 @@ namespace OpenSim.Region.Environment.Scenes
331 // Calls attach with a Zero position 338 // Calls attach with a Zero position
332 AttachObject(remoteClient, objectLocalID, AttachmentPt, rot, LLVector3.Zero); 339 AttachObject(remoteClient, objectLocalID, AttachmentPt, rot, LLVector3.Zero);
333 } 340 }
334 341 public void RezSingleAttachment(IClientAPI remoteClient, LLUUID itemID, uint AttachmentPt,uint ItemFlags, uint NextOwnerMask)
335 public void RezSingleAttachment(IClientAPI remoteClient, LLUUID itemID, uint AttachmentPt, uint ItemFlags, uint NextOwnerMask)
336 { 342 {
337 SceneObjectGroup objatt = m_parentScene.RezObject(remoteClient, itemID, LLVector3.Zero, LLVector3.Zero, LLUUID.Zero, 1, true, 343 SceneObjectGroup objatt = m_parentScene.RezObject(remoteClient, itemID, LLVector3.Zero, LLVector3.Zero, LLUUID.Zero, (byte)1, true,
338 (uint) 344 (uint)(PermissionMask.Copy | PermissionMask.Move | PermissionMask.Modify | PermissionMask.Transfer),
339 (PermissionMask.Copy | PermissionMask.Move | PermissionMask.Modify | PermissionMask.Transfer), 345 (uint)(PermissionMask.Copy | PermissionMask.Move | PermissionMask.Modify | PermissionMask.Transfer),
340 (uint) 346 (uint)(PermissionMask.Copy | PermissionMask.Move | PermissionMask.Modify | PermissionMask.Transfer),
341 (PermissionMask.Copy | PermissionMask.Move | PermissionMask.Modify | PermissionMask.Transfer), 347 ItemFlags, false, false, remoteClient.AgentId, true);
342 (uint)
343 (PermissionMask.Copy | PermissionMask.Move | PermissionMask.Modify | PermissionMask.Transfer),
344 ItemFlags, false, false, remoteClient.AgentId, true);
345 348
346 if (objatt != null) 349 if (objatt != null)
347 { 350 {
348 AttachObject(remoteClient, objatt.LocalId, AttachmentPt, new LLQuaternion(0, 0, 0, 1), objatt.AbsolutePosition); 351 AttachObject(remoteClient,objatt.LocalId,AttachmentPt,new LLQuaternion(0,0,0,1),objatt.AbsolutePosition);
349 objatt.ScheduleGroupForFullUpdate(); 352 objatt.ScheduleGroupForFullUpdate();
350 } 353 }
354
351 } 355 }
352 356
353 // What makes this method odd and unique is it tries to detach using an LLUUID.... Yay for standards. 357 // What makes this method odd and unique is it tries to detach using an LLUUID.... Yay for standards.
354 // To LocalId or LLUUID, *THAT* is the question. How now Brown LLUUID?? 358 // To LocalId or LLUUID, *THAT* is the question. How now Brown LLUUID??
355 public void DetachSingleAttachmentToInv(LLUUID itemID, IClientAPI remoteClient) 359 public void DetachSingleAttachmentToInv(LLUUID itemID, IClientAPI remoteClient)
356 { 360 {
361
357 if (itemID == LLUUID.Zero) // If this happened, someone made a mistake.... 362 if (itemID == LLUUID.Zero) // If this happened, someone made a mistake....
358 return; 363 return;
359 364
@@ -363,16 +368,17 @@ namespace OpenSim.Region.Environment.Scenes
363 { 368 {
364 if (obj is SceneObjectGroup) 369 if (obj is SceneObjectGroup)
365 { 370 {
366 if (((SceneObjectGroup) obj).GetFromAssetID() == itemID) 371 if (((SceneObjectGroup)obj).GetFromAssetID() == itemID)
367 { 372 {
368 SceneObjectGroup group = (SceneObjectGroup) obj; 373 SceneObjectGroup group = (SceneObjectGroup)obj;
369 group.DetachToInventoryPrep(); 374 group.DetachToInventoryPrep();
370 m_log.Debug("[DETACH]: Saving attachpoint: " + ((uint) group.GetAttachmentPoint())); 375 m_log.Debug("[DETACH]: Saving attachpoint: " + ((uint)group.GetAttachmentPoint()).ToString());
371 m_parentScene.updateKnownAsset(remoteClient, group, group.GetFromAssetID(), group.OwnerID); 376 m_parentScene.updateKnownAsset(remoteClient, group, group.GetFromAssetID(),group.OwnerID);
372 m_parentScene.DeleteSceneObjectGroup(group); 377 m_parentScene.DeleteSceneObjectGroup(group);
373 } 378 }
374 } 379 }
375 } 380 }
381
376 } 382 }
377 383
378 public void AttachObject(IClientAPI remoteClient, uint objectLocalID, uint AttachmentPt, LLQuaternion rot, LLVector3 attachPos) 384 public void AttachObject(IClientAPI remoteClient, uint objectLocalID, uint AttachmentPt, LLQuaternion rot, LLVector3 attachPos)
@@ -382,34 +388,39 @@ namespace OpenSim.Region.Environment.Scenes
382 { 388 {
383 if (obj is SceneObjectGroup) 389 if (obj is SceneObjectGroup)
384 { 390 {
385 if ((obj).LocalId == objectLocalID) 391 if (((SceneObjectGroup)obj).LocalId == objectLocalID)
386 { 392 {
387 SceneObjectGroup group = (SceneObjectGroup) obj; 393 SceneObjectGroup group = (SceneObjectGroup)obj;
388 394
389 // If the attachment point isn't the same as the one previously used 395 // If the attachment point isn't the same as the one previously used
390 // set it's offset position = 0 so that it appears on the attachment point 396 // set it's offset position = 0 so that it appears on the attachment point
391 // and not in a weird location somewhere unknown. 397 // and not in a weird location somewhere unknown.
392 if (AttachmentPt != 0 && AttachmentPt != group.GetAttachmentPoint()) 398 if (AttachmentPt != 0 && AttachmentPt != (uint)group.GetAttachmentPoint())
393 { 399 {
400
394 attachPos = LLVector3.Zero; 401 attachPos = LLVector3.Zero;
395 } 402 }
396 403
397 // AttachmentPt 0 means the client chose to 'wear' the attachment. 404 // AttachmentPt 0 means the client chose to 'wear' the attachment.
398 if (AttachmentPt == 0) 405 if (AttachmentPt == 0)
399 { 406 {
407
400 // Check object for stored attachment point 408 // Check object for stored attachment point
401 AttachmentPt = group.GetAttachmentPoint(); 409 AttachmentPt = (uint)group.GetAttachmentPoint();
410
411
402 } 412 }
403 413
404 // if we still didn't find a suitable attachment point....... 414 // if we still didn't find a suitable attachment point.......
405 if (AttachmentPt == 0) 415 if (AttachmentPt == 0)
406 { 416 {
407 // Stick it on left hand with Zero Offset from the attachment point. 417 // Stick it on left hand with Zero Offset from the attachment point.
408 AttachmentPt = (uint) AttachmentPoint.LeftHand; 418 AttachmentPt = (uint)AttachmentPoint.LeftHand;
409 attachPos = LLVector3.Zero; 419 attachPos = LLVector3.Zero;
410 } 420 }
411 m_log.Debug("[ATTACH]: Using attachpoint: " + AttachmentPt); 421 m_log.Debug("[ATTACH]: Using attachpoint: " + AttachmentPt.ToString());
412 422
423
413 424
414 // Saves and gets assetID 425 // Saves and gets assetID
415 if (group.GetFromAssetID() == LLUUID.Zero) 426 if (group.GetFromAssetID() == LLUUID.Zero)
@@ -420,14 +431,16 @@ namespace OpenSim.Region.Environment.Scenes
420 group.SetFromAssetID(newAssetID); 431 group.SetFromAssetID(newAssetID);
421 } 432 }
422 group.AttachToAgent(remoteClient.AgentId, AttachmentPt, attachPos); 433 group.AttachToAgent(remoteClient.AgentId, AttachmentPt, attachPos);
434
423 } 435 }
436
424 } 437 }
425 } 438 }
426 }
427 439
440 }
428 // Use the above method. 441 // Use the above method.
429 public void AttachObject(IClientAPI remoteClient, uint objectLocalID, uint AttachmentPt, LLQuaternion rot, 442 public void AttachObject(IClientAPI remoteClient, uint objectLocalID, uint AttachmentPt, LLQuaternion rot,
430 bool deadMethod) 443 bool deadMethod)
431 { 444 {
432 Console.WriteLine("Attaching object " + objectLocalID + " to " + AttachmentPt); 445 Console.WriteLine("Attaching object " + objectLocalID + " to " + AttachmentPt);
433 SceneObjectPart p = GetSceneObjectPart(objectLocalID); 446 SceneObjectPart p = GetSceneObjectPart(objectLocalID);
@@ -476,14 +489,14 @@ namespace OpenSim.Region.Environment.Scenes
476 objupdate.ObjectData[0].ParentID = 0; 489 objupdate.ObjectData[0].ParentID = 0;
477 objupdate.ObjectData[0].OwnerID = LLUUID.Zero; 490 objupdate.ObjectData[0].OwnerID = LLUUID.Zero;
478 objupdate.ObjectData[0].Scale = new LLVector3(1, 1, 1); 491 objupdate.ObjectData[0].Scale = new LLVector3(1, 1, 1);
479 objupdate.ObjectData[0].PCode = (byte) PCode.Avatar; 492 objupdate.ObjectData[0].PCode = (byte)PCode.Avatar;
480 objupdate.ObjectData[0].TextureEntry = ScenePresence.DefaultTexture; 493 objupdate.ObjectData[0].TextureEntry = ScenePresence.DefaultTexture;
481 494
482 objupdate.ObjectData[0].ID = av.LocalId; 495 objupdate.ObjectData[0].ID = av.LocalId;
483 objupdate.ObjectData[0].FullID = remoteClient.AgentId; 496 objupdate.ObjectData[0].FullID = remoteClient.AgentId;
484 objupdate.ObjectData[0].ParentID = 0; 497 objupdate.ObjectData[0].ParentID = 0;
485 objupdate.ObjectData[0].NameValue = 498 objupdate.ObjectData[0].NameValue =
486 Helpers.StringToField("FirstName STRING RW SV " + av.Firstname + "\nLastName STRING RW SV " + av.Lastname); 499 Helpers.StringToField("FirstName STRING RW SV " + av.Firstname + "\nLastName STRING RW SV " + av.Lastname);
487 LLVector3 pos2 = av.AbsolutePosition; 500 LLVector3 pos2 = av.AbsolutePosition;
488 // new LLVector3((float) Pos.X, (float) Pos.Y, (float) Pos.Z); 501 // new LLVector3((float) Pos.X, (float) Pos.Y, (float) Pos.Z);
489 byte[] pb = pos2.GetBytes(); 502 byte[] pb = pos2.GetBytes();
@@ -516,7 +529,7 @@ namespace OpenSim.Region.Environment.Scenes
516 529
517 objupdate.ObjectData[1].TextureEntry = primData.TextureEntry; 530 objupdate.ObjectData[1].TextureEntry = primData.TextureEntry;
518 objupdate.ObjectData[1].PCode = primData.PCode; 531 objupdate.ObjectData[1].PCode = primData.PCode;
519 objupdate.ObjectData[1].State = (byte) (((byte) AttachmentPt) << 4); 532 objupdate.ObjectData[1].State = (byte)(((byte)AttachmentPt) << 4);
520 objupdate.ObjectData[1].PathBegin = primData.PathBegin; 533 objupdate.ObjectData[1].PathBegin = primData.PathBegin;
521 objupdate.ObjectData[1].PathEnd = primData.PathEnd; 534 objupdate.ObjectData[1].PathEnd = primData.PathEnd;
522 objupdate.ObjectData[1].PathScaleX = primData.PathScaleX; 535 objupdate.ObjectData[1].PathScaleX = primData.PathScaleX;
@@ -553,8 +566,8 @@ namespace OpenSim.Region.Environment.Scenes
553 //objupdate.ObjectData[1].ClickAction = clickAction; 566 //objupdate.ObjectData[1].ClickAction = clickAction;
554 objupdate.ObjectData[1].Radius = 20; 567 objupdate.ObjectData[1].Radius = 20;
555 objupdate.ObjectData[1].NameValue = 568 objupdate.ObjectData[1].NameValue =
556 Helpers.StringToField("AttachItemID STRING RW SV " + p.UUID); 569 Helpers.StringToField("AttachItemID STRING RW SV " + p.UUID);
557 LLVector3 pos = new LLVector3((float) 0.0, (float) 0.0, (float) 0.0); 570 LLVector3 pos = new LLVector3((float)0.0, (float)0.0, (float)0.0);
558 571
559 pb = pos.GetBytes(); 572 pb = pos.GetBytes();
560 Array.Copy(pb, 0, objupdate.ObjectData[1].ObjectData, 0, pb.Length); 573 Array.Copy(pb, 0, objupdate.ObjectData[1].ObjectData, 0, pb.Length);
@@ -725,7 +738,6 @@ namespace OpenSim.Region.Environment.Scenes
725 m_scriptLPS = 0; 738 m_scriptLPS = 0;
726 return returnval; 739 return returnval;
727 } 740 }
728
729 #endregion 741 #endregion
730 742
731 #region Get Methods 743 #region Get Methods
@@ -753,7 +765,7 @@ namespace OpenSim.Region.Environment.Scenes
753 765
754 return result; 766 return result;
755 } 767 }
756 768
757 /// <summary> 769 /// <summary>
758 /// Get the controlling client for the given avatar, if there is one. 770 /// Get the controlling client for the given avatar, if there is one.
759 /// 771 ///
@@ -767,12 +779,12 @@ namespace OpenSim.Region.Environment.Scenes
767 public IClientAPI GetControllingClient(LLUUID agentId) 779 public IClientAPI GetControllingClient(LLUUID agentId)
768 { 780 {
769 ScenePresence presence = GetScenePresence(agentId); 781 ScenePresence presence = GetScenePresence(agentId);
770 782
771 if (presence != null) 783 if (presence != null)
772 { 784 {
773 return presence.ControllingClient; 785 return presence.ControllingClient;
774 } 786 }
775 787
776 return null; 788 return null;
777 } 789 }
778 790
@@ -807,7 +819,7 @@ namespace OpenSim.Region.Environment.Scenes
807 { 819 {
808 return ScenePresences[agentID]; 820 return ScenePresences[agentID];
809 } 821 }
810 822
811 return null; 823 return null;
812 } 824 }
813 825
@@ -819,8 +831,8 @@ namespace OpenSim.Region.Environment.Scenes
819 { 831 {
820 if (ent is SceneObjectGroup) 832 if (ent is SceneObjectGroup)
821 { 833 {
822 if (((SceneObjectGroup) ent).HasChildPrim(localID)) 834 if (((SceneObjectGroup)ent).HasChildPrim(localID))
823 return (SceneObjectGroup) ent; 835 return (SceneObjectGroup)ent;
824 } 836 }
825 } 837 }
826 return null; 838 return null;
@@ -834,8 +846,8 @@ namespace OpenSim.Region.Environment.Scenes
834 { 846 {
835 if (ent is SceneObjectGroup) 847 if (ent is SceneObjectGroup)
836 { 848 {
837 if (((SceneObjectGroup) ent).HasChildPrim(fullID)) 849 if (((SceneObjectGroup)ent).HasChildPrim(fullID))
838 return (SceneObjectGroup) ent; 850 return (SceneObjectGroup)ent;
839 } 851 }
840 } 852 }
841 return null; 853 return null;
@@ -850,7 +862,7 @@ namespace OpenSim.Region.Environment.Scenes
850 { 862 {
851 if (ent is SceneObjectGroup) 863 if (ent is SceneObjectGroup)
852 { 864 {
853 SceneObjectGroup reportingG = (SceneObjectGroup) ent; 865 SceneObjectGroup reportingG = (SceneObjectGroup)ent;
854 EntityIntersection result = reportingG.TestIntersection(hray, frontFacesOnly, faceCenters); 866 EntityIntersection result = reportingG.TestIntersection(hray, frontFacesOnly, faceCenters);
855 if (result.HitTF) 867 if (result.HitTF)
856 { 868 {
@@ -890,13 +902,13 @@ namespace OpenSim.Region.Environment.Scenes
890 { 902 {
891 if (!presence.IsChildAgent) 903 if (!presence.IsChildAgent)
892 { 904 {
893 avatar = presence; 905 avatar = presence;
894 return true; 906 return true;
895 } 907 }
896 else 908 else
897 { 909 {
898 m_log.WarnFormat( 910 m_log.WarnFormat(
899 "[INNER SCENE]: Requested avatar {0} could not be found in scene {1} since it is only registered as a child agent!", 911 "[INNER SCENE]: Requested avatar {0} could not be found in scene {1} since it is only registered as a child agent!",
900 avatarId, m_parentScene.RegionInfo.RegionName); 912 avatarId, m_parentScene.RegionInfo.RegionName);
901 } 913 }
902 } 914 }
@@ -975,8 +987,8 @@ namespace OpenSim.Region.Environment.Scenes
975 987
976 if (presence.IsChildAgent && m_parentScene.m_seeIntoRegionFromNeighbor) 988 if (presence.IsChildAgent && m_parentScene.m_seeIntoRegionFromNeighbor)
977 { 989 {
978 LLVector3 oLoc = (ent).AbsolutePosition; 990 LLVector3 oLoc = ((SceneObjectGroup)ent).AbsolutePosition;
979 float distResult = (float) Util.GetDistanceTo(presence.AbsolutePosition, oLoc); 991 float distResult = (float)Util.GetDistanceTo(presence.AbsolutePosition, oLoc);
980 992
981 //m_log.Info("[DISTANCE]: " + distResult.ToString()); 993 //m_log.Info("[DISTANCE]: " + distResult.ToString());
982 994
@@ -984,13 +996,13 @@ namespace OpenSim.Region.Environment.Scenes
984 { 996 {
985 // Send Only if we don't already know about it. 997 // Send Only if we don't already know about it.
986 // KnownPrim also makes the prim known when called. 998 // KnownPrim also makes the prim known when called.
987 if (!presence.KnownPrim((ent).UUID)) 999 if (!presence.KnownPrim(((SceneObjectGroup)ent).UUID))
988 ((SceneObjectGroup) ent).ScheduleFullUpdateToAvatar(presence); 1000 ((SceneObjectGroup)ent).ScheduleFullUpdateToAvatar(presence);
989 } 1001 }
990 } 1002 }
991 else 1003 else
992 { 1004 {
993 ((SceneObjectGroup) ent).ScheduleFullUpdateToAvatar(presence); 1005 ((SceneObjectGroup)ent).ScheduleFullUpdateToAvatar(presence);
994 } 1006 }
995 } 1007 }
996 } 1008 }
@@ -1025,7 +1037,6 @@ namespace OpenSim.Region.Environment.Scenes
1025 } 1037 }
1026 } 1038 }
1027 } 1039 }
1028
1029 public void UpdatePrimGroupScale(uint localID, LLVector3 scale, IClientAPI remoteClient) 1040 public void UpdatePrimGroupScale(uint localID, LLVector3 scale, IClientAPI remoteClient)
1030 { 1041 {
1031 SceneObjectGroup group = GetGroupByPrim(localID); 1042 SceneObjectGroup group = GetGroupByPrim(localID);
@@ -1140,12 +1151,13 @@ namespace OpenSim.Region.Environment.Scenes
1140 SceneObjectGroup group = GetGroupByPrim(localID); 1151 SceneObjectGroup group = GetGroupByPrim(localID);
1141 if (group != null) 1152 if (group != null)
1142 { 1153 {
1154
1143 LLVector3 oldPos = group.AbsolutePosition; 1155 LLVector3 oldPos = group.AbsolutePosition;
1144 if (group.RootPart.m_IsAttachment) 1156 if (group.RootPart.m_IsAttachment)
1145 { 1157 {
1146 group.UpdateGroupPosition(pos); 1158 group.UpdateGroupPosition(pos);
1147 } 1159 }
1148 else 1160 else
1149 { 1161 {
1150 if (!PermissionsMngr.CanObjectEntry(remoteClient.AgentId, oldPos, pos) && !group.RootPart.m_IsAttachment) 1162 if (!PermissionsMngr.CanObjectEntry(remoteClient.AgentId, oldPos, pos) && !group.RootPart.m_IsAttachment)
1151 { 1163 {
@@ -1191,7 +1203,7 @@ namespace OpenSim.Region.Environment.Scenes
1191 { 1203 {
1192 if (PermissionsMngr.CanEditObject(remoteClient.AgentId, group.UUID)) 1204 if (PermissionsMngr.CanEditObject(remoteClient.AgentId, group.UUID))
1193 { 1205 {
1194 group.UpdatePrimFlags(localID, (ushort) packet.Type, true, packet.ToBytes()); 1206 group.UpdatePrimFlags(localID, (ushort)packet.Type, true, packet.ToBytes());
1195 } 1207 }
1196 } 1208 }
1197 } 1209 }
@@ -1201,7 +1213,7 @@ namespace OpenSim.Region.Environment.Scenes
1201 SceneObjectGroup group = GetGroupByPrim(objectID); 1213 SceneObjectGroup group = GetGroupByPrim(objectID);
1202 if (group != null) 1214 if (group != null)
1203 { 1215 {
1204 if (PermissionsMngr.CanEditObjectPosition(remoteClient.AgentId, group.UUID)) // && PermissionsMngr.) 1216 if (PermissionsMngr.CanEditObjectPosition(remoteClient.AgentId, group.UUID))// && PermissionsMngr.)
1205 { 1217 {
1206 group.GrabMovement(offset, pos, remoteClient); 1218 group.GrabMovement(offset, pos, remoteClient);
1207 } 1219 }
@@ -1292,9 +1304,9 @@ namespace OpenSim.Region.Environment.Scenes
1292 { 1304 {
1293 if (ent is SceneObjectGroup) 1305 if (ent is SceneObjectGroup)
1294 { 1306 {
1295 if ((ent).LocalId == parentPrim) 1307 if (((SceneObjectGroup)ent).LocalId == parentPrim)
1296 { 1308 {
1297 parenPrim = (SceneObjectGroup) ent; 1309 parenPrim = (SceneObjectGroup)ent;
1298 break; 1310 break;
1299 } 1311 }
1300 } 1312 }
@@ -1309,9 +1321,9 @@ namespace OpenSim.Region.Environment.Scenes
1309 { 1321 {
1310 if (ent is SceneObjectGroup) 1322 if (ent is SceneObjectGroup)
1311 { 1323 {
1312 if ((ent).LocalId == childPrims[i]) 1324 if (((SceneObjectGroup)ent).LocalId == childPrims[i])
1313 { 1325 {
1314 children.Add((SceneObjectGroup) ent); 1326 children.Add((SceneObjectGroup)ent);
1315 } 1327 }
1316 } 1328 }
1317 } 1329 }
@@ -1322,7 +1334,7 @@ namespace OpenSim.Region.Environment.Scenes
1322 { 1334 {
1323 parenPrim.LinkToGroup(sceneObj); 1335 parenPrim.LinkToGroup(sceneObj);
1324 } 1336 }
1325 1337
1326 // We need to explicitly resend the newly link prim's object properties since no other actions 1338 // We need to explicitly resend the newly link prim's object properties since no other actions
1327 // occur on link to invoke this elsewhere (such as object selection) 1339 // occur on link to invoke this elsewhere (such as object selection)
1328 parenPrim.GetProperties(client); 1340 parenPrim.GetProperties(client);
@@ -1348,16 +1360,19 @@ namespace OpenSim.Region.Environment.Scenes
1348 { 1360 {
1349 if (ent is SceneObjectGroup) 1361 if (ent is SceneObjectGroup)
1350 { 1362 {
1351 SceneObjectGroup obj = (SceneObjectGroup) ent; 1363 SceneObjectGroup obj = (SceneObjectGroup)ent;
1352 sceneObjects.Add(obj.LocalId, obj); 1364 sceneObjects.Add(obj.LocalId, obj);
1365
1353 } 1366 }
1354 } 1367 }
1355 1368
1356 // Find the root prim among the prim ids we've been given 1369 // Find the root prim among the prim ids we've been given
1357 for (int i = 0; i < primIds.Count; i++) 1370 for (int i = 0; i < primIds.Count; i++)
1358 { 1371 {
1372
1359 if (sceneObjects.ContainsKey(primIds[i])) 1373 if (sceneObjects.ContainsKey(primIds[i]))
1360 { 1374 {
1375
1361 parenPrim = sceneObjects[primIds[i]]; 1376 parenPrim = sceneObjects[primIds[i]];
1362 primIds.RemoveAt(i); 1377 primIds.RemoveAt(i);
1363 break; 1378 break;
@@ -1387,13 +1402,14 @@ namespace OpenSim.Region.Environment.Scenes
1387 grp.DelinkFromGroup(primIds[i]); 1402 grp.DelinkFromGroup(primIds[i]);
1388 delinkedSomething = true; 1403 delinkedSomething = true;
1389 } 1404 }
1405
1390 } 1406 }
1391 } 1407 }
1392 if (!delinkedSomething) 1408 if (!delinkedSomething)
1393 { 1409 {
1394 m_log.InfoFormat("[SCENE]: " + 1410 m_log.InfoFormat("[SCENE]: " +
1395 "DelinkObjects(): Could not find a root prim out of {0} as given to a delink request!", 1411 "DelinkObjects(): Could not find a root prim out of {0} as given to a delink request!",
1396 primIds); 1412 primIds);
1397 } 1413 }
1398 } 1414 }
1399 } 1415 }
@@ -1409,7 +1425,7 @@ namespace OpenSim.Region.Environment.Scenes
1409 { 1425 {
1410 if (ent is SceneObjectGroup) 1426 if (ent is SceneObjectGroup)
1411 { 1427 {
1412 foreach (KeyValuePair<LLUUID, SceneObjectPart> subent in ((SceneObjectGroup) ent).Children) 1428 foreach (KeyValuePair<LLUUID, SceneObjectPart> subent in ((SceneObjectGroup)ent).Children)
1413 { 1429 {
1414 if (subent.Value.LocalId == localID) 1430 if (subent.Value.LocalId == localID)
1415 { 1431 {
@@ -1419,7 +1435,7 @@ namespace OpenSim.Region.Environment.Scenes
1419 } 1435 }
1420 } 1436 }
1421 } 1437 }
1422 1438
1423 //Protip: In my day, we didn't call them searchable objects, we called them limited point-to-point joints 1439 //Protip: In my day, we didn't call them searchable objects, we called them limited point-to-point joints
1424 //aka ObjectFlags.JointWheel = IncludeInSearch 1440 //aka ObjectFlags.JointWheel = IncludeInSearch
1425 1441
@@ -1451,7 +1467,7 @@ namespace OpenSim.Region.Environment.Scenes
1451 public void DuplicateObject(uint originalPrim, LLVector3 offset, uint flags, LLUUID AgentID, LLUUID GroupID) 1467 public void DuplicateObject(uint originalPrim, LLVector3 offset, uint flags, LLUUID AgentID, LLUUID GroupID)
1452 { 1468 {
1453 m_log.DebugFormat("[SCENE]: Duplication of object {0} at offset {1} requested by agent {2}", originalPrim, offset, AgentID); 1469 m_log.DebugFormat("[SCENE]: Duplication of object {0} at offset {1} requested by agent {2}", originalPrim, offset, AgentID);
1454 1470
1455 List<EntityBase> EntityList = GetEntities(); 1471 List<EntityBase> EntityList = GetEntities();
1456 1472
1457 SceneObjectGroup originPrim = null; 1473 SceneObjectGroup originPrim = null;
@@ -1459,9 +1475,9 @@ namespace OpenSim.Region.Environment.Scenes
1459 { 1475 {
1460 if (ent is SceneObjectGroup) 1476 if (ent is SceneObjectGroup)
1461 { 1477 {
1462 if ((ent).LocalId == originalPrim) 1478 if (((SceneObjectGroup)ent).LocalId == originalPrim)
1463 { 1479 {
1464 originPrim = (SceneObjectGroup) ent; 1480 originPrim = (SceneObjectGroup)ent;
1465 break; 1481 break;
1466 } 1482 }
1467 } 1483 }
@@ -1510,4 +1526,4 @@ namespace OpenSim.Region.Environment.Scenes
1510 1526
1511 #endregion 1527 #endregion
1512 } 1528 }
1513} \ No newline at end of file 1529}
diff --git a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs
index 1e6ebf9..6bd5d1a 100644
--- a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs
@@ -40,7 +40,7 @@ namespace OpenSim.Region.Environment.Scenes
40{ 40{
41 public partial class Scene 41 public partial class Scene
42 { 42 {
43 private static readonly ILog m_log 43 private static readonly ILog m_log
44 = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 44 = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
45 45
46 /// <summary> 46 /// <summary>
@@ -49,11 +49,11 @@ namespace OpenSim.Region.Environment.Scenes
49 public void StartScripts() 49 public void StartScripts()
50 { 50 {
51 m_log.Info("[PRIM INVENTORY]: Starting scripts in scene"); 51 m_log.Info("[PRIM INVENTORY]: Starting scripts in scene");
52 52
53 foreach (SceneObjectGroup group in Entities.Values) 53 foreach (SceneObjectGroup group in Entities.Values)
54 { 54 {
55 group.StartScripts(); 55 group.StartScripts();
56 } 56 }
57 } 57 }
58 58
59 /// <summary> 59 /// <summary>
@@ -64,9 +64,9 @@ namespace OpenSim.Region.Environment.Scenes
64 /// in which the item is to be placed.</param> 64 /// in which the item is to be placed.</param>
65 public void AddInventoryItem(IClientAPI remoteClient, InventoryItemBase item) 65 public void AddInventoryItem(IClientAPI remoteClient, InventoryItemBase item)
66 { 66 {
67 CachedUserInfo userInfo 67 CachedUserInfo userInfo
68 = CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId); 68 = CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId);
69 69
70 if (userInfo != null) 70 if (userInfo != null)
71 { 71 {
72 userInfo.AddItem(remoteClient.AgentId, item); 72 userInfo.AddItem(remoteClient.AgentId, item);
@@ -88,9 +88,9 @@ namespace OpenSim.Region.Environment.Scenes
88 m_log.ErrorFormat( 88 m_log.ErrorFormat(
89 "[AGENT INVENTORY]: Agent {0} {1} was not found for add of item {2} {3}", 89 "[AGENT INVENTORY]: Agent {0} {1} was not found for add of item {2} {3}",
90 remoteClient.Name, remoteClient.AgentId, item.Name, item.ID); 90 remoteClient.Name, remoteClient.AgentId, item.Name, item.ID);
91 91
92 return; 92 return;
93 } 93 }
94 } 94 }
95 95
96 /// <summary> 96 /// <summary>
@@ -190,7 +190,7 @@ namespace OpenSim.Region.Environment.Scenes
190 { 190 {
191 // Retrieve group 191 // Retrieve group
192 SceneObjectPart part = GetSceneObjectPart(primId); 192 SceneObjectPart part = GetSceneObjectPart(primId);
193 SceneObjectGroup group = part.ParentGroup; 193 SceneObjectGroup group = part.ParentGroup;
194 if (null == group) 194 if (null == group)
195 { 195 {
196 m_log.ErrorFormat( 196 m_log.ErrorFormat(
@@ -200,30 +200,30 @@ namespace OpenSim.Region.Environment.Scenes
200 200
201 return; 201 return;
202 } 202 }
203 203
204 // Retrieve item 204 // Retrieve item
205 TaskInventoryItem item = group.GetInventoryItem(part.LocalId, itemId); 205 TaskInventoryItem item = group.GetInventoryItem(part.LocalId, itemId);
206 if (null == item) 206 if (null == item)
207 { 207 {
208 return; 208 return;
209 } 209 }
210 210
211 // Create new asset 211 // Create new asset
212 // XXX Hardcoding the numbers is a temporary measure - need an enumeration for this 212 // XXX Hardcoding the numbers is a temporary measure - need an enumeration for this
213 // There may well be one in libsecondlife 213 // There may well be one in libsecondlife
214 AssetBase asset = CreateAsset(item.Name, item.Description, 10, 10, data); 214 AssetBase asset = CreateAsset(item.Name, item.Description, 10, 10, data);
215 AssetCache.AddAsset(asset); 215 AssetCache.AddAsset(asset);
216 216
217 // Update item with new asset 217 // Update item with new asset
218 item.AssetID = asset.FullID; 218 item.AssetID = asset.FullID;
219 group.UpdateInventoryItem(item); 219 group.UpdateInventoryItem(item);
220 group.GetProperties(remoteClient); 220 group.GetProperties(remoteClient);
221 221
222 // Trigger rerunning of script (use TriggerRezScript event, see RezScript) 222 // Trigger rerunning of script (use TriggerRezScript event, see RezScript)
223 if (isScriptRunning) 223 if (isScriptRunning)
224 { 224 {
225 group.StopScript(part.LocalId, item.ItemID); 225 group.StopScript(part.LocalId, item.ItemID);
226 group.StartScript(part.LocalId, item.ItemID); 226 group.StartScript(part.LocalId, item.ItemID);
227 } 227 }
228 } 228 }
229 229
@@ -272,7 +272,7 @@ namespace OpenSim.Region.Environment.Scenes
272 if (userInfo != null && userInfo.RootFolder != null) 272 if (userInfo != null && userInfo.RootFolder != null)
273 { 273 {
274 InventoryItemBase item = userInfo.RootFolder.HasItem(itemID); 274 InventoryItemBase item = userInfo.RootFolder.HasItem(itemID);
275 275
276 if (item != null) 276 if (item != null)
277 { 277 {
278 if (LLUUID.Zero == transactionID) 278 if (LLUUID.Zero == transactionID)
@@ -298,11 +298,11 @@ namespace OpenSim.Region.Environment.Scenes
298 } 298 }
299 else 299 else
300 { 300 {
301 IAgentAssetTransactions agentTransactions = RequestModuleInterface<IAgentAssetTransactions>(); 301 IAgentAssetTransactions agentTransactions = this.RequestModuleInterface<IAgentAssetTransactions>();
302 if (agentTransactions != null) 302 if (agentTransactions != null)
303 { 303 {
304 agentTransactions.HandleItemUpdateFromTransaction( 304 agentTransactions.HandleItemUpdateFromTransaction(
305 remoteClient, transactionID, item); 305 remoteClient, transactionID, item);
306 } 306 }
307 } 307 }
308 } 308 }
@@ -318,7 +318,7 @@ namespace OpenSim.Region.Environment.Scenes
318 "[AGENT INVENTORY]: Agent ID " + remoteClient.AgentId + " not found for an inventory item update."); 318 "[AGENT INVENTORY]: Agent ID " + remoteClient.AgentId + " not found for an inventory item update.");
319 } 319 }
320 } 320 }
321 321
322 /// <summary> 322 /// <summary>
323 /// Give an inventory item from one avatar to another 323 /// Give an inventory item from one avatar to another
324 /// </summary> 324 /// </summary>
@@ -328,13 +328,13 @@ namespace OpenSim.Region.Environment.Scenes
328 public void GiveInventoryItem(IClientAPI recipientClient, LLUUID senderId, LLUUID itemId) 328 public void GiveInventoryItem(IClientAPI recipientClient, LLUUID senderId, LLUUID itemId)
329 { 329 {
330 // Retrieve the item from the sender 330 // Retrieve the item from the sender
331 CachedUserInfo senderUserInfo = CommsManager.UserProfileCacheService.GetUserDetails(senderId); 331 CachedUserInfo senderUserInfo = CommsManager.UserProfileCacheService.GetUserDetails(senderId);
332 332
333 if (senderUserInfo == null) 333 if (senderUserInfo == null)
334 { 334 {
335 m_log.ErrorFormat( 335 m_log.ErrorFormat(
336 "[AGENT INVENTORY]: Failed to find sending user {0} for item {1}", senderId, itemId); 336 "[AGENT INVENTORY]: Failed to find sending user {0} for item {1}", senderId, itemId);
337 337
338 return; 338 return;
339 } 339 }
340 340
@@ -342,11 +342,11 @@ namespace OpenSim.Region.Environment.Scenes
342 { 342 {
343 InventoryItemBase item = senderUserInfo.RootFolder.HasItem(itemId); 343 InventoryItemBase item = senderUserInfo.RootFolder.HasItem(itemId);
344 if (item != null) 344 if (item != null)
345 { 345 {
346 // TODO get recipient's root folder 346 // TODO get recipient's root folder
347 CachedUserInfo recipientUserInfo 347 CachedUserInfo recipientUserInfo
348 = CommsManager.UserProfileCacheService.GetUserDetails(recipientClient.AgentId); 348 = CommsManager.UserProfileCacheService.GetUserDetails(recipientClient.AgentId);
349 349
350 if (recipientUserInfo != null) 350 if (recipientUserInfo != null)
351 { 351 {
352 // Insert a copy of the item into the recipient 352 // Insert a copy of the item into the recipient
@@ -373,15 +373,15 @@ namespace OpenSim.Region.Environment.Scenes
373 itemCopy.SaleType = item.SaleType; 373 itemCopy.SaleType = item.SaleType;
374 374
375 recipientUserInfo.AddItem(recipientClient.AgentId, itemCopy); 375 recipientUserInfo.AddItem(recipientClient.AgentId, itemCopy);
376 376
377 // Let the recipient client know about this new item 377 // Let the recipient client know about this new item
378 recipientClient.SendBulkUpdateInventory(itemCopy); 378 recipientClient.SendBulkUpdateInventory(itemCopy);
379 } 379 }
380 else 380 else
381 { 381 {
382 m_log.ErrorFormat( 382 m_log.ErrorFormat(
383 "[AGENT INVENTORY]: Could not find userinfo for recipient user {0}, {1} of item {2}, {3} from {4}", 383 "[AGENT INVENTORY]: Could not find userinfo for recipient user {0}, {1} of item {2}, {3} from {4}",
384 recipientClient.Name, recipientClient.AgentId, item.Name, 384 recipientClient.Name, recipientClient.AgentId, item.Name,
385 item.ID, senderId); 385 item.ID, senderId);
386 } 386 }
387 } 387 }
@@ -389,15 +389,15 @@ namespace OpenSim.Region.Environment.Scenes
389 { 389 {
390 m_log.ErrorFormat( 390 m_log.ErrorFormat(
391 "[AGENT INVENTORY]: Failed to find item {0} to give to {1}", itemId, senderId); 391 "[AGENT INVENTORY]: Failed to find item {0} to give to {1}", itemId, senderId);
392 392
393 return; 393 return;
394 } 394 }
395 } 395 }
396 else 396 else
397 { 397 {
398 m_log.Error("[AGENT INVENTORY]: Failed to find item " + itemId + ", no root folder"); 398 m_log.Error("[AGENT INVENTORY]: Failed to find item " + itemId.ToString() + ", no root folder");
399 return; 399 return;
400 } 400 }
401 } 401 }
402 402
403 public void CopyInventoryItem(IClientAPI remoteClient, uint callbackID, LLUUID oldAgentID, LLUUID oldItemID, 403 public void CopyInventoryItem(IClientAPI remoteClient, uint callbackID, LLUUID oldAgentID, LLUUID oldItemID,
@@ -406,14 +406,14 @@ namespace OpenSim.Region.Environment.Scenes
406 m_log.DebugFormat( 406 m_log.DebugFormat(
407 "[AGENT INVENTORY]: CopyInventoryItem received by {0} with oldAgentID {1}, oldItemID {2}, new FolderID {3}, newName {4}", 407 "[AGENT INVENTORY]: CopyInventoryItem received by {0} with oldAgentID {1}, oldItemID {2}, new FolderID {3}, newName {4}",
408 remoteClient.AgentId, oldAgentID, oldItemID, newFolderID, newName); 408 remoteClient.AgentId, oldAgentID, oldItemID, newFolderID, newName);
409 409
410 InventoryItemBase item = CommsManager.UserProfileCacheService.libraryRoot.HasItem(oldItemID); 410 InventoryItemBase item = CommsManager.UserProfileCacheService.libraryRoot.HasItem(oldItemID);
411 if (item == null) 411 if (item == null)
412 { 412 {
413 CachedUserInfo userInfo = CommsManager.UserProfileCacheService.GetUserDetails(oldAgentID); 413 CachedUserInfo userInfo = CommsManager.UserProfileCacheService.GetUserDetails(oldAgentID);
414 if (userInfo == null) 414 if (userInfo == null)
415 { 415 {
416 m_log.Error("[AGENT INVENTORY]: Failed to find user " + oldAgentID); 416 m_log.Error("[AGENT INVENTORY]: Failed to find user " + oldAgentID.ToString());
417 return; 417 return;
418 } 418 }
419 419
@@ -422,20 +422,20 @@ namespace OpenSim.Region.Environment.Scenes
422 item = userInfo.RootFolder.HasItem(oldItemID); 422 item = userInfo.RootFolder.HasItem(oldItemID);
423 if (item == null) 423 if (item == null)
424 { 424 {
425 m_log.Error("[AGENT INVENTORY]: Failed to find item " + oldItemID); 425 m_log.Error("[AGENT INVENTORY]: Failed to find item " + oldItemID.ToString());
426 return; 426 return;
427 } 427 }
428 } 428 }
429 else 429 else
430 { 430 {
431 m_log.Error("[AGENT INVENTORY]: Failed to find item " + oldItemID); 431 m_log.Error("[AGENT INVENTORY]: Failed to find item " + oldItemID.ToString());
432 return; 432 return;
433 } 433 }
434 } 434 }
435 435
436 AssetBase asset 436 AssetBase asset
437 = AssetCache.GetAsset( 437 = AssetCache.GetAsset(
438 item.AssetID, (item.AssetType == (int) AssetType.Texture ? true : false)); 438 item.AssetID, (item.AssetType == (int)AssetType.Texture ? true : false));
439 439
440 if (asset != null) 440 if (asset != null)
441 { 441 {
@@ -447,7 +447,7 @@ namespace OpenSim.Region.Environment.Scenes
447 { 447 {
448 m_log.ErrorFormat( 448 m_log.ErrorFormat(
449 "[AGENT INVENTORY]: Could not copy item {0} since asset {1} could not be found", 449 "[AGENT INVENTORY]: Could not copy item {0} since asset {1} could not be found",
450 item.Name, item.AssetID); 450 item.Name, item.AssetID);
451 } 451 }
452 } 452 }
453 453
@@ -472,7 +472,7 @@ namespace OpenSim.Region.Environment.Scenes
472 CachedUserInfo userInfo = CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId); 472 CachedUserInfo userInfo = CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId);
473 if (userInfo == null) 473 if (userInfo == null)
474 { 474 {
475 m_log.Error("[AGENT INVENTORY]: Failed to find user " + remoteClient.AgentId); 475 m_log.Error("[AGENT INVENTORY]: Failed to find user " + remoteClient.AgentId.ToString());
476 return; 476 return;
477 } 477 }
478 478
@@ -493,13 +493,13 @@ namespace OpenSim.Region.Environment.Scenes
493 } 493 }
494 else 494 else
495 { 495 {
496 m_log.Error("[AGENT INVENTORY]: Failed to find item " + itemID); 496 m_log.Error("[AGENT INVENTORY]: Failed to find item " + itemID.ToString());
497 return; 497 return;
498 } 498 }
499 } 499 }
500 else 500 else
501 { 501 {
502 m_log.Error("[AGENT INVENTORY]: Failed to find item " + itemID + ", no root folder"); 502 m_log.Error("[AGENT INVENTORY]: Failed to find item " + itemID.ToString() + ", no root folder");
503 return; 503 return;
504 } 504 }
505 } 505 }
@@ -515,9 +515,9 @@ namespace OpenSim.Region.Environment.Scenes
515 private void CreateNewInventoryItem(IClientAPI remoteClient, LLUUID folderID, uint callbackID, 515 private void CreateNewInventoryItem(IClientAPI remoteClient, LLUUID folderID, uint callbackID,
516 AssetBase asset, uint nextOwnerMask) 516 AssetBase asset, uint nextOwnerMask)
517 { 517 {
518 CachedUserInfo userInfo 518 CachedUserInfo userInfo
519 = CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId); 519 = CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId);
520 520
521 if (userInfo != null) 521 if (userInfo != null)
522 { 522 {
523 InventoryItemBase item = new InventoryItemBase(); 523 InventoryItemBase item = new InventoryItemBase();
@@ -539,8 +539,8 @@ namespace OpenSim.Region.Environment.Scenes
539 else 539 else
540 { 540 {
541 m_log.WarnFormat( 541 m_log.WarnFormat(
542 "No user details associated with client {0} uuid {1} in CreateNewInventoryItem!", 542 "No user details associated with client {0} uuid {1} in CreateNewInventoryItem!",
543 remoteClient.Name, remoteClient.AgentId); 543 remoteClient.Name, remoteClient.AgentId);
544 } 544 }
545 } 545 }
546 546
@@ -564,25 +564,25 @@ namespace OpenSim.Region.Environment.Scenes
564 byte wearableType, uint nextOwnerMask) 564 byte wearableType, uint nextOwnerMask)
565 { 565 {
566// m_log.DebugFormat("[AGENT INVENTORY]: Received request to create inventory item {0} in folder {1}", name, folderID); 566// m_log.DebugFormat("[AGENT INVENTORY]: Received request to create inventory item {0} in folder {1}", name, folderID);
567 567
568 if (transactionID == LLUUID.Zero) 568 if (transactionID == LLUUID.Zero)
569 { 569 {
570 CachedUserInfo userInfo 570 CachedUserInfo userInfo
571 = CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId); 571 = CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId);
572 572
573 if (userInfo != null) 573 if (userInfo != null)
574 { 574 {
575 ScenePresence presence; 575 ScenePresence presence;
576 TryGetAvatar(remoteClient.AgentId, out presence); 576 TryGetAvatar(remoteClient.AgentId, out presence);
577 byte[] data = null; 577 byte[] data = null;
578 if (invType == 3 && presence != null) // libsecondlife.asset.assettype.landmark = 3 - needs to be turned into an enum 578 if(invType == 3 && presence != null) // libsecondlife.asset.assettype.landmark = 3 - needs to be turned into an enum
579 { 579 {
580 LLVector3 pos = presence.AbsolutePosition; 580 LLVector3 pos=presence.AbsolutePosition;
581 string strdata = String.Format("Landmark version 2\nregion_id {0}\nlocal_pos {1} {2} {3}\nregion_handle {4}\n", 581 string strdata=String.Format("Landmark version 2\nregion_id {0}\nlocal_pos {1} {2} {3}\nregion_handle {4}\n",
582 presence.Scene.RegionInfo.RegionID, 582 presence.Scene.RegionInfo.RegionID,
583 pos.X, pos.Y, pos.Z, 583 pos.X, pos.Y, pos.Z,
584 presence.RegionHandle); 584 presence.RegionHandle);
585 data = Encoding.ASCII.GetBytes(strdata); 585 data=Encoding.ASCII.GetBytes(strdata);
586 } 586 }
587 587
588 AssetBase asset = CreateAsset(name, description, invType, assetType, data); 588 AssetBase asset = CreateAsset(name, description, invType, assetType, data);
@@ -593,19 +593,21 @@ namespace OpenSim.Region.Environment.Scenes
593 else 593 else
594 { 594 {
595 m_log.ErrorFormat( 595 m_log.ErrorFormat(
596 "userInfo for agent uuid {0} unexpectedly null in CreateNewInventoryItem", 596 "userInfo for agent uuid {0} unexpectedly null in CreateNewInventoryItem",
597 remoteClient.AgentId); 597 remoteClient.AgentId);
598 } 598 }
599 } 599 }
600 else 600 else
601 { 601 {
602 IAgentAssetTransactions agentTransactions = RequestModuleInterface<IAgentAssetTransactions>(); 602 IAgentAssetTransactions agentTransactions = this.RequestModuleInterface<IAgentAssetTransactions>();
603 if (agentTransactions != null) 603 if (agentTransactions != null)
604 { 604 {
605 agentTransactions.HandleItemCreationFromTransaction( 605 agentTransactions.HandleItemCreationFromTransaction(
606 remoteClient, transactionID, folderID, callbackID, description, 606 remoteClient, transactionID, folderID, callbackID, description,
607 name, invType, assetType, wearableType, nextOwnerMask); 607 name, invType, assetType, wearableType, nextOwnerMask);
608 } 608 }
609
610
609 } 611 }
610 } 612 }
611 613
@@ -615,7 +617,7 @@ namespace OpenSim.Region.Environment.Scenes
615 = CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId); 617 = CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId);
616 if (userInfo == null) 618 if (userInfo == null)
617 { 619 {
618 m_log.Error("[AGENT INVENTORY]: Failed to find user " + remoteClient.AgentId); 620 m_log.Error("[AGENT INVENTORY]: Failed to find user " + remoteClient.AgentId.ToString());
619 return; 621 return;
620 } 622 }
621 623
@@ -639,7 +641,7 @@ namespace OpenSim.Region.Environment.Scenes
639 = CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId); 641 = CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId);
640 if (userInfo == null) 642 if (userInfo == null)
641 { 643 {
642 m_log.Error("[AGENT INVENTORY]: Failed to find user " + remoteClient.AgentId); 644 m_log.Error("[AGENT INVENTORY]: Failed to find user " + remoteClient.AgentId.ToString());
643 return; 645 return;
644 } 646 }
645 647
@@ -675,7 +677,7 @@ namespace OpenSim.Region.Environment.Scenes
675 /// <param name="remoteClient"></param> 677 /// <param name="remoteClient"></param>
676 /// <param name="primLocalID"></param> 678 /// <param name="primLocalID"></param>
677 public void RequestTaskInventory(IClientAPI remoteClient, uint primLocalID) 679 public void RequestTaskInventory(IClientAPI remoteClient, uint primLocalID)
678 { 680 {
679 SceneObjectGroup group = GetGroupByPrim(primLocalID); 681 SceneObjectGroup group = GetGroupByPrim(primLocalID);
680 if (group != null) 682 if (group != null)
681 { 683 {
@@ -723,7 +725,7 @@ namespace OpenSim.Region.Environment.Scenes
723 localID); 725 localID);
724 } 726 }
725 } 727 }
726 728
727 /// <summary> 729 /// <summary>
728 /// Move the given item in the given prim to a folder in the client's inventory 730 /// Move the given item in the given prim to a folder in the client's inventory
729 /// </summary> 731 /// </summary>
@@ -734,43 +736,43 @@ namespace OpenSim.Region.Environment.Scenes
734 public void MoveTaskInventoryItem(IClientAPI remoteClient, LLUUID folderId, uint primLocalId, LLUUID itemId) 736 public void MoveTaskInventoryItem(IClientAPI remoteClient, LLUUID folderId, uint primLocalId, LLUUID itemId)
735 { 737 {
736 SceneObjectGroup group = GetGroupByPrim(primLocalId); 738 SceneObjectGroup group = GetGroupByPrim(primLocalId);
737 739
738 if (null == group) 740 if (null == group)
739 { 741 {
740 m_log.WarnFormat( 742 m_log.WarnFormat(
741 "[PRIM INVENTORY]: " + 743 "[PRIM INVENTORY]: " +
742 "Move of inventory item {0} from prim with local id {1} failed because the prim could not be found", 744 "Move of inventory item {0} from prim with local id {1} failed because the prim could not be found",
743 itemId, primLocalId); 745 itemId, primLocalId);
744 746
745 return; 747 return;
746 } 748 }
747 749
748 TaskInventoryItem taskItem = group.GetInventoryItem(primLocalId, itemId); 750 TaskInventoryItem taskItem = group.GetInventoryItem(primLocalId, itemId);
749 751
750 if (null == taskItem) 752 if (null == taskItem)
751 { 753 {
752 // Console already notified of error in GetInventoryItem 754 // Console already notified of error in GetInventoryItem
753 return; 755 return;
754 } 756 }
755 757
756// bool permission; 758// bool permission;
757// permission = PermissionsMngr.CanCopyObject(remoteClient.AgentId, 759// permission = PermissionsMngr.CanCopyObject(remoteClient.AgentId,
758// ((SceneObjectGroup) selectedEnt).UUID); 760// ((SceneObjectGroup) selectedEnt).UUID);
759 761
760 // Pending resolving upstream problems with permissions, we just won't allow anybody who is not the owner 762 // Pending resolving upstream problems with permissions, we just won't allow anybody who is not the owner
761 // to copy 763 // to copy
762 if (remoteClient.AgentId != taskItem.OwnerID) 764 if (remoteClient.AgentId != taskItem.OwnerID)
763 { 765 {
764 m_log.InfoFormat( 766 m_log.InfoFormat(
765 "[PRIM INVENTORY]: Attempt made by {0} {1} to copy inventory item {2} {3} in prim {4} {5}," 767 "[PRIM INVENTORY]: Attempt made by {0} {1} to copy inventory item {2} {3} in prim {4} {5},"
766 + " but temporarily not allowed pending upstream bugfixes/feature implementation", 768 + " but temporarily not allowed pending upstream bugfixes/feature implementation",
767 remoteClient.Name, remoteClient.AgentId, taskItem.Name, taskItem.ItemID, group.Name, group.UUID); 769 remoteClient.Name, remoteClient.AgentId, taskItem.Name, taskItem.ItemID, group.Name, group.UUID);
768 770
769 return; 771 return;
770 } 772 }
771 773
772 InventoryItemBase agentItem = new InventoryItemBase(); 774 InventoryItemBase agentItem = new InventoryItemBase();
773 775
774 agentItem.ID = LLUUID.Random(); 776 agentItem.ID = LLUUID.Random();
775 agentItem.Creator = taskItem.CreatorID; 777 agentItem.Creator = taskItem.CreatorID;
776 agentItem.Owner = remoteClient.AgentId; 778 agentItem.Owner = remoteClient.AgentId;
@@ -781,9 +783,8 @@ namespace OpenSim.Region.Environment.Scenes
781 agentItem.InvType = taskItem.InvType; 783 agentItem.InvType = taskItem.InvType;
782 agentItem.Folder = folderId; 784 agentItem.Folder = folderId;
783 agentItem.EveryOnePermissions = taskItem.EveryoneMask; 785 agentItem.EveryOnePermissions = taskItem.EveryoneMask;
784 786
785 if (remoteClient.AgentId != taskItem.OwnerID) 787 if (remoteClient.AgentId != taskItem.OwnerID) {
786 {
787 agentItem.BasePermissions = taskItem.NextOwnerMask; 788 agentItem.BasePermissions = taskItem.NextOwnerMask;
788 agentItem.CurrentPermissions = taskItem.NextOwnerMask; 789 agentItem.CurrentPermissions = taskItem.NextOwnerMask;
789 agentItem.NextPermissions = taskItem.NextOwnerMask; 790 agentItem.NextPermissions = taskItem.NextOwnerMask;
@@ -792,9 +793,9 @@ namespace OpenSim.Region.Environment.Scenes
792 { 793 {
793 agentItem.BasePermissions = taskItem.BaseMask; 794 agentItem.BasePermissions = taskItem.BaseMask;
794 agentItem.CurrentPermissions = taskItem.OwnerMask; 795 agentItem.CurrentPermissions = taskItem.OwnerMask;
795 agentItem.NextPermissions = taskItem.NextOwnerMask; 796 agentItem.NextPermissions = taskItem.NextOwnerMask;
796 } 797 }
797 798
798 AddInventoryItem(remoteClient, agentItem); 799 AddInventoryItem(remoteClient, agentItem);
799 } 800 }
800 801
@@ -833,7 +834,7 @@ namespace OpenSim.Region.Environment.Scenes
833 { 834 {
834 group.AddInventoryItem(remoteClient, primLocalID, item, copyID); 835 group.AddInventoryItem(remoteClient, primLocalID, item, copyID);
835 m_log.InfoFormat( 836 m_log.InfoFormat(
836 "[PRIM INVENTORY]: Update with item {0} requested of prim {1} for {2}", 837 "[PRIM INVENTORY]: Update with item {0} requested of prim {1} for {2}",
837 item.Name, primLocalID, remoteClient.Name); 838 item.Name, primLocalID, remoteClient.Name);
838 group.GetProperties(remoteClient); 839 group.GetProperties(remoteClient);
839 } 840 }
@@ -864,22 +865,22 @@ namespace OpenSim.Region.Environment.Scenes
864 public void RezScript(IClientAPI remoteClient, LLUUID itemID, uint localID) 865 public void RezScript(IClientAPI remoteClient, LLUUID itemID, uint localID)
865 { 866 {
866 LLUUID copyID = LLUUID.Random(); 867 LLUUID copyID = LLUUID.Random();
867 868
868 if (itemID != LLUUID.Zero) 869 if (itemID != LLUUID.Zero)
869 { 870 {
870 CachedUserInfo userInfo = CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId); 871 CachedUserInfo userInfo = CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId);
871 872
872 if (userInfo != null && userInfo.RootFolder != null) 873 if (userInfo != null && userInfo.RootFolder != null)
873 { 874 {
874 InventoryItemBase item = userInfo.RootFolder.HasItem(itemID); 875 InventoryItemBase item = userInfo.RootFolder.HasItem(itemID);
875 876
876 // Try library 877 // Try library
877 // XXX clumsy, possibly should be one call 878 // XXX clumsy, possibly should be one call
878 if (null == item) 879 if (null == item)
879 { 880 {
880 item = CommsManager.UserProfileCacheService.libraryRoot.HasItem(itemID); 881 item = CommsManager.UserProfileCacheService.libraryRoot.HasItem(itemID);
881 } 882 }
882 883
883 if (item != null) 884 if (item != null)
884 { 885 {
885 SceneObjectGroup group = GetGroupByPrim(localID); 886 SceneObjectGroup group = GetGroupByPrim(localID);
@@ -888,10 +889,10 @@ namespace OpenSim.Region.Environment.Scenes
888 group.AddInventoryItem(remoteClient, localID, item, copyID); 889 group.AddInventoryItem(remoteClient, localID, item, copyID);
889 group.StartScript(localID, copyID); 890 group.StartScript(localID, copyID);
890 group.GetProperties(remoteClient); 891 group.GetProperties(remoteClient);
891 892
892 // m_log.InfoFormat("[PRIMINVENTORY]: " + 893 // m_log.InfoFormat("[PRIMINVENTORY]: " +
893 // "Rezzed script {0} into prim local ID {1} for user {2}", 894 // "Rezzed script {0} into prim local ID {1} for user {2}",
894 // item.inventoryName, localID, remoteClient.Name); 895 // item.inventoryName, localID, remoteClient.Name);
895 } 896 }
896 else 897 else
897 { 898 {
@@ -910,7 +911,7 @@ namespace OpenSim.Region.Environment.Scenes
910 } 911 }
911 } 912 }
912 } 913 }
913 else // If the itemID is zero then the script has been rezzed directly in an object's inventory 914 else // If the itemID is zero then the script has been rezzed directly in an object's inventory
914 { 915 {
915 // not yet implemented 916 // not yet implemented
916 // TODO Need to get more details from original RezScript packet 917 // TODO Need to get more details from original RezScript packet
@@ -926,7 +927,7 @@ namespace OpenSim.Region.Environment.Scenes
926 /// <param name="packet"></param> 927 /// <param name="packet"></param>
927 /// <param name="simClient"></param> 928 /// <param name="simClient"></param>
928 public virtual void DeRezObject(Packet packet, IClientAPI remoteClient) 929 public virtual void DeRezObject(Packet packet, IClientAPI remoteClient)
929 { 930 {
930 DeRezObjectPacket DeRezPacket = (DeRezObjectPacket) packet; 931 DeRezObjectPacket DeRezPacket = (DeRezObjectPacket) packet;
931 932
932 if (DeRezPacket.AgentBlock.DestinationID == LLUUID.Zero) 933 if (DeRezPacket.AgentBlock.DestinationID == LLUUID.Zero)
@@ -936,11 +937,11 @@ namespace OpenSim.Region.Environment.Scenes
936 else 937 else
937 { 938 {
938 foreach (DeRezObjectPacket.ObjectDataBlock Data in DeRezPacket.ObjectData) 939 foreach (DeRezObjectPacket.ObjectDataBlock Data in DeRezPacket.ObjectData)
939 { 940 {
940// m_log.DebugFormat( 941// m_log.DebugFormat(
941// "[AGENT INVENTORY]: Received request to derez {0} into folder {1}", 942// "[AGENT INVENTORY]: Received request to derez {0} into folder {1}",
942// Data.ObjectLocalID, DeRezPacket.AgentBlock.DestinationID); 943// Data.ObjectLocalID, DeRezPacket.AgentBlock.DestinationID);
943 944
944 EntityBase selectedEnt = null; 945 EntityBase selectedEnt = null;
945 //m_log.Info("[CLIENT]: LocalID:" + Data.ObjectLocalID.ToString()); 946 //m_log.Info("[CLIENT]: LocalID:" + Data.ObjectLocalID.ToString());
946 947
@@ -958,16 +959,14 @@ namespace OpenSim.Region.Environment.Scenes
958 { 959 {
959 bool permission; 960 bool permission;
960 if (DeRezPacket.AgentBlock.Destination == 1) 961 if (DeRezPacket.AgentBlock.Destination == 1)
961 { 962 { // Take Copy
962 // Take Copy 963 permission = PermissionsMngr.CanCopyObject(remoteClient.AgentId,
963 permission = PermissionsMngr.CanCopyObject(remoteClient.AgentId, 964 ((SceneObjectGroup) selectedEnt).UUID);
964 (selectedEnt).UUID);
965 } 965 }
966 else 966 else
967 { 967 { // Take
968 // Take 968 permission = PermissionsMngr.CanDeRezObject(remoteClient.AgentId,
969 permission = PermissionsMngr.CanDeRezObject(remoteClient.AgentId, 969 ((SceneObjectGroup) selectedEnt).UUID);
970 (selectedEnt).UUID);
971 } 970 }
972 971
973 if (permission) 972 if (permission)
@@ -998,8 +997,7 @@ namespace OpenSim.Region.Environment.Scenes
998 item.InvType = asset.InvType; 997 item.InvType = asset.InvType;
999 item.Folder = DeRezPacket.AgentBlock.DestinationID; 998 item.Folder = DeRezPacket.AgentBlock.DestinationID;
1000 item.EveryOnePermissions = objectGroup.RootPart.EveryoneMask; 999 item.EveryOnePermissions = objectGroup.RootPart.EveryoneMask;
1001 if (remoteClient.AgentId != objectGroup.RootPart.OwnerID) 1000 if (remoteClient.AgentId != objectGroup.RootPart.OwnerID) {
1002 {
1003 item.BasePermissions = objectGroup.RootPart.NextOwnerMask; 1001 item.BasePermissions = objectGroup.RootPart.NextOwnerMask;
1004 item.CurrentPermissions = objectGroup.RootPart.NextOwnerMask; 1002 item.CurrentPermissions = objectGroup.RootPart.NextOwnerMask;
1005 item.NextPermissions = objectGroup.RootPart.NextOwnerMask; 1003 item.NextPermissions = objectGroup.RootPart.NextOwnerMask;
@@ -1027,7 +1025,6 @@ namespace OpenSim.Region.Environment.Scenes
1027 } 1025 }
1028 } 1026 }
1029 } 1027 }
1030
1031 public void updateKnownAsset(IClientAPI remoteClient, SceneObjectGroup grp, LLUUID assetID, LLUUID agentID) 1028 public void updateKnownAsset(IClientAPI remoteClient, SceneObjectGroup grp, LLUUID assetID, LLUUID agentID)
1032 { 1029 {
1033 SceneObjectGroup objectGroup = grp; 1030 SceneObjectGroup objectGroup = grp;
@@ -1047,6 +1044,7 @@ namespace OpenSim.Region.Environment.Scenes
1047 // search through folders to find the asset. 1044 // search through folders to find the asset.
1048 while (searchfolders.Count > 0) 1045 while (searchfolders.Count > 0)
1049 { 1046 {
1047
1050 InventoryFolderImpl fld = searchfolders.Dequeue(); 1048 InventoryFolderImpl fld = searchfolders.Dequeue();
1051 lock (fld) 1049 lock (fld)
1052 { 1050 {
@@ -1071,8 +1069,8 @@ namespace OpenSim.Region.Environment.Scenes
1071 AssetBase asset = CreateAsset( 1069 AssetBase asset = CreateAsset(
1072 objectGroup.GetPartName(objectGroup.LocalId), 1070 objectGroup.GetPartName(objectGroup.LocalId),
1073 objectGroup.GetPartDescription(objectGroup.LocalId), 1071 objectGroup.GetPartDescription(objectGroup.LocalId),
1074 (sbyte) InventoryType.Object, 1072 (sbyte)InventoryType.Object,
1075 (sbyte) AssetType.Object, 1073 (sbyte)AssetType.Object,
1076 Helpers.StringToField(sceneObjectXml)); 1074 Helpers.StringToField(sceneObjectXml));
1077 AssetCache.AddAsset(asset); 1075 AssetCache.AddAsset(asset);
1078 1076
@@ -1088,7 +1086,7 @@ namespace OpenSim.Region.Environment.Scenes
1088 1086
1089 // Sticking it in root folder for now.. objects folder later? 1087 // Sticking it in root folder for now.. objects folder later?
1090 1088
1091 item.Folder = foundFolder; // DeRezPacket.AgentBlock.DestinationID; 1089 item.Folder = foundFolder;// DeRezPacket.AgentBlock.DestinationID;
1092 item.EveryOnePermissions = objectGroup.RootPart.EveryoneMask; 1090 item.EveryOnePermissions = objectGroup.RootPart.EveryoneMask;
1093 if (agentID != objectGroup.RootPart.OwnerID) 1091 if (agentID != objectGroup.RootPart.OwnerID)
1094 { 1092 {
@@ -1110,10 +1108,10 @@ namespace OpenSim.Region.Environment.Scenes
1110 { 1108 {
1111 remoteClient.SendInventoryItemCreateUpdate(item); 1109 remoteClient.SendInventoryItemCreateUpdate(item);
1112 } 1110 }
1111
1113 } 1112 }
1114 } 1113 }
1115 } 1114 }
1116
1117 public LLUUID attachObjectAssetStore(IClientAPI remoteClient, SceneObjectGroup grp, LLUUID AgentId) 1115 public LLUUID attachObjectAssetStore(IClientAPI remoteClient, SceneObjectGroup grp, LLUUID AgentId)
1118 { 1116 {
1119 SceneObjectGroup objectGroup = grp; 1117 SceneObjectGroup objectGroup = grp;
@@ -1128,8 +1126,8 @@ namespace OpenSim.Region.Environment.Scenes
1128 AssetBase asset = CreateAsset( 1126 AssetBase asset = CreateAsset(
1129 objectGroup.GetPartName(objectGroup.LocalId), 1127 objectGroup.GetPartName(objectGroup.LocalId),
1130 objectGroup.GetPartDescription(objectGroup.LocalId), 1128 objectGroup.GetPartDescription(objectGroup.LocalId),
1131 (sbyte) InventoryType.Object, 1129 (sbyte)InventoryType.Object,
1132 (sbyte) AssetType.Object, 1130 (sbyte)AssetType.Object,
1133 Helpers.StringToField(sceneObjectXml)); 1131 Helpers.StringToField(sceneObjectXml));
1134 AssetCache.AddAsset(asset); 1132 AssetCache.AddAsset(asset);
1135 1133
@@ -1142,10 +1140,10 @@ namespace OpenSim.Region.Environment.Scenes
1142 item.Name = asset.Name; 1140 item.Name = asset.Name;
1143 item.AssetType = asset.Type; 1141 item.AssetType = asset.Type;
1144 item.InvType = asset.InvType; 1142 item.InvType = asset.InvType;
1145 1143
1146 // Sticking it in root folder for now.. objects folder later? 1144 // Sticking it in root folder for now.. objects folder later?
1147 1145
1148 item.Folder = userInfo.RootFolder.ID; // DeRezPacket.AgentBlock.DestinationID; 1146 item.Folder = userInfo.RootFolder.ID;// DeRezPacket.AgentBlock.DestinationID;
1149 item.EveryOnePermissions = objectGroup.RootPart.EveryoneMask; 1147 item.EveryOnePermissions = objectGroup.RootPart.EveryoneMask;
1150 if (remoteClient.AgentId != objectGroup.RootPart.OwnerID) 1148 if (remoteClient.AgentId != objectGroup.RootPart.OwnerID)
1151 { 1149 {
@@ -1167,6 +1165,7 @@ namespace OpenSim.Region.Environment.Scenes
1167 return LLUUID.Zero; 1165 return LLUUID.Zero;
1168 } 1166 }
1169 return LLUUID.Zero; 1167 return LLUUID.Zero;
1168
1170 } 1169 }
1171 1170
1172 /// <summary> 1171 /// <summary>
@@ -1188,63 +1187,64 @@ namespace OpenSim.Region.Environment.Scenes
1188 /// <param name="RemoveItem"></param> 1187 /// <param name="RemoveItem"></param>
1189 /// <param name="fromTaskID"></param> 1188 /// <param name="fromTaskID"></param>
1190 public virtual void RezObject(IClientAPI remoteClient, LLUUID itemID, LLVector3 RayEnd, LLVector3 RayStart, 1189 public virtual void RezObject(IClientAPI remoteClient, LLUUID itemID, LLVector3 RayEnd, LLVector3 RayStart,
1191 LLUUID RayTargetID, byte BypassRayCast, bool RayEndIsIntersection, 1190 LLUUID RayTargetID, byte BypassRayCast, bool RayEndIsIntersection,
1192 uint EveryoneMask, uint GroupMask, uint NextOwnerMask, uint ItemFlags, 1191 uint EveryoneMask, uint GroupMask, uint NextOwnerMask, uint ItemFlags,
1193 bool RezSelected, bool RemoveItem, LLUUID fromTaskID) 1192 bool RezSelected, bool RemoveItem, LLUUID fromTaskID)
1194 { 1193 {
1195 SceneObjectGroup sog = RezObject(remoteClient, itemID, RayEnd, RayStart, 1194 SceneObjectGroup sog = RezObject(remoteClient, itemID, RayEnd, RayStart,
1196 RayTargetID, BypassRayCast, RayEndIsIntersection, 1195 RayTargetID, BypassRayCast, RayEndIsIntersection,
1197 EveryoneMask, GroupMask, NextOwnerMask, ItemFlags, 1196 EveryoneMask, GroupMask, NextOwnerMask, ItemFlags,
1198 RezSelected, RemoveItem, fromTaskID, false); 1197 RezSelected, RemoveItem, fromTaskID, false);
1199 } 1198 }
1200 1199
1201 1200
1202 /// <summary> 1201
1203 /// Returns SceneObjectGroup or null from asset request. 1202 /// <summary>
1204 /// </summary> 1203 /// Returns SceneObjectGroup or null from asset request.
1205 /// <param name="remoteClient"></param> 1204 /// </summary>
1206 /// <param name="itemID"></param> 1205 /// <param name="remoteClient"></param>
1207 /// <param name="RayEnd"></param> 1206 /// <param name="itemID"></param>
1208 /// <param name="RayStart"></param> 1207 /// <param name="RayEnd"></param>
1209 /// <param name="RayTargetID"></param> 1208 /// <param name="RayStart"></param>
1210 /// <param name="BypassRayCast"></param> 1209 /// <param name="RayTargetID"></param>
1211 /// <param name="RayEndIsIntersection"></param> 1210 /// <param name="BypassRayCast"></param>
1212 /// <param name="EveryoneMask"></param> 1211 /// <param name="RayEndIsIntersection"></param>
1213 /// <param name="GroupMask"></param> 1212 /// <param name="EveryoneMask"></param>
1214 /// <param name="NextOwnerMask"></param> 1213 /// <param name="GroupMask"></param>
1215 /// <param name="ItemFlags"></param> 1214 /// <param name="NextOwnerMask"></param>
1216 /// <param name="RezSelected"></param> 1215 /// <param name="ItemFlags"></param>
1217 /// <param name="RemoveItem"></param> 1216 /// <param name="RezSelected"></param>
1218 /// <param name="fromTaskID"></param> 1217 /// <param name="RemoveItem"></param>
1219 /// <param name="difference"></param> 1218 /// <param name="fromTaskID"></param>
1220 /// <returns></returns> 1219 /// <param name="difference"></param>
1220 /// <returns></returns>
1221 public virtual SceneObjectGroup RezObject(IClientAPI remoteClient, LLUUID itemID, LLVector3 RayEnd, LLVector3 RayStart, 1221 public virtual SceneObjectGroup RezObject(IClientAPI remoteClient, LLUUID itemID, LLVector3 RayEnd, LLVector3 RayStart,
1222 LLUUID RayTargetID, byte BypassRayCast, bool RayEndIsIntersection, 1222 LLUUID RayTargetID, byte BypassRayCast, bool RayEndIsIntersection,
1223 uint EveryoneMask, uint GroupMask, uint NextOwnerMask, uint ItemFlags, 1223 uint EveryoneMask, uint GroupMask, uint NextOwnerMask, uint ItemFlags,
1224 bool RezSelected, bool RemoveItem, LLUUID fromTaskID, bool attachment) 1224 bool RezSelected, bool RemoveItem, LLUUID fromTaskID, bool attachment)
1225 { 1225 {
1226 // Work out position details 1226 // Work out position details
1227 byte bRayEndIsIntersection = 0; 1227 byte bRayEndIsIntersection = (byte)0;
1228 1228
1229 if (RayEndIsIntersection) 1229 if (RayEndIsIntersection)
1230 { 1230 {
1231 bRayEndIsIntersection = 1; 1231 bRayEndIsIntersection = (byte)1;
1232 } 1232 }
1233 else 1233 else
1234 { 1234 {
1235 bRayEndIsIntersection = 0; 1235 bRayEndIsIntersection = (byte)0;
1236 } 1236 }
1237 1237
1238 LLVector3 scale = new LLVector3(0.5f, 0.5f, 0.5f); 1238 LLVector3 scale = new LLVector3(0.5f, 0.5f, 0.5f);
1239 1239
1240 1240
1241 LLVector3 pos = GetNewRezLocation( 1241 LLVector3 pos = GetNewRezLocation(
1242 RayStart, RayEnd, RayTargetID, new LLQuaternion(0, 0, 0, 1), 1242 RayStart, RayEnd, RayTargetID, new LLQuaternion(0, 0, 0, 1),
1243 BypassRayCast, bRayEndIsIntersection, true, scale, false); 1243 BypassRayCast, bRayEndIsIntersection,true,scale, false);
1244 1244
1245 if (!PermissionsMngr.CanRezObject(remoteClient.AgentId, pos) && !attachment) 1245 if (!PermissionsMngr.CanRezObject(remoteClient.AgentId, pos) && !attachment)
1246 { 1246 {
1247 return null; 1247 return null;
1248 } 1248 }
1249 1249
1250 // Rez object 1250 // Rez object
@@ -1260,7 +1260,7 @@ namespace OpenSim.Region.Environment.Scenes
1260 1260
1261 if (rezAsset != null) 1261 if (rezAsset != null)
1262 { 1262 {
1263 string xmlData = Helpers.FieldToUTF8String(rezAsset.Data); 1263 string xmlData = Helpers.FieldToUTF8String(rezAsset.Data);
1264 SceneObjectGroup group = new SceneObjectGroup(this, m_regionHandle, xmlData); 1264 SceneObjectGroup group = new SceneObjectGroup(this, m_regionHandle, xmlData);
1265 group.ResetIDs(); 1265 group.ResetIDs();
1266 AddEntity(group); 1266 AddEntity(group);
@@ -1270,8 +1270,8 @@ namespace OpenSim.Region.Environment.Scenes
1270 if (!attachment) 1270 if (!attachment)
1271 { 1271 {
1272 pos = GetNewRezLocation( 1272 pos = GetNewRezLocation(
1273 RayStart, RayEnd, RayTargetID, new LLQuaternion(0, 0, 0, 1), 1273 RayStart, RayEnd, RayTargetID, new LLQuaternion(0, 0, 0, 1),
1274 BypassRayCast, bRayEndIsIntersection, true, group.GroupScale(), false); 1274 BypassRayCast, bRayEndIsIntersection, true, group.GroupScale(), false);
1275 group.AbsolutePosition = pos; 1275 group.AbsolutePosition = pos;
1276 } 1276 }
1277 else 1277 else
@@ -1280,7 +1280,7 @@ namespace OpenSim.Region.Environment.Scenes
1280 } 1280 }
1281 1281
1282 SceneObjectPart rootPart = group.GetChildPart(group.UUID); 1282 SceneObjectPart rootPart = group.GetChildPart(group.UUID);
1283 1283
1284 // Since renaming the item in the inventory does not affect the name stored 1284 // Since renaming the item in the inventory does not affect the name stored
1285 // in the serialization, transfer the correct name from the inventory to the 1285 // in the serialization, transfer the correct name from the inventory to the
1286 // object itself before we rez. 1286 // object itself before we rez.
@@ -1301,22 +1301,22 @@ namespace OpenSim.Region.Environment.Scenes
1301 part.ChangeInventoryOwner(item.Owner); 1301 part.ChangeInventoryOwner(item.Owner);
1302 } 1302 }
1303 } 1303 }
1304 1304
1305 rootPart.TrimPermissions(); 1305 rootPart.TrimPermissions();
1306 1306
1307 if (!attachment) 1307 if (!attachment)
1308 { 1308 {
1309 if (group.RootPart.Shape.PCode == (byte) PCode.Prim) 1309 if (group.RootPart.Shape.PCode == (byte)PCode.Prim)
1310 { 1310 {
1311 group.ClearPartAttachmentData(); 1311 group.ClearPartAttachmentData();
1312 } 1312 }
1313 group.ApplyPhysics(m_physicalPrim); 1313 group.ApplyPhysics(m_physicalPrim);
1314 } 1314 }
1315 1315
1316 1316
1317 group.StartScripts(); 1317 group.StartScripts();
1318 1318
1319 1319
1320 if (!attachment) 1320 if (!attachment)
1321 rootPart.ScheduleFullUpdate(); 1321 rootPart.ScheduleFullUpdate();
1322 1322
@@ -1327,5 +1327,7 @@ namespace OpenSim.Region.Environment.Scenes
1327 } 1327 }
1328 return null; 1328 return null;
1329 } 1329 }
1330
1331
1330 } 1332 }
1331} \ No newline at end of file 1333}
diff --git a/OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs b/OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs
index b052096..dccc09a 100644
--- a/OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs
+++ b/OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs
@@ -78,12 +78,11 @@ namespace OpenSim.Region.Environment.Scenes
78 foreach (EntityBase ent in EntitieList) 78 foreach (EntityBase ent in EntitieList)
79 { 79 {
80 if (ent is SceneObjectGroup) 80 if (ent is SceneObjectGroup)
81 { 81 {
82 if ((ent).LocalId == primLocalID) 82 if (((SceneObjectGroup) ent).LocalId == primLocalID)
83 { 83 {
84 // A prim is only tainted if it's allowed to be edited by the person clicking it. 84 // A prim is only tainted if it's allowed to be edited by the person clicking it.
85 if (m_permissionManager.CanEditObjectPosition(remoteClient.AgentId, (ent).UUID) || 85 if (m_permissionManager.CanEditObjectPosition(remoteClient.AgentId, ((SceneObjectGroup)ent).UUID) || m_permissionManager.CanEditObject(remoteClient.AgentId, ((SceneObjectGroup)ent).UUID))
86 m_permissionManager.CanEditObject(remoteClient.AgentId, (ent).UUID))
87 { 86 {
88 ((SceneObjectGroup) ent).GetProperties(remoteClient); 87 ((SceneObjectGroup) ent).GetProperties(remoteClient);
89 ((SceneObjectGroup) ent).IsSelected = true; 88 ((SceneObjectGroup) ent).IsSelected = true;
@@ -108,10 +107,9 @@ namespace OpenSim.Region.Environment.Scenes
108 { 107 {
109 if (ent is SceneObjectGroup) 108 if (ent is SceneObjectGroup)
110 { 109 {
111 if ((ent).LocalId == primLocalID) 110 if (((SceneObjectGroup) ent).LocalId == primLocalID)
112 { 111 {
113 if (m_permissionManager.CanEditObjectPosition(remoteClient.AgentId, (ent).UUID) || 112 if (m_permissionManager.CanEditObjectPosition(remoteClient.AgentId, ((SceneObjectGroup)ent).UUID) || m_permissionManager.CanEditObject(remoteClient.AgentId, ((SceneObjectGroup)ent).UUID))
114 m_permissionManager.CanEditObject(remoteClient.AgentId, (ent).UUID))
115 { 113 {
116 ((SceneObjectGroup) ent).IsSelected = false; 114 ((SceneObjectGroup) ent).IsSelected = false;
117 LandChannel.setPrimsTainted(); 115 LandChannel.setPrimsTainted();
@@ -131,20 +129,21 @@ namespace OpenSim.Region.Environment.Scenes
131 } 129 }
132 130
133 public virtual void ProcessParcelBuy(LLUUID agentId, LLUUID groupId, bool final, bool groupOwned, 131 public virtual void ProcessParcelBuy(LLUUID agentId, LLUUID groupId, bool final, bool groupOwned,
134 bool removeContribution, int parcelLocalID, int parcelArea, int parcelPrice, bool authenticated) 132 bool removeContribution, int parcelLocalID, int parcelArea, int parcelPrice, bool authenticated)
135 { 133 {
136 EventManager.LandBuyArgs args = new EventManager.LandBuyArgs( 134 EventManager.LandBuyArgs args = new EventManager.LandBuyArgs(
137 agentId, groupId, final, groupOwned, removeContribution, parcelLocalID, parcelArea, parcelPrice, authenticated); 135 agentId, groupId, final, groupOwned, removeContribution, parcelLocalID, parcelArea, parcelPrice, authenticated);
138 136
139 // First, allow all validators a stab at it 137 // First, allow all validators a stab at it
140 m_eventManager.TriggerValidateLandBuy(this, args); 138 m_eventManager.TriggerValidateLandBuy(this, args);
141 139
142 // Then, check validation and transfer 140 // Then, check validation and transfer
143 m_eventManager.TriggerLandBuy(this, args); 141 m_eventManager.TriggerLandBuy(this, args);
144 } 142 }
145 143
146 public virtual void ProcessObjectGrab(uint localID, LLVector3 offsetPos, IClientAPI remoteClient) 144 public virtual void ProcessObjectGrab(uint localID, LLVector3 offsetPos, IClientAPI remoteClient)
147 { 145 {
146
148 List<EntityBase> EntitieList = GetEntities(); 147 List<EntityBase> EntitieList = GetEntities();
149 148
150 foreach (EntityBase ent in EntitieList) 149 foreach (EntityBase ent in EntitieList)
@@ -179,6 +178,7 @@ namespace OpenSim.Region.Environment.Scenes
179 178
180 public virtual void ProcessObjectDeGrab(uint localID, IClientAPI remoteClient) 179 public virtual void ProcessObjectDeGrab(uint localID, IClientAPI remoteClient)
181 { 180 {
181
182 List<EntityBase> EntitieList = GetEntities(); 182 List<EntityBase> EntitieList = GetEntities();
183 183
184 foreach (EntityBase ent in EntitieList) 184 foreach (EntityBase ent in EntitieList)
@@ -190,7 +190,7 @@ namespace OpenSim.Region.Environment.Scenes
190 // Is this prim part of the group 190 // Is this prim part of the group
191 if (obj.HasChildPrim(localID)) 191 if (obj.HasChildPrim(localID))
192 { 192 {
193 SceneObjectPart part = obj.GetChildPart(localID); 193 SceneObjectPart part=obj.GetChildPart(localID);
194 if (part != null) 194 if (part != null)
195 { 195 {
196 // If the touched prim handles touches, deliver it 196 // If the touched prim handles touches, deliver it
@@ -233,8 +233,8 @@ namespace OpenSim.Region.Environment.Scenes
233 LLUUID translatedIDtem = item.AvatarID; 233 LLUUID translatedIDtem = item.AvatarID;
234 searchData[i] = new AvatarPickerReplyPacket.DataBlock(); 234 searchData[i] = new AvatarPickerReplyPacket.DataBlock();
235 searchData[i].AvatarID = translatedIDtem; 235 searchData[i].AvatarID = translatedIDtem;
236 searchData[i].FirstName = Helpers.StringToField(item.firstName); 236 searchData[i].FirstName = Helpers.StringToField((string) item.firstName);
237 searchData[i].LastName = Helpers.StringToField(item.lastName); 237 searchData[i].LastName = Helpers.StringToField((string) item.lastName);
238 i++; 238 i++;
239 } 239 }
240 if (AvatarResponses.Count == 0) 240 if (AvatarResponses.Count == 0)
@@ -245,4 +245,4 @@ namespace OpenSim.Region.Environment.Scenes
245 client.SendAvatarPickerReply(replyPacket); 245 client.SendAvatarPickerReply(replyPacket);
246 } 246 }
247 } 247 }
248} \ No newline at end of file 248}
diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs
index 6617995..3113831 100644
--- a/OpenSim/Region/Environment/Scenes/Scene.cs
+++ b/OpenSim/Region/Environment/Scenes/Scene.cs
@@ -53,99 +53,107 @@ namespace OpenSim.Region.Environment.Scenes
53 53
54 public partial class Scene : SceneBase 54 public partial class Scene : SceneBase
55 { 55 {
56 #region Delegates
57
58 public delegate void SynchronizeSceneHandler(Scene scene); 56 public delegate void SynchronizeSceneHandler(Scene scene);
57 public SynchronizeSceneHandler SynchronizeScene = null;
58 public int splitID = 0;
59 59
60 #endregion 60 #region Fields
61 61
62 public int splitID; 62 protected Timer m_heartbeatTimer = new Timer();
63 public SynchronizeSceneHandler SynchronizeScene; 63 protected Timer m_restartWaitTimer = new Timer();
64 64
65 #region Fields 65 protected SimStatsReporter m_statsReporter;
66
67 protected List<RegionInfo> m_regionRestartNotifyList = new List<RegionInfo>();
68 protected List<RegionInfo> m_neighbours = new List<RegionInfo>();
69
70 public InnerScene m_innerScene;
66 71
72 private Random Rand = new Random();
73 private uint _primCount = 720000;
67 private readonly Mutex _primAllocateMutex = new Mutex(false); 74 private readonly Mutex _primAllocateMutex = new Mutex(false);
68 75
69 private readonly Timer m_restartTimer = new Timer(15000); // Wait before firing 76 private int m_timePhase = 24;
77
70 private readonly Mutex updateLock; 78 private readonly Mutex updateLock;
71 private uint _primCount = 720000; 79 public bool m_physicalPrim;
72 public CommunicationsManager CommsManager; 80 public bool m_seeIntoRegionFromNeighbor;
73 private int frameMS; 81 public int MaxUndoCount = 5;
82 private int m_RestartTimerCounter;
83 private readonly Timer m_restartTimer = new Timer(15000); // Wait before firing
84 private int m_incrementsof15seconds = 0;
85
86 public string m_simulatorVersion = "OpenSimulator 0.5";
87
88 protected ModuleLoader m_moduleLoader;
89 protected StorageManager m_storageManager;
74 protected AgentCircuitManager m_authenticateHandler; 90 protected AgentCircuitManager m_authenticateHandler;
91 public CommunicationsManager CommsManager;
75 // protected XferManager xferManager; 92 // protected XferManager xferManager;
76 protected IAvatarFactory m_AvatarFactory; 93 protected SceneCommunicationService m_sceneGridService;
94 protected SceneXmlLoader m_sceneXmlLoader;
77 95
78 /// <summary> 96 /// <summary>
79 /// Each agent has its own capabilities handler. 97 /// Each agent has its own capabilities handler.
80 /// </summary> 98 /// </summary>
81 protected Dictionary<LLUUID, Caps> m_capsHandlers = new Dictionary<LLUUID, Caps>(); 99 protected Dictionary<LLUUID, Caps> m_capsHandlers = new Dictionary<LLUUID, Caps>();
100
101 protected BaseHttpServer m_httpListener;
102
103 protected Dictionary<string, IRegionModule> Modules = new Dictionary<string, IRegionModule>();
104 public Dictionary<Type, object> ModuleInterfaces = new Dictionary<Type, object>();
105 protected Dictionary<string, object> ModuleAPIMethods = new Dictionary<string, object>();
106 public Dictionary<string, ICommander> m_moduleCommanders = new Dictionary<string, ICommander>();
107
108 //API module interfaces
109
110 public IXfer XferManager;
111
112 protected IHttpRequests m_httpRequestModule;
113 protected ISimChat m_simChatModule;
114 protected IXMLRPC m_xmlrpcModule;
115 protected IWorldComm m_worldCommModule;
116 protected IAvatarFactory m_AvatarFactory;
82 117
83 // Central Update Loop 118 // Central Update Loop
84 119
85 protected int m_fps = 10; 120 protected int m_fps = 10;
86 protected int m_frame; 121 protected int m_frame = 0;
87 protected Timer m_heartbeatTimer = new Timer(); 122 protected float m_timespan = 0.089f;
88 protected BaseHttpServer m_httpListener;
89 protected IHttpRequests m_httpRequestModule;
90 private int m_incrementsof15seconds;
91 public InnerScene m_innerScene;
92 protected DateTime m_lastupdate = DateTime.Now; 123 protected DateTime m_lastupdate = DateTime.Now;
93 public Dictionary<string, ICommander> m_moduleCommanders = new Dictionary<string, ICommander>();
94 protected ModuleLoader m_moduleLoader;
95 protected List<RegionInfo> m_neighbours = new List<RegionInfo>();
96 public bool m_physicalPrim;
97 private bool m_physics_enabled = true;
98 protected List<RegionInfo> m_regionRestartNotifyList = new List<RegionInfo>();
99 private int m_RestartTimerCounter;
100 protected Timer m_restartWaitTimer = new Timer();
101 protected SceneCommunicationService m_sceneGridService;
102 protected SceneXmlLoader m_sceneXmlLoader;
103 private bool m_scripts_enabled = true;
104 public bool m_seeIntoRegionFromNeighbor;
105 protected ISimChat m_simChatModule;
106 public string m_simulatorVersion = "OpenSimulator 0.5";
107 protected SimStatsReporter m_statsReporter;
108 protected StorageManager m_storageManager;
109 124
110 protected float m_timedilation = 1.0f; 125 protected float m_timedilation = 1.0f;
111 private int m_timePhase = 24;
112 protected float m_timespan = 0.089f;
113 private int m_update_backup = 200;
114 126
127 private int m_update_physics = 1;
128 private int m_update_entitymovement = 1;
115 private int m_update_entities = 1; // Run through all objects checking for updates 129 private int m_update_entities = 1; // Run through all objects checking for updates
116 private int m_update_entitiesquick = 200; // Run through objects that have scheduled updates checking for updates 130 private int m_update_entitiesquick = 200; // Run through objects that have scheduled updates checking for updates
117 private int m_update_entitymovement = 1;
118 private int m_update_events = 1;
119 private int m_update_land = 1;
120 private int m_update_physics = 1;
121 private int m_update_presences = 1; // Update scene presence movements 131 private int m_update_presences = 1; // Update scene presence movements
132 private int m_update_events = 1;
133 private int m_update_backup = 200;
122 private int m_update_terrain = 50; 134 private int m_update_terrain = 50;
123 protected IWorldComm m_worldCommModule; 135 private int m_update_land = 1;
124 protected IXMLRPC m_xmlrpcModule; 136
125 public int MaxUndoCount = 5; 137 private int frameMS = 0;
126 protected Dictionary<string, object> ModuleAPIMethods = new Dictionary<string, object>(); 138 private int physicsMS2 = 0;
127 public Dictionary<Type, object> ModuleInterfaces = new Dictionary<Type, object>(); 139 private int physicsMS = 0;
128 protected Dictionary<string, IRegionModule> Modules = new Dictionary<string, IRegionModule>(); 140 private int otherMS = 0;
141
142 private bool m_physics_enabled = true;
143 private bool m_scripts_enabled = true;
144
129 145
130 private int otherMS;
131 private int physicsMS;
132 private int physicsMS2;
133 private Random Rand = new Random();
134 public IXfer XferManager;
135 146
136 #endregion 147 #endregion
137 148
138 #region Properties 149 #region Properties
139 150
140 protected readonly EstateManager m_estateManager;
141 protected readonly PermissionManager m_permissionManager;
142 public int objectCapacity = 45000;
143
144 public AgentCircuitManager AuthenticateHandler 151 public AgentCircuitManager AuthenticateHandler
145 { 152 {
146 get { return m_authenticateHandler; } 153 get { return m_authenticateHandler; }
147 } 154 }
148 155
156 protected readonly EstateManager m_estateManager;
149 // an instance to the physics plugin's Scene object. 157 // an instance to the physics plugin's Scene object.
150 public PhysicsScene PhysicsScene 158 public PhysicsScene PhysicsScene
151 { 159 {
@@ -169,6 +177,7 @@ namespace OpenSim.Region.Environment.Scenes
169 get { return m_timedilation; } 177 get { return m_timedilation; }
170 } 178 }
171 179
180 protected readonly PermissionManager m_permissionManager;
172 // This is the instance to the permissions manager. 181 // This is the instance to the permissions manager.
173 // This manages permissions to clients on in world objects 182 // This manages permissions to clients on in world objects
174 183
@@ -206,13 +215,14 @@ namespace OpenSim.Region.Environment.Scenes
206 get { return m_innerScene.Entities; } 215 get { return m_innerScene.Entities; }
207 set { m_innerScene.Entities = value; } 216 set { m_innerScene.Entities = value; }
208 } 217 }
209
210 public Dictionary<LLUUID, ScenePresence> m_restorePresences 218 public Dictionary<LLUUID, ScenePresence> m_restorePresences
211 { 219 {
212 get { return m_innerScene.RestorePresences; } 220 get { return m_innerScene.RestorePresences; }
213 set { m_innerScene.RestorePresences = value; } 221 set { m_innerScene.RestorePresences = value; }
214 } 222 }
215 223
224 public int objectCapacity = 45000;
225
216 #endregion 226 #endregion
217 227
218 #region Constructors 228 #region Constructors
@@ -242,9 +252,9 @@ namespace OpenSim.Region.Environment.Scenes
242 252
243 //Bind Storage Manager functions to some land manager functions for this scene 253 //Bind Storage Manager functions to some land manager functions for this scene
244 EventManager.OnLandObjectAdded += 254 EventManager.OnLandObjectAdded +=
245 m_storageManager.DataStore.StoreLandObject; 255 new EventManager.LandObjectAdded(m_storageManager.DataStore.StoreLandObject);
246 EventManager.OnLandObjectRemoved += 256 EventManager.OnLandObjectRemoved +=
247 m_storageManager.DataStore.RemoveLandObject; 257 new EventManager.LandObjectRemoved(m_storageManager.DataStore.RemoveLandObject);
248 258
249 m_estateManager = new EstateManager(this, m_regInfo); 259 m_estateManager = new EstateManager(this, m_regInfo);
250 260
@@ -311,7 +321,7 @@ namespace OpenSim.Region.Environment.Scenes
311 OSString = OSString.Substring(0, 45); 321 OSString = OSString.Substring(0, 45);
312 } 322 }
313 323
314 m_simulatorVersion = "OpenSimulator v0.5-SVN on " + OSString + " ChilTasks:" + m_seeIntoRegionFromNeighbor + " PhysPrim:" + m_physicalPrim; 324 m_simulatorVersion = "OpenSimulator v0.5-SVN on " + OSString + " ChilTasks:" + m_seeIntoRegionFromNeighbor.ToString() + " PhysPrim:" + m_physicalPrim.ToString();
315 } 325 }
316 326
317 #endregion 327 #endregion
@@ -372,23 +382,23 @@ namespace OpenSim.Region.Environment.Scenes
372 } 382 }
373 // If these are cast to INT because long + negative values + abs returns invalid data 383 // If these are cast to INT because long + negative values + abs returns invalid data
374 384
375 int resultX = Math.Abs((int) otherRegion.RegionLocX - (int) RegionInfo.RegionLocX); 385 int resultX = Math.Abs((int)otherRegion.RegionLocX - (int)RegionInfo.RegionLocX);
376 int resultY = Math.Abs((int) otherRegion.RegionLocY - (int) RegionInfo.RegionLocY); 386 int resultY = Math.Abs((int)otherRegion.RegionLocY - (int)RegionInfo.RegionLocY);
377 if ((resultX <= 1) && 387 if ((resultX <= 1) &&
378 (resultY <= 1)) 388 (resultY <= 1))
379 { 389 {
380 try 390 try
381 { 391 {
382 ForEachScenePresence(delegate(ScenePresence agent) 392 ForEachScenePresence(delegate(ScenePresence agent)
393 {
394 // If agent is a root agent.
395 if (!agent.IsChildAgent)
383 { 396 {
384 // If agent is a root agent. 397 //agent.ControllingClient.new
385 if (!agent.IsChildAgent) 398 //this.CommsManager.InterRegion.InformRegionOfChildAgent(otherRegion.RegionHandle, agent.ControllingClient.RequestClientInfo());
386 { 399 InformClientOfNeighbor(agent, otherRegion);
387 //agent.ControllingClient.new
388 //this.CommsManager.InterRegion.InformRegionOfChildAgent(otherRegion.RegionHandle, agent.ControllingClient.RequestClientInfo());
389 InformClientOfNeighbor(agent, otherRegion);
390 }
391 } 400 }
401 }
392 ); 402 );
393 } 403 }
394 catch (NullReferenceException) 404 catch (NullReferenceException)
@@ -400,9 +410,9 @@ namespace OpenSim.Region.Environment.Scenes
400 } 410 }
401 else 411 else
402 { 412 {
403 m_log.Info("[INTERGRID]: Got notice about far away Region: " + otherRegion.RegionName + 413 m_log.Info("[INTERGRID]: Got notice about far away Region: " + otherRegion.RegionName.ToString() +
404 " at (" + otherRegion.RegionLocX + ", " + 414 " at (" + otherRegion.RegionLocX.ToString() + ", " +
405 otherRegion.RegionLocY + ")"); 415 otherRegion.RegionLocY.ToString() + ")");
406 } 416 }
407 } 417 }
408 return true; 418 return true;
@@ -426,10 +436,10 @@ namespace OpenSim.Region.Environment.Scenes
426 { 436 {
427 // Now we figure out what to set the timer to that does the notifications and calls, RestartNow() 437 // Now we figure out what to set the timer to that does the notifications and calls, RestartNow()
428 m_restartTimer.Interval = 15000; 438 m_restartTimer.Interval = 15000;
429 m_incrementsof15seconds = (int) seconds / 15; 439 m_incrementsof15seconds = (int)seconds / 15;
430 m_RestartTimerCounter = 0; 440 m_RestartTimerCounter = 0;
431 m_restartTimer.AutoReset = true; 441 m_restartTimer.AutoReset = true;
432 m_restartTimer.Elapsed += RestartTimer_Elapsed; 442 m_restartTimer.Elapsed += new ElapsedEventHandler(RestartTimer_Elapsed);
433 m_log.Error("[REGION]: Restarting Region in " + (seconds / 60) + " minutes"); 443 m_log.Error("[REGION]: Restarting Region in " + (seconds / 60) + " minutes");
434 m_restartTimer.Start(); 444 m_restartTimer.Start();
435 SendRegionMessageFromEstateTools(LLUUID.Random(), LLUUID.Random(), String.Empty, RegionInfo.RegionName + ": Restarting in 2 Minutes"); 445 SendRegionMessageFromEstateTools(LLUUID.Random(), LLUUID.Random(), String.Empty, RegionInfo.RegionName + ": Restarting in 2 Minutes");
@@ -448,7 +458,7 @@ namespace OpenSim.Region.Environment.Scenes
448 { 458 {
449 if (m_RestartTimerCounter == 4 || m_RestartTimerCounter == 6 || m_RestartTimerCounter == 7) 459 if (m_RestartTimerCounter == 4 || m_RestartTimerCounter == 6 || m_RestartTimerCounter == 7)
450 SendRegionMessageFromEstateTools(LLUUID.Random(), LLUUID.Random(), String.Empty, RegionInfo.RegionName + ": Restarting in " + 460 SendRegionMessageFromEstateTools(LLUUID.Random(), LLUUID.Random(), String.Empty, RegionInfo.RegionName + ": Restarting in " +
451 ((8 - m_RestartTimerCounter) * 15) + " seconds"); 461 ((8 - m_RestartTimerCounter) * 15) + " seconds");
452 462
453 // SendGeneralAlert(RegionInfo.RegionName + ": Restarting in " + ((8 - m_RestartTimerCounter)*15) + 463 // SendGeneralAlert(RegionInfo.RegionName + ": Restarting in " + ((8 - m_RestartTimerCounter)*15) +
454 //" seconds"); 464 //" seconds");
@@ -490,15 +500,15 @@ namespace OpenSim.Region.Environment.Scenes
490 try 500 try
491 { 501 {
492 ForEachScenePresence(delegate(ScenePresence agent) 502 ForEachScenePresence(delegate(ScenePresence agent)
503 {
504 // If agent is a root agent.
505 if (!agent.IsChildAgent)
493 { 506 {
494 // If agent is a root agent. 507 //agent.ControllingClient.new
495 if (!agent.IsChildAgent) 508 //this.CommsManager.InterRegion.InformRegionOfChildAgent(otherRegion.RegionHandle, agent.ControllingClient.RequestClientInfo());
496 { 509 InformClientOfNeighbor(agent, region);
497 //agent.ControllingClient.new
498 //this.CommsManager.InterRegion.InformRegionOfChildAgent(otherRegion.RegionHandle, agent.ControllingClient.RequestClientInfo());
499 InformClientOfNeighbor(agent, region);
500 }
501 } 510 }
511 }
502 ); 512 );
503 } 513 }
504 catch (NullReferenceException) 514 catch (NullReferenceException)
@@ -527,7 +537,7 @@ namespace OpenSim.Region.Environment.Scenes
527 { 537 {
528 if (ent is SceneObjectGroup) 538 if (ent is SceneObjectGroup)
529 { 539 {
530 ((SceneObjectGroup) ent).StopScripts(); 540 ((SceneObjectGroup)ent).StopScripts();
531 } 541 }
532 } 542 }
533 } 543 }
@@ -541,10 +551,12 @@ namespace OpenSim.Region.Environment.Scenes
541 { 551 {
542 if (ent is SceneObjectGroup) 552 if (ent is SceneObjectGroup)
543 { 553 {
544 ((SceneObjectGroup) ent).StartScripts(); 554 ((SceneObjectGroup)ent).StartScripts();
545 } 555 }
546 } 556 }
547 } 557 }
558
559
548 } 560 }
549 m_scripts_enabled = !ScriptEngine; 561 m_scripts_enabled = !ScriptEngine;
550 m_log.Info("[TOTEDD]: Here is the method to trigger disabling of the scripting engine"); 562 m_log.Info("[TOTEDD]: Here is the method to trigger disabling of the scripting engine");
@@ -552,7 +564,9 @@ namespace OpenSim.Region.Environment.Scenes
552 if (m_physics_enabled != !PhysicsEngine) 564 if (m_physics_enabled != !PhysicsEngine)
553 { 565 {
554 m_physics_enabled = !PhysicsEngine; 566 m_physics_enabled = !PhysicsEngine;
567
555 } 568 }
569
556 } 570 }
557 571
558 // This is the method that shuts down the scene. 572 // This is the method that shuts down the scene.
@@ -561,16 +575,16 @@ namespace OpenSim.Region.Environment.Scenes
561 m_log.Warn("[SCENE]: Closing down the single simulator: " + RegionInfo.RegionName); 575 m_log.Warn("[SCENE]: Closing down the single simulator: " + RegionInfo.RegionName);
562 // Kick all ROOT agents with the message, 'The simulator is going down' 576 // Kick all ROOT agents with the message, 'The simulator is going down'
563 ForEachScenePresence(delegate(ScenePresence avatar) 577 ForEachScenePresence(delegate(ScenePresence avatar)
564 { 578 {
565 if (avatar.KnownChildRegions.Contains(RegionInfo.RegionHandle)) 579 if (avatar.KnownChildRegions.Contains(RegionInfo.RegionHandle))
566 avatar.KnownChildRegions.Remove(RegionInfo.RegionHandle); 580 avatar.KnownChildRegions.Remove(RegionInfo.RegionHandle);
567 581
568 if (!avatar.IsChildAgent) 582 if (!avatar.IsChildAgent)
569 avatar.ControllingClient.Kick("The simulator is going down."); 583 avatar.ControllingClient.Kick("The simulator is going down.");
570 584
571 avatar.ControllingClient.OutPacket(PacketPool.Instance.GetPacket(PacketType.DisableSimulator), 585 avatar.ControllingClient.OutPacket(PacketPool.Instance.GetPacket(PacketType.DisableSimulator),
572 ThrottleOutPacketType.Task); 586 ThrottleOutPacketType.Task);
573 }); 587 });
574 588
575 // Wait here, or the kick messages won't actually get to the agents before the scene terminates. 589 // Wait here, or the kick messages won't actually get to the agents before the scene terminates.
576 Thread.Sleep(500); 590 Thread.Sleep(500);
@@ -605,8 +619,8 @@ namespace OpenSim.Region.Environment.Scenes
605 { 619 {
606 m_log.Debug("[SCENE]: Starting timer"); 620 m_log.Debug("[SCENE]: Starting timer");
607 m_heartbeatTimer.Enabled = true; 621 m_heartbeatTimer.Enabled = true;
608 m_heartbeatTimer.Interval = (int) (m_timespan * 1000); 622 m_heartbeatTimer.Interval = (int)(m_timespan * 1000);
609 m_heartbeatTimer.Elapsed += Heartbeat; 623 m_heartbeatTimer.Elapsed += new ElapsedEventHandler(Heartbeat);
610 } 624 }
611 625
612 public void SetModuleInterfaces() 626 public void SetModuleInterfaces()
@@ -708,13 +722,13 @@ namespace OpenSim.Region.Environment.Scenes
708 { 722 {
709 if (m_frame % m_update_events == 0) 723 if (m_frame % m_update_events == 0)
710 UpdateEvents(); 724 UpdateEvents();
711 725
712 if (m_frame % m_update_backup == 0) 726 if (m_frame % m_update_backup == 0)
713 UpdateStorageBackup(); 727 UpdateStorageBackup();
714 728
715 if (m_frame % m_update_terrain == 0) 729 if (m_frame % m_update_terrain == 0)
716 UpdateTerrain(); 730 UpdateTerrain();
717 731
718 if (m_frame % m_update_land == 0) 732 if (m_frame % m_update_land == 0)
719 UpdateLand(); 733 UpdateLand();
720 otherMS = System.Environment.TickCount - otherMS; 734 otherMS = System.Environment.TickCount - otherMS;
@@ -742,25 +756,28 @@ namespace OpenSim.Region.Environment.Scenes
742 } 756 }
743 catch (AccessViolationException e) 757 catch (AccessViolationException e)
744 { 758 {
745 m_log.Error("[Scene]: Failed with exception " + e + " On Region: " + RegionInfo.RegionName); 759 m_log.Error("[Scene]: Failed with exception " + e.ToString() + " On Region: " + RegionInfo.RegionName);
760
746 } 761 }
747 catch (NullReferenceException e) 762 catch (NullReferenceException e)
748 { 763 {
749 m_log.Error("[Scene]: Failed with exception " + e + " On Region: " + RegionInfo.RegionName); 764 m_log.Error("[Scene]: Failed with exception " + e.ToString() + " On Region: " + RegionInfo.RegionName);
765
750 } 766 }
751 catch (InvalidOperationException e) 767 catch (InvalidOperationException e)
752 { 768 {
753 m_log.Error("[Scene]: Failed with exception " + e + " On Region: " + RegionInfo.RegionName); 769 m_log.Error("[Scene]: Failed with exception " + e.ToString() + " On Region: " + RegionInfo.RegionName);
770
754 } 771 }
755 catch (Exception e) 772 catch (Exception e)
756 { 773 {
757 m_log.Error("[Scene]: Failed with exception " + e + " On Region: " + RegionInfo.RegionName); 774 m_log.Error("[Scene]: Failed with exception " + e.ToString() + " On Region: " + RegionInfo.RegionName);
758 } 775 }
759 finally 776 finally
760 { 777 {
761 updateLock.ReleaseMutex(); 778 updateLock.ReleaseMutex();
762 // Get actual time dilation 779 // Get actual time dilation
763 float tmpval = (m_timespan / (float) SinceLastFrame.TotalSeconds); 780 float tmpval = (m_timespan / (float)SinceLastFrame.TotalSeconds);
764 781
765 // If actual time dilation is greater then one, we're catching up, so subtract 782 // If actual time dilation is greater then one, we're catching up, so subtract
766 // the amount that's greater then 1 from the time dilation 783 // the amount that's greater then 1 from the time dilation
@@ -769,7 +786,7 @@ namespace OpenSim.Region.Environment.Scenes
769 tmpval = tmpval - (tmpval - 1.0f); 786 tmpval = tmpval - (tmpval - 1.0f);
770 } 787 }
771 m_timedilation = tmpval; 788 m_timedilation = tmpval;
772 789
773 m_lastupdate = DateTime.Now; 790 m_lastupdate = DateTime.Now;
774 } 791 }
775 } 792 }
@@ -839,10 +856,10 @@ namespace OpenSim.Region.Environment.Scenes
839 public void ExportWorldMap(string fileName) 856 public void ExportWorldMap(string fileName)
840 { 857 {
841 List<MapBlockData> mapBlocks = 858 List<MapBlockData> mapBlocks =
842 m_sceneGridService.RequestNeighbourMapBlocks((int) (RegionInfo.RegionLocX - 9), 859 m_sceneGridService.RequestNeighbourMapBlocks((int)(RegionInfo.RegionLocX - 9),
843 (int) (RegionInfo.RegionLocY - 9), 860 (int)(RegionInfo.RegionLocY - 9),
844 (int) (RegionInfo.RegionLocX + 9), 861 (int)(RegionInfo.RegionLocX + 9),
845 (int) (RegionInfo.RegionLocY + 9)); 862 (int)(RegionInfo.RegionLocY + 9));
846 List<AssetBase> textures = new List<AssetBase>(); 863 List<AssetBase> textures = new List<AssetBase>();
847 List<Image> bitImages = new List<Image>(); 864 List<Image> bitImages = new List<Image>();
848 865
@@ -877,8 +894,8 @@ namespace OpenSim.Region.Environment.Scenes
877 894
878 for (int i = 0; i < mapBlocks.Count; i++) 895 for (int i = 0; i < mapBlocks.Count; i++)
879 { 896 {
880 ushort x = (ushort) ((mapBlocks[i].X - RegionInfo.RegionLocX) + 10); 897 ushort x = (ushort)((mapBlocks[i].X - RegionInfo.RegionLocX) + 10);
881 ushort y = (ushort) ((mapBlocks[i].Y - RegionInfo.RegionLocY) + 10); 898 ushort y = (ushort)((mapBlocks[i].Y - RegionInfo.RegionLocY) + 10);
882 g.DrawImage(bitImages[i], (x * 128), (y * 128), 128, 128); 899 g.DrawImage(bitImages[i], (x * 128), (y * 128), 128, 128);
883 } 900 }
884 mapTexture.Save(fileName, ImageFormat.Jpeg); 901 mapTexture.Save(fileName, ImageFormat.Jpeg);
@@ -909,10 +926,11 @@ namespace OpenSim.Region.Environment.Scenes
909 { 926 {
910 Heightmap = new TerrainChannel(map); 927 Heightmap = new TerrainChannel(map);
911 } 928 }
929
912 } 930 }
913 catch (Exception e) 931 catch (Exception e)
914 { 932 {
915 m_log.Warn("[terrain]: Scene.cs: LoadWorldMap() - Failed with exception " + e); 933 m_log.Warn("[terrain]: Scene.cs: LoadWorldMap() - Failed with exception " + e.ToString());
916 } 934 }
917 } 935 }
918 936
@@ -973,7 +991,7 @@ namespace OpenSim.Region.Environment.Scenes
973 { 991 {
974 for (int y = 0; y < 256; y++) 992 for (int y = 0; y < 256; y++)
975 { 993 {
976 float hmval = (float) hm[x, y]; 994 float hmval = (float)hm[x, y];
977 if (hmval < low) 995 if (hmval < low)
978 low = hmval; 996 low = hmval;
979 if (hmval > high) 997 if (hmval > high)
@@ -1003,10 +1021,10 @@ namespace OpenSim.Region.Environment.Scenes
1003 //} 1021 //}
1004 //else 1022 //else
1005 //{ 1023 //{
1006 float tmpval = (float) hm[x, y]; 1024 float tmpval = (float)hm[x, y];
1007 heightvalue = (float) hm[x, y]; 1025 heightvalue = (float)hm[x, y];
1008 1026
1009 if (heightvalue > m_regInfo.EstateSettings.waterHeight) 1027 if ((float)heightvalue > m_regInfo.EstateSettings.waterHeight)
1010 { 1028 {
1011 // scale height value 1029 // scale height value
1012 heightvalue = low + mid * (heightvalue - low) / mid; 1030 heightvalue = low + mid * (heightvalue - low) / mid;
@@ -1018,7 +1036,7 @@ namespace OpenSim.Region.Environment.Scenes
1018 heightvalue = 0; 1036 heightvalue = 0;
1019 1037
1020 1038
1021 Color green = Color.FromArgb((int) heightvalue, 100, (int) heightvalue); 1039 Color green = Color.FromArgb((int)heightvalue, 100, (int)heightvalue);
1022 1040
1023 // Y flip the cordinates 1041 // Y flip the cordinates
1024 mapbmp.SetPixel(x, (256 - y) - 1, green); 1042 mapbmp.SetPixel(x, (256 - y) - 1, green);
@@ -1040,10 +1058,12 @@ namespace OpenSim.Region.Environment.Scenes
1040 if (heightvalue < 0) 1058 if (heightvalue < 0)
1041 heightvalue = 0; 1059 heightvalue = 0;
1042 1060
1043 Color water = Color.FromArgb((int) heightvalue, (int) heightvalue, 255); 1061 Color water = Color.FromArgb((int)heightvalue, (int)heightvalue, 255);
1044 mapbmp.SetPixel(x, (256 - y) - 1, water); 1062 mapbmp.SetPixel(x, (256 - y) - 1, water);
1045 } 1063 }
1046 //} 1064 //}
1065
1066
1047 } 1067 }
1048 //tc = System.Environment.TickCount - tc; 1068 //tc = System.Environment.TickCount - tc;
1049 //m_log.Info("[MAPTILE]: Completed One row in " + tc + " ms"); 1069 //m_log.Info("[MAPTILE]: Completed One row in " + tc + " ms");
@@ -1067,6 +1087,7 @@ namespace OpenSim.Region.Environment.Scenes
1067 asset.Type = 0; 1087 asset.Type = 0;
1068 asset.Temporary = temporary; 1088 asset.Temporary = temporary;
1069 AssetCache.AddAsset(asset); 1089 AssetCache.AddAsset(asset);
1090
1070 } 1091 }
1071 else 1092 else
1072 { 1093 {
@@ -1084,6 +1105,7 @@ namespace OpenSim.Region.Environment.Scenes
1084 AssetCache.AddAsset(asset); 1105 AssetCache.AddAsset(asset);
1085 } 1106 }
1086 } 1107 }
1108
1087 } 1109 }
1088 1110
1089 #endregion 1111 #endregion
@@ -1121,14 +1143,14 @@ namespace OpenSim.Region.Environment.Scenes
1121 { 1143 {
1122 AddEntityFromStorage(group); 1144 AddEntityFromStorage(group);
1123 SceneObjectPart rootPart = group.GetChildPart(group.UUID); 1145 SceneObjectPart rootPart = group.GetChildPart(group.UUID);
1124 rootPart.ObjectFlags &= ~(uint) LLObject.ObjectFlags.Scripted; 1146 rootPart.ObjectFlags &= ~(uint)LLObject.ObjectFlags.Scripted;
1125 rootPart.TrimPermissions(); 1147 rootPart.TrimPermissions();
1126 1148
1127 group.ApplyPhysics(m_physicalPrim); 1149 group.ApplyPhysics(m_physicalPrim);
1128 //rootPart.DoPhysicsPropertyUpdate(UsePhysics, true); 1150 //rootPart.DoPhysicsPropertyUpdate(UsePhysics, true);
1129 } 1151 }
1130 1152
1131 m_log.Info("[SCENE]: Loaded " + PrimsFromDB.Count + " SceneObject(s)"); 1153 m_log.Info("[SCENE]: Loaded " + PrimsFromDB.Count.ToString() + " SceneObject(s)");
1132 } 1154 }
1133 1155
1134 /// <summary> 1156 /// <summary>
@@ -1147,11 +1169,10 @@ namespace OpenSim.Region.Environment.Scenes
1147 return myID; 1169 return myID;
1148 } 1170 }
1149 1171
1150 public LLVector3 GetNewRezLocation(LLVector3 RayStart, LLVector3 RayEnd, LLUUID RayTargetID, LLQuaternion rot, byte bypassRayCast, 1172 public LLVector3 GetNewRezLocation(LLVector3 RayStart, LLVector3 RayEnd, LLUUID RayTargetID, LLQuaternion rot, byte bypassRayCast, byte RayEndIsIntersection, bool frontFacesOnly, LLVector3 scale, bool FaceCenter)
1151 byte RayEndIsIntersection, bool frontFacesOnly, LLVector3 scale, bool FaceCenter)
1152 { 1173 {
1153 LLVector3 pos = LLVector3.Zero; 1174 LLVector3 pos = LLVector3.Zero;
1154 if (RayEndIsIntersection == 1) 1175 if (RayEndIsIntersection == (byte)1)
1155 { 1176 {
1156 pos = RayEnd; 1177 pos = RayEnd;
1157 return pos; 1178 return pos;
@@ -1159,7 +1180,7 @@ namespace OpenSim.Region.Environment.Scenes
1159 if (RayTargetID != LLUUID.Zero) 1180 if (RayTargetID != LLUUID.Zero)
1160 { 1181 {
1161 SceneObjectPart target = GetSceneObjectPart(RayTargetID); 1182 SceneObjectPart target = GetSceneObjectPart(RayTargetID);
1162 1183
1163 LLVector3 direction = LLVector3.Norm(RayEnd - RayStart); 1184 LLVector3 direction = LLVector3.Norm(RayEnd - RayStart);
1164 Vector3 AXOrigin = new Vector3(RayStart.X, RayStart.Y, RayStart.Z); 1185 Vector3 AXOrigin = new Vector3(RayStart.X, RayStart.Y, RayStart.Z);
1165 Vector3 AXdirection = new Vector3(direction.X, direction.Y, direction.Z); 1186 Vector3 AXdirection = new Vector3(direction.X, direction.Y, direction.Z);
@@ -1168,17 +1189,17 @@ namespace OpenSim.Region.Environment.Scenes
1168 { 1189 {
1169 pos = target.AbsolutePosition; 1190 pos = target.AbsolutePosition;
1170 //m_log.Info("[OBJECT_REZ]: TargetPos: " + pos.ToString() + ", RayStart: " + RayStart.ToString() + ", RayEnd: " + RayEnd.ToString() + ", Volume: " + Util.GetDistanceTo(RayStart,RayEnd).ToString() + ", mag1: " + Util.GetMagnitude(RayStart).ToString() + ", mag2: " + Util.GetMagnitude(RayEnd).ToString()); 1191 //m_log.Info("[OBJECT_REZ]: TargetPos: " + pos.ToString() + ", RayStart: " + RayStart.ToString() + ", RayEnd: " + RayEnd.ToString() + ", Volume: " + Util.GetDistanceTo(RayStart,RayEnd).ToString() + ", mag1: " + Util.GetMagnitude(RayStart).ToString() + ", mag2: " + Util.GetMagnitude(RayEnd).ToString());
1171 1192
1172 // TODO: Raytrace better here 1193 // TODO: Raytrace better here
1173 1194
1174 //EntityIntersection ei = m_innerScene.GetClosestIntersectingPrim(new Ray(AXOrigin, AXdirection)); 1195 //EntityIntersection ei = m_innerScene.GetClosestIntersectingPrim(new Ray(AXOrigin, AXdirection));
1175 Ray NewRay = new Ray(AXOrigin, AXdirection); 1196 Ray NewRay = new Ray(AXOrigin, AXdirection);
1176 1197
1177 // Ray Trace against target here 1198 // Ray Trace against target here
1178 EntityIntersection ei = target.TestIntersectionOBB(NewRay, new Quaternion(1, 0, 0, 0), frontFacesOnly, FaceCenter); 1199 EntityIntersection ei = target.TestIntersectionOBB(NewRay, new Quaternion(1,0,0,0), frontFacesOnly, FaceCenter);
1179 1200
1180 // Un-comment out the following line to Get Raytrace results printed to the console. 1201 // Un-comment out the following line to Get Raytrace results printed to the console.
1181 // m_log.Info("[RAYTRACERESULTS]: Hit:" + ei.HitTF.ToString() + " Point: " + ei.ipoint.ToString() + " Normal: " + ei.normal.ToString()); 1202 // m_log.Info("[RAYTRACERESULTS]: Hit:" + ei.HitTF.ToString() + " Point: " + ei.ipoint.ToString() + " Normal: " + ei.normal.ToString());
1182 float ScaleOffset = 0.5f; 1203 float ScaleOffset = 0.5f;
1183 1204
1184 // If we hit something 1205 // If we hit something
@@ -1194,12 +1215,13 @@ namespace OpenSim.Region.Environment.Scenes
1194 // Set the position to the intersection point 1215 // Set the position to the intersection point
1195 LLVector3 offset = (normal * (ScaleOffset / 2f)); 1216 LLVector3 offset = (normal * (ScaleOffset / 2f));
1196 pos = (intersectionpoint + offset); 1217 pos = (intersectionpoint + offset);
1197 1218
1198 // Un-offset the prim (it gets offset later by the consumer method) 1219 // Un-offset the prim (it gets offset later by the consumer method)
1199 pos.Z -= 0.25F; 1220 pos.Z -= 0.25F;
1200 } 1221
1201 1222 }
1202 1223
1224
1203 return pos; 1225 return pos;
1204 } 1226 }
1205 else 1227 else
@@ -1214,8 +1236,8 @@ namespace OpenSim.Region.Environment.Scenes
1214 if (ei.HitTF) 1236 if (ei.HitTF)
1215 { 1237 {
1216 pos = new LLVector3(ei.ipoint.x, ei.ipoint.y, ei.ipoint.z); 1238 pos = new LLVector3(ei.ipoint.x, ei.ipoint.y, ei.ipoint.z);
1217 } 1239 }
1218 1240
1219 return pos; 1241 return pos;
1220 } 1242 }
1221 } 1243 }
@@ -1231,8 +1253,8 @@ namespace OpenSim.Region.Environment.Scenes
1231 byte bypassRaycast, LLVector3 RayStart, LLUUID RayTargetID, 1253 byte bypassRaycast, LLVector3 RayStart, LLUUID RayTargetID,
1232 byte RayEndIsIntersection) 1254 byte RayEndIsIntersection)
1233 { 1255 {
1234 LLVector3 pos = GetNewRezLocation(RayStart, RayEnd, RayTargetID, rot, bypassRaycast, RayEndIsIntersection, true, new LLVector3(0.5f, 0.5f, 0.5f), 1256
1235 false); 1257 LLVector3 pos = GetNewRezLocation(RayStart, RayEnd, RayTargetID, rot, bypassRaycast, RayEndIsIntersection, true, new LLVector3(0.5f,0.5f,0.5f), false);
1236 1258
1237 if (PermissionsMngr.CanRezObject(ownerID, pos)) 1259 if (PermissionsMngr.CanRezObject(ownerID, pos))
1238 { 1260 {
@@ -1252,7 +1274,7 @@ namespace OpenSim.Region.Environment.Scenes
1252 SceneObjectPart rootPart = sceneOb.GetChildPart(sceneOb.UUID); 1274 SceneObjectPart rootPart = sceneOb.GetChildPart(sceneOb.UUID);
1253 // if grass or tree, make phantom 1275 // if grass or tree, make phantom
1254 //rootPart.TrimPermissions(); 1276 //rootPart.TrimPermissions();
1255 if ((rootPart.Shape.PCode == (byte) PCode.Grass) || (rootPart.Shape.PCode == (byte) PCode.Tree) || (rootPart.Shape.PCode == (byte) PCode.NewTree)) 1277 if ((rootPart.Shape.PCode == (byte)PCode.Grass) || (rootPart.Shape.PCode == (byte)PCode.Tree) || (rootPart.Shape.PCode == (byte)PCode.NewTree))
1256 { 1278 {
1257 rootPart.AddFlag(LLObject.ObjectFlags.Phantom); 1279 rootPart.AddFlag(LLObject.ObjectFlags.Phantom);
1258 //rootPart.ObjectFlags += (uint)LLObject.ObjectFlags.Phantom; 1280 //rootPart.ObjectFlags += (uint)LLObject.ObjectFlags.Phantom;
@@ -1267,13 +1289,13 @@ namespace OpenSim.Region.Environment.Scenes
1267 public SceneObjectGroup AddTree(LLVector3 scale, LLQuaternion rotation, LLVector3 position, 1289 public SceneObjectGroup AddTree(LLVector3 scale, LLQuaternion rotation, LLVector3 position,
1268 Tree treeType, bool newTree) 1290 Tree treeType, bool newTree)
1269 { 1291 {
1270 LLUUID uuid = RegionInfo.MasterAvatarAssignedUUID; 1292 LLUUID uuid = this.RegionInfo.MasterAvatarAssignedUUID;
1271 PrimitiveBaseShape treeShape = new PrimitiveBaseShape(); 1293 PrimitiveBaseShape treeShape = new PrimitiveBaseShape();
1272 treeShape.PathCurve = 16; 1294 treeShape.PathCurve = 16;
1273 treeShape.PathEnd = 49900; 1295 treeShape.PathEnd = 49900;
1274 treeShape.PCode = newTree ? (byte) PCode.NewTree : (byte) PCode.Tree; 1296 treeShape.PCode = newTree ? (byte)PCode.NewTree : (byte)PCode.Tree;
1275 treeShape.Scale = scale; 1297 treeShape.Scale = scale;
1276 treeShape.State = (byte) treeType; 1298 treeShape.State = (byte)treeType;
1277 return AddNewPrim(uuid, position, rotation, treeShape); 1299 return AddNewPrim(uuid, position, rotation, treeShape);
1278 } 1300 }
1279 1301
@@ -1338,11 +1360,12 @@ namespace OpenSim.Region.Environment.Scenes
1338 /// </summary> 1360 /// </summary>
1339 /// <param name="position">current position of Group</param> 1361 /// <param name="position">current position of Group</param>
1340 /// <param name="grp">Scene Object Group that we're crossing</param> 1362 /// <param name="grp">Scene Object Group that we're crossing</param>
1363
1341 public void CrossPrimGroupIntoNewRegion(LLVector3 position, SceneObjectGroup grp) 1364 public void CrossPrimGroupIntoNewRegion(LLVector3 position, SceneObjectGroup grp)
1342 { 1365 {
1343 m_log.Warn("Prim crossing: " + grp.UUID); 1366 m_log.Warn("Prim crossing: " + grp.UUID.ToString());
1344 int thisx = (int) RegionInfo.RegionLocX; 1367 int thisx = (int)RegionInfo.RegionLocX;
1345 int thisy = (int) RegionInfo.RegionLocY; 1368 int thisy = (int)RegionInfo.RegionLocY;
1346 1369
1347 ulong newRegionHandle = 0; 1370 ulong newRegionHandle = 0;
1348 LLVector3 pos = position; 1371 LLVector3 pos = position;
@@ -1351,44 +1374,43 @@ namespace OpenSim.Region.Environment.Scenes
1351 { 1374 {
1352 pos.X = ((pos.X - Constants.RegionSize)); 1375 pos.X = ((pos.X - Constants.RegionSize));
1353 1376
1354 newRegionHandle = Util.UIntsToLong((uint) ((thisx + 1) * Constants.RegionSize), (uint) (thisy * Constants.RegionSize)); 1377 newRegionHandle = Util.UIntsToLong((uint)((thisx + 1) * Constants.RegionSize), (uint)(thisy * Constants.RegionSize));
1355 1378
1356 // x + 1 1379 // x + 1
1357 } 1380 }
1358 else if (position.X < -0.1f) 1381 else if (position.X < -0.1f)
1359 { 1382 {
1360 pos.X = ((pos.X + Constants.RegionSize)); 1383 pos.X = ((pos.X + Constants.RegionSize));
1361 newRegionHandle = Util.UIntsToLong((uint) ((thisx - 1) * Constants.RegionSize), (uint) (thisy * Constants.RegionSize)); 1384 newRegionHandle = Util.UIntsToLong((uint)((thisx - 1) * Constants.RegionSize), (uint)(thisy * Constants.RegionSize));
1362 // x - 1 1385 // x - 1
1363 } 1386 }
1364 1387
1365 if (position.Y > Constants.RegionSize + 0.1f) 1388 if (position.Y > Constants.RegionSize + 0.1f)
1366 { 1389 {
1367 pos.Y = ((pos.Y - Constants.RegionSize)); 1390 pos.Y = ((pos.Y - Constants.RegionSize));
1368 newRegionHandle = Util.UIntsToLong((uint) (thisx * Constants.RegionSize), (uint) ((thisy + 1) * Constants.RegionSize)); 1391 newRegionHandle = Util.UIntsToLong((uint)(thisx * Constants.RegionSize), (uint)((thisy + 1) * Constants.RegionSize));
1369 // y + 1 1392 // y + 1
1370 } 1393 }
1371 else if (position.Y < -1f) 1394 else if (position.Y < -1f)
1372 { 1395 {
1373 pos.Y = ((pos.Y + Constants.RegionSize)); 1396 pos.Y = ((pos.Y + Constants.RegionSize));
1374 newRegionHandle = Util.UIntsToLong((uint) (thisx * Constants.RegionSize), (uint) ((thisy - 1) * Constants.RegionSize)); 1397 newRegionHandle = Util.UIntsToLong((uint)(thisx * Constants.RegionSize), (uint)((thisy - 1) * Constants.RegionSize));
1375 // y - 1 1398 // y - 1
1376 } 1399 }
1377 1400
1378 // Offset the positions for the new region across the border 1401 // Offset the positions for the new region across the border
1379 grp.OffsetForNewRegion(pos); 1402 grp.OffsetForNewRegion(pos);
1380 1403
1381 CrossPrimGroupIntoNewRegion(newRegionHandle, grp); 1404 CrossPrimGroupIntoNewRegion(newRegionHandle, grp);
1382 }
1383 1405
1406 }
1384 public void CrossPrimGroupIntoNewRegion(ulong newRegionHandle, SceneObjectGroup grp) 1407 public void CrossPrimGroupIntoNewRegion(ulong newRegionHandle, SceneObjectGroup grp)
1385 { 1408 {
1386 int primcrossingXMLmethod = 0; 1409 int primcrossingXMLmethod = 0;
1387 if (newRegionHandle != 0) 1410 if (newRegionHandle != 0)
1388 { 1411 {
1389 bool successYN = false; 1412 bool successYN = false;
1390 successYN = m_sceneGridService.PrimCrossToNeighboringRegion(newRegionHandle, grp.UUID, m_sceneXmlLoader.SavePrimGroupToXML2String(grp), 1413 successYN = m_sceneGridService.PrimCrossToNeighboringRegion(newRegionHandle, grp.UUID, m_sceneXmlLoader.SavePrimGroupToXML2String(grp), primcrossingXMLmethod);
1391 primcrossingXMLmethod);
1392 if (successYN) 1414 if (successYN)
1393 { 1415 {
1394 // We remove the object here 1416 // We remove the object here
@@ -1424,7 +1446,7 @@ namespace OpenSim.Region.Environment.Scenes
1424 SceneObjectPart RootPrim = GetSceneObjectPart(primID); 1446 SceneObjectPart RootPrim = GetSceneObjectPart(primID);
1425 if (RootPrim != null) 1447 if (RootPrim != null)
1426 { 1448 {
1427 if (RootPrim.Shape.PCode == (byte) PCode.Prim) 1449 if (RootPrim.Shape.PCode == (byte)PCode.Prim)
1428 { 1450 {
1429 SceneObjectGroup grp = RootPrim.ParentGroup; 1451 SceneObjectGroup grp = RootPrim.ParentGroup;
1430 if (grp != null) 1452 if (grp != null)
@@ -1440,10 +1462,12 @@ namespace OpenSim.Region.Environment.Scenes
1440 // with the deeded object, it goes back to them 1462 // with the deeded object, it goes back to them
1441 1463
1442 grp.SetFromAssetID(grp.RootPart.LastOwnerID); 1464 grp.SetFromAssetID(grp.RootPart.LastOwnerID);
1443 m_innerScene.AttachObject(sp.ControllingClient, grp.LocalId, 0, grp.GroupRotation, grp.AbsolutePosition); 1465 m_innerScene.AttachObject(sp.ControllingClient, grp.LocalId, (uint)0, grp.GroupRotation, grp.AbsolutePosition);
1444 } 1466 }
1445 } 1467 }
1446 } 1468 }
1469
1470
1447 } 1471 }
1448 } 1472 }
1449 return true; 1473 return true;
@@ -1452,6 +1476,7 @@ namespace OpenSim.Region.Environment.Scenes
1452 { 1476 {
1453 return false; 1477 return false;
1454 } 1478 }
1479
1455 } 1480 }
1456 1481
1457 #endregion 1482 #endregion
@@ -1466,9 +1491,9 @@ namespace OpenSim.Region.Environment.Scenes
1466 public override void AddNewClient(IClientAPI client, bool child) 1491 public override void AddNewClient(IClientAPI client, bool child)
1467 { 1492 {
1468 m_log.DebugFormat( 1493 m_log.DebugFormat(
1469 "[CONNECTION DEBUGGING]: Creating new client for {0} at {1}", 1494 "[CONNECTION DEBUGGING]: Creating new client for {0} at {1}",
1470 client.AgentId, RegionInfo.RegionName); 1495 client.AgentId, RegionInfo.RegionName);
1471 1496
1472 SubscribeToClientEvents(client); 1497 SubscribeToClientEvents(client);
1473 ScenePresence presence = null; 1498 ScenePresence presence = null;
1474 1499
@@ -1538,19 +1563,19 @@ namespace OpenSim.Region.Environment.Scenes
1538 client.OnObjectDuplicateOnRay += doObjectDuplicateOnRay; 1563 client.OnObjectDuplicateOnRay += doObjectDuplicateOnRay;
1539 client.OnUpdatePrimFlags += m_innerScene.UpdatePrimFlags; 1564 client.OnUpdatePrimFlags += m_innerScene.UpdatePrimFlags;
1540 client.OnRequestObjectPropertiesFamily += m_innerScene.RequestObjectPropertiesFamily; 1565 client.OnRequestObjectPropertiesFamily += m_innerScene.RequestObjectPropertiesFamily;
1541 client.OnParcelPropertiesRequest += LandChannel.handleParcelPropertiesRequest; 1566 client.OnParcelPropertiesRequest += new ParcelPropertiesRequest(LandChannel.handleParcelPropertiesRequest);
1542 client.OnParcelDivideRequest += LandChannel.handleParcelDivideRequest; 1567 client.OnParcelDivideRequest += new ParcelDivideRequest(LandChannel.handleParcelDivideRequest);
1543 client.OnParcelJoinRequest += LandChannel.handleParcelJoinRequest; 1568 client.OnParcelJoinRequest += new ParcelJoinRequest(LandChannel.handleParcelJoinRequest);
1544 client.OnParcelPropertiesUpdateRequest += 1569 client.OnParcelPropertiesUpdateRequest +=
1545 LandChannel.handleParcelPropertiesUpdateRequest; 1570 new ParcelPropertiesUpdateRequest(LandChannel.handleParcelPropertiesUpdateRequest);
1546 client.OnParcelSelectObjects += LandChannel.handleParcelSelectObjectsRequest; 1571 client.OnParcelSelectObjects += new ParcelSelectObjects(LandChannel.handleParcelSelectObjectsRequest);
1547 client.OnParcelObjectOwnerRequest += 1572 client.OnParcelObjectOwnerRequest +=
1548 LandChannel.handleParcelObjectOwnersRequest; 1573 new ParcelObjectOwnerRequest(LandChannel.handleParcelObjectOwnersRequest);
1549 client.OnParcelAccessListRequest += LandChannel.handleParcelAccessRequest; 1574 client.OnParcelAccessListRequest += new ParcelAccessListRequest(LandChannel.handleParcelAccessRequest);
1550 client.OnParcelAccessListUpdateRequest += 1575 client.OnParcelAccessListUpdateRequest +=
1551 LandChannel.handleParcelAccessUpdateRequest; 1576 new ParcelAccessListUpdateRequest(LandChannel.handleParcelAccessUpdateRequest);
1552 1577
1553 client.OnEstateOwnerMessage += m_estateManager.handleEstateOwnerMessage; 1578 client.OnEstateOwnerMessage += new EstateOwnerMessageRequest(m_estateManager.handleEstateOwnerMessage);
1554 client.OnRegionInfoRequest += m_estateManager.HandleRegionInfoRequest; 1579 client.OnRegionInfoRequest += m_estateManager.HandleRegionInfoRequest;
1555 client.OnEstateCovenantRequest += m_estateManager.HandleEstateCovenantRequest; 1580 client.OnEstateCovenantRequest += m_estateManager.HandleEstateCovenantRequest;
1556 client.OnRequestGodlikePowers += handleRequestGodlikePowers; 1581 client.OnRequestGodlikePowers += handleRequestGodlikePowers;
@@ -1591,38 +1616,41 @@ namespace OpenSim.Region.Environment.Scenes
1591 1616
1592 client.OnSetStartLocationRequest += SetHomeRezPoint; 1617 client.OnSetStartLocationRequest += SetHomeRezPoint;
1593 client.OnUndo += m_innerScene.HandleUndo; 1618 client.OnUndo += m_innerScene.HandleUndo;
1594 1619
1595 EventManager.TriggerOnNewClient(client); 1620 EventManager.TriggerOnNewClient(client);
1596 } 1621 }
1597
1598 public virtual void TeleportClientHome(LLUUID AgentId, IClientAPI client) 1622 public virtual void TeleportClientHome(LLUUID AgentId, IClientAPI client)
1599 { 1623 {
1600 UserProfileData UserProfile = CommsManager.UserService.GetUserProfile(AgentId); 1624 UserProfileData UserProfile = CommsManager.UserService.GetUserProfile(AgentId);
1601 if (UserProfile != null) 1625 if (UserProfile != null)
1602 { 1626 {
1603 ulong homeRegion = UserProfile.HomeRegion; 1627 ulong homeRegion = UserProfile.HomeRegion;
1604 LLVector3 homePostion = new LLVector3(UserProfile.HomeLocationX, UserProfile.HomeLocationY, UserProfile.HomeLocationZ); 1628 LLVector3 homePostion = new LLVector3(UserProfile.HomeLocationX,UserProfile.HomeLocationY,UserProfile.HomeLocationZ);
1605 LLVector3 homeLookat = new LLVector3(UserProfile.HomeLookAt); 1629 LLVector3 homeLookat = new LLVector3(UserProfile.HomeLookAt);
1606 RequestTeleportLocation(client, homeRegion, homePostion, homeLookat, 0); 1630 RequestTeleportLocation(client, homeRegion, homePostion,homeLookat,(uint)0);
1631
1607 } 1632 }
1608 }
1609 1633
1634
1635 }
1610 public void doObjectDuplicateOnRay(uint localID, uint dupeFlags, LLUUID AgentID, LLUUID GroupID, 1636 public void doObjectDuplicateOnRay(uint localID, uint dupeFlags, LLUUID AgentID, LLUUID GroupID,
1611 LLUUID RayTargetObj, LLVector3 RayEnd, LLVector3 RayStart, 1637 LLUUID RayTargetObj, LLVector3 RayEnd, LLVector3 RayStart,
1612 bool BypassRaycast, bool RayEndIsIntersection, bool CopyCenters, bool CopyRotates) 1638 bool BypassRaycast, bool RayEndIsIntersection, bool CopyCenters, bool CopyRotates)
1613 { 1639 {
1640
1614 LLVector3 pos = LLVector3.Zero; 1641 LLVector3 pos = LLVector3.Zero;
1615 bool frontFacesOnly = true; 1642 bool frontFacesOnly = true;
1616 1643
1617 SceneObjectPart target = GetSceneObjectPart(localID); 1644 SceneObjectPart target = GetSceneObjectPart(localID);
1618 1645
1619 if (target != null) 1646 if (target != null)
1620 { 1647 {
1648
1621 LLVector3 direction = LLVector3.Norm(RayEnd - RayStart); 1649 LLVector3 direction = LLVector3.Norm(RayEnd - RayStart);
1622 Vector3 AXOrigin = new Vector3(RayStart.X, RayStart.Y, RayStart.Z); 1650 Vector3 AXOrigin = new Vector3(RayStart.X, RayStart.Y, RayStart.Z);
1623 Vector3 AXdirection = new Vector3(direction.X, direction.Y, direction.Z); 1651 Vector3 AXdirection = new Vector3(direction.X, direction.Y, direction.Z);
1624 1652
1625 1653
1626 if (target != null) 1654 if (target != null)
1627 { 1655 {
1628 if (target.ParentGroup != null) 1656 if (target.ParentGroup != null)
@@ -1652,8 +1680,9 @@ namespace OpenSim.Region.Environment.Scenes
1652 if (scaleComponent.Z != 0) ScaleOffset = scale.Z; 1680 if (scaleComponent.Z != 0) ScaleOffset = scale.Z;
1653 ScaleOffset = Math.Abs(ScaleOffset); 1681 ScaleOffset = Math.Abs(ScaleOffset);
1654 LLVector3 intersectionpoint = new LLVector3(ei.ipoint.x, ei.ipoint.y, ei.ipoint.z); 1682 LLVector3 intersectionpoint = new LLVector3(ei.ipoint.x, ei.ipoint.y, ei.ipoint.z);
1655 1683
1656 1684
1685
1657 if (CopyCenters) 1686 if (CopyCenters)
1658 { 1687 {
1659 // now we cast a ray from inside the prim(absolute position) to one of it's faces along the face normal. 1688 // now we cast a ray from inside the prim(absolute position) to one of it's faces along the face normal.
@@ -1665,7 +1694,7 @@ namespace OpenSim.Region.Environment.Scenes
1665 if (ei2.HitTF) 1694 if (ei2.HitTF)
1666 { 1695 {
1667 //m_log.Info("[RAYTRACERESULTS]: Hit:" + ei2.HitTF.ToString() + " Point: " + ei2.ipoint.ToString() + " Normal: " + ei2.normal.ToString()); 1696 //m_log.Info("[RAYTRACERESULTS]: Hit:" + ei2.HitTF.ToString() + " Point: " + ei2.ipoint.ToString() + " Normal: " + ei2.normal.ToString());
1668 pos = new LLVector3(ei2.ipoint.x, ei2.ipoint.y, ei2.ipoint.z); 1697 pos = new LLVector3(ei2.ipoint.x,ei2.ipoint.y,ei2.ipoint.z);
1669 } 1698 }
1670 } 1699 }
1671 LLVector3 normal = new LLVector3(ei.normal.x, ei.normal.y, ei.normal.z); 1700 LLVector3 normal = new LLVector3(ei.normal.x, ei.normal.y, ei.normal.z);
@@ -1678,14 +1707,18 @@ namespace OpenSim.Region.Environment.Scenes
1678 m_innerScene.DuplicateObject(target.ParentGroup.LocalId, pos, target.GetEffectiveObjectFlags(), AgentID, GroupID); 1707 m_innerScene.DuplicateObject(target.ParentGroup.LocalId, pos, target.GetEffectiveObjectFlags(), AgentID, GroupID);
1679 } 1708 }
1680 1709
1681 1710
1682 return; 1711 return;
1683 } 1712 }
1684 return; 1713 return;
1685 } 1714 }
1715
1686 } 1716 }
1687 }
1688 1717
1718
1719
1720
1721 }
1689 public virtual void SetHomeRezPoint(IClientAPI remoteClient, ulong regionHandle, LLVector3 position, LLVector3 lookAt, uint flags) 1722 public virtual void SetHomeRezPoint(IClientAPI remoteClient, ulong regionHandle, LLVector3 position, LLVector3 lookAt, uint flags)
1690 { 1723 {
1691 UserProfileData UserProfile = CommsManager.UserService.GetUserProfile(remoteClient.AgentId); 1724 UserProfileData UserProfile = CommsManager.UserService.GetUserProfile(remoteClient.AgentId);
@@ -1698,22 +1731,22 @@ namespace OpenSim.Region.Environment.Scenes
1698 // We cast these to an int so as not to cause a breaking change with old regions 1731 // We cast these to an int so as not to cause a breaking change with old regions
1699 // Newer regions treat this as a float on the ExpectUser method.. so we need to wait a few 1732 // Newer regions treat this as a float on the ExpectUser method.. so we need to wait a few
1700 // releases before setting these to floats. (r4257) 1733 // releases before setting these to floats. (r4257)
1701 UserProfile.HomeLocationX = (int) position.X; 1734 UserProfile.HomeLocationX = (int)position.X;
1702 UserProfile.HomeLocationY = (int) position.Y; 1735 UserProfile.HomeLocationY = (int)position.Y;
1703 UserProfile.HomeLocationZ = (int) position.Z; 1736 UserProfile.HomeLocationZ = (int)position.Z;
1704 UserProfile.HomeLookAtX = (int) lookAt.X; 1737 UserProfile.HomeLookAtX = (int)lookAt.X;
1705 UserProfile.HomeLookAtY = (int) lookAt.Y; 1738 UserProfile.HomeLookAtY = (int)lookAt.Y;
1706 UserProfile.HomeLookAtZ = (int) lookAt.Z; 1739 UserProfile.HomeLookAtZ = (int)lookAt.Z;
1707 CommsManager.UserService.UpdateUserProfileProperties(UserProfile); 1740 CommsManager.UserService.UpdateUserProfileProperties(UserProfile);
1708 1741
1709 remoteClient.SendAgentAlertMessage("Set home to here if supported by login service", false); 1742 remoteClient.SendAgentAlertMessage("Set home to here if supported by login service",false);
1710 } 1743 }
1711 else 1744 else
1712 { 1745 {
1713 remoteClient.SendAgentAlertMessage("Set Home request Failed", false); 1746 remoteClient.SendAgentAlertMessage("Set Home request Failed",false);
1714 } 1747 }
1715 }
1716 1748
1749 }
1717 protected virtual ScenePresence CreateAndAddScenePresence(IClientAPI client, bool child) 1750 protected virtual ScenePresence CreateAndAddScenePresence(IClientAPI client, bool child)
1718 { 1751 {
1719 ScenePresence avatar = null; 1752 ScenePresence avatar = null;
@@ -1779,7 +1812,7 @@ namespace OpenSim.Region.Environment.Scenes
1779 m_sceneGridService.SendCloseChildAgentConnections(agentID, childknownRegions); 1812 m_sceneGridService.SendCloseChildAgentConnections(agentID, childknownRegions);
1780 1813
1781 RemoveCapsHandler(agentID); 1814 RemoveCapsHandler(agentID);
1782 1815
1783 CommsManager.UserProfileCacheService.RemoveUser(agentID); 1816 CommsManager.UserProfileCacheService.RemoveUser(agentID);
1784 } 1817 }
1785 1818
@@ -1792,21 +1825,21 @@ namespace OpenSim.Region.Environment.Scenes
1792 } 1825 }
1793 m_eventManager.TriggerOnRemovePresence(agentID); 1826 m_eventManager.TriggerOnRemovePresence(agentID);
1794 Broadcast(delegate(IClientAPI client) 1827 Broadcast(delegate(IClientAPI client)
1828 {
1829 try
1830 {
1831 client.SendKillObject(avatar.RegionHandle, avatar.LocalId);
1832 }
1833 catch (NullReferenceException)
1795 { 1834 {
1796 try 1835 //We can safely ignore null reference exceptions. It means the avatar are dead and cleaned up anyway.
1797 { 1836 }
1798 client.SendKillObject(avatar.RegionHandle, avatar.LocalId); 1837 });
1799 }
1800 catch (NullReferenceException)
1801 {
1802 //We can safely ignore null reference exceptions. It means the avatar are dead and cleaned up anyway.
1803 }
1804 });
1805 1838
1806 ForEachScenePresence( 1839 ForEachScenePresence(
1807 delegate(ScenePresence presence) { presence.CoarseLocationChange(); }); 1840 delegate(ScenePresence presence) { presence.CoarseLocationChange(); });
1808 1841
1809 IAgentAssetTransactions agentTransactions = RequestModuleInterface<IAgentAssetTransactions>(); 1842 IAgentAssetTransactions agentTransactions = this.RequestModuleInterface<IAgentAssetTransactions>();
1810 if (agentTransactions != null) 1843 if (agentTransactions != null)
1811 { 1844 {
1812 agentTransactions.RemoveAgentAssetTransactions(agentID); 1845 agentTransactions.RemoveAgentAssetTransactions(agentID);
@@ -1846,7 +1879,7 @@ namespace OpenSim.Region.Environment.Scenes
1846 } 1879 }
1847 catch (Exception e) 1880 catch (Exception e)
1848 { 1881 {
1849 m_log.Error("[SCENE] Scene.cs:RemoveClient exception: " + e); 1882 m_log.Error("[SCENE] Scene.cs:RemoveClient exception: " + e.ToString());
1850 } 1883 }
1851 1884
1852 // Remove client agent from profile, so new logins will work 1885 // Remove client agent from profile, so new logins will work
@@ -1866,12 +1899,14 @@ namespace OpenSim.Region.Environment.Scenes
1866 { 1899 {
1867 lock (av) 1900 lock (av)
1868 { 1901 {
1902
1869 for (int i = 0; i < regionslst.Count; i++) 1903 for (int i = 0; i < regionslst.Count; i++)
1870 { 1904 {
1871 av.KnownChildRegions.Remove(regionslst[i]); 1905 av.KnownChildRegions.Remove(regionslst[i]);
1872 } 1906 }
1873 } 1907 }
1874 } 1908 }
1909
1875 } 1910 }
1876 1911
1877 public override void CloseAllAgents(uint circuitcode) 1912 public override void CloseAllAgents(uint circuitcode)
@@ -1959,7 +1994,7 @@ namespace OpenSim.Region.Environment.Scenes
1959 if (regionHandle == m_regInfo.RegionHandle) 1994 if (regionHandle == m_regInfo.RegionHandle)
1960 { 1995 {
1961 capsPaths[agent.AgentID] = agent.CapsPath; 1996 capsPaths[agent.AgentID] = agent.CapsPath;
1962 1997
1963 if (!agent.child) 1998 if (!agent.child)
1964 { 1999 {
1965 AddCapsHandler(agent.AgentID); 2000 AddCapsHandler(agent.AgentID);
@@ -1968,26 +2003,26 @@ namespace OpenSim.Region.Environment.Scenes
1968 ILandObject land = LandChannel.getLandObject(agent.startpos.X, agent.startpos.Y); 2003 ILandObject land = LandChannel.getLandObject(agent.startpos.X, agent.startpos.Y);
1969 if (land != null) 2004 if (land != null)
1970 { 2005 {
1971 if (land.landData.landingType == 1 && land.landData.userLocation != LLVector3.Zero) 2006 if (land.landData.landingType == (byte)1 && land.landData.userLocation != LLVector3.Zero)
1972 { 2007 {
1973 agent.startpos = land.landData.userLocation; 2008 agent.startpos = land.landData.userLocation;
1974 } 2009 }
1975 } 2010 }
1976 } 2011 }
1977 2012
1978 m_log.DebugFormat( 2013 m_log.DebugFormat(
1979 "[CONNECTION DEBUGGING]: Creating new circuit code ({0}) for avatar {1} at {2}", 2014 "[CONNECTION DEBUGGING]: Creating new circuit code ({0}) for avatar {1} at {2}",
1980 agent.circuitcode, agent.AgentID, RegionInfo.RegionName); 2015 agent.circuitcode, agent.AgentID, RegionInfo.RegionName);
1981 2016
1982 m_authenticateHandler.AddNewCircuit(agent.circuitcode, agent); 2017 m_authenticateHandler.AddNewCircuit(agent.circuitcode, agent);
1983 } 2018 }
1984 else 2019 else
1985 { 2020 {
1986 m_log.WarnFormat( 2021 m_log.WarnFormat(
1987 "[CONNECTION DEBUGGING]: Skipping this region for welcoming avatar {0} [{1}] at {2}", 2022 "[CONNECTION DEBUGGING]: Skipping this region for welcoming avatar {0} [{1}] at {2}",
1988 agent.AgentID, regionHandle, RegionInfo.RegionName); 2023 agent.AgentID, regionHandle, RegionInfo.RegionName);
1989 } 2024 }
1990 } 2025 }
1991 2026
1992 /// <summary> 2027 /// <summary>
1993 /// Add a caps handler for the given agent. If the CAPS handler already exists for this agent, 2028 /// Add a caps handler for the given agent. If the CAPS handler already exists for this agent,
@@ -2000,18 +2035,18 @@ namespace OpenSim.Region.Environment.Scenes
2000 /// <param name="agentId"></param> 2035 /// <param name="agentId"></param>
2001 /// <param name="capsObjectPath"></param> 2036 /// <param name="capsObjectPath"></param>
2002 public void AddCapsHandler(LLUUID agentId) 2037 public void AddCapsHandler(LLUUID agentId)
2003 { 2038 {
2004 String capsObjectPath = GetCapsPath(agentId); 2039 String capsObjectPath = GetCapsPath(agentId);
2005 2040
2006 m_log.DebugFormat( 2041 m_log.DebugFormat(
2007 "[CAPS]: Setting up CAPS handler for root agent {0} in {1}", 2042 "[CAPS]: Setting up CAPS handler for root agent {0} in {1}",
2008 agentId, RegionInfo.RegionName); 2043 agentId, RegionInfo.RegionName);
2009 2044
2010 Caps cap = 2045 Caps cap =
2011 new Caps(AssetCache, m_httpListener, m_regInfo.ExternalHostName, m_httpListener.Port, 2046 new Caps(AssetCache, m_httpListener, m_regInfo.ExternalHostName, m_httpListener.Port,
2012 capsObjectPath, agentId, m_dumpAssetsToFile, RegionInfo.RegionName); 2047 capsObjectPath, agentId, m_dumpAssetsToFile, RegionInfo.RegionName);
2013 cap.RegisterHandlers(); 2048 cap.RegisterHandlers();
2014 2049
2015 EventManager.TriggerOnRegisterCaps(agentId, cap); 2050 EventManager.TriggerOnRegisterCaps(agentId, cap);
2016 2051
2017 cap.AddNewInventoryItem = AddInventoryItem; 2052 cap.AddNewInventoryItem = AddInventoryItem;
@@ -2020,7 +2055,7 @@ namespace OpenSim.Region.Environment.Scenes
2020 cap.CAPSFetchInventoryDescendents = CommsManager.UserProfileCacheService.HandleFetchInventoryDescendentsCAPS; 2055 cap.CAPSFetchInventoryDescendents = CommsManager.UserProfileCacheService.HandleFetchInventoryDescendentsCAPS;
2021 cap.GetClient = m_innerScene.GetControllingClient; 2056 cap.GetClient = m_innerScene.GetControllingClient;
2022 m_capsHandlers[agentId] = cap; 2057 m_capsHandlers[agentId] = cap;
2023 } 2058 }
2024 2059
2025 /// <summary> 2060 /// <summary>
2026 /// Remove the caps handler for a given agent. 2061 /// Remove the caps handler for a given agent.
@@ -2033,9 +2068,9 @@ namespace OpenSim.Region.Environment.Scenes
2033 if (m_capsHandlers.ContainsKey(agentId)) 2068 if (m_capsHandlers.ContainsKey(agentId))
2034 { 2069 {
2035 m_log.DebugFormat( 2070 m_log.DebugFormat(
2036 "[CAPS]: Removing CAPS handler for root agent {0} in {1}", 2071 "[CAPS]: Removing CAPS handler for root agent {0} in {1}",
2037 agentId, RegionInfo.RegionName); 2072 agentId, RegionInfo.RegionName);
2038 2073
2039 m_capsHandlers[agentId].DeregisterHandlers(); 2074 m_capsHandlers[agentId].DeregisterHandlers();
2040 EventManager.TriggerOnDeregisterCaps(agentId, m_capsHandlers[agentId]); 2075 EventManager.TriggerOnDeregisterCaps(agentId, m_capsHandlers[agentId]);
2041 2076
@@ -2070,7 +2105,7 @@ namespace OpenSim.Region.Environment.Scenes
2070 catch (Exception e) 2105 catch (Exception e)
2071 { 2106 {
2072 m_log.Info("[SCENE]: Unable to do Agent Crossing."); 2107 m_log.Info("[SCENE]: Unable to do Agent Crossing.");
2073 m_log.Debug("[SCENE]: " + e); 2108 m_log.Debug("[SCENE]: " + e.ToString());
2074 } 2109 }
2075 //m_innerScene.SwapRootChildAgent(false); 2110 //m_innerScene.SwapRootChildAgent(false);
2076 } 2111 }
@@ -2086,14 +2121,15 @@ namespace OpenSim.Region.Environment.Scenes
2086 // however to avoid a race condition crossing borders.. 2121 // however to avoid a race condition crossing borders..
2087 if (childAgentUpdate.IsChildAgent) 2122 if (childAgentUpdate.IsChildAgent)
2088 { 2123 {
2089 uint rRegionX = (uint) (cAgentData.regionHandle >> 40); 2124 uint rRegionX = (uint)(cAgentData.regionHandle >> 40);
2090 uint rRegionY = (((uint) (cAgentData.regionHandle)) >> 8); 2125 uint rRegionY = (((uint)(cAgentData.regionHandle)) >> 8);
2091 uint tRegionX = RegionInfo.RegionLocX; 2126 uint tRegionX = RegionInfo.RegionLocX;
2092 uint tRegionY = RegionInfo.RegionLocY; 2127 uint tRegionY = RegionInfo.RegionLocY;
2093 //Send Data to ScenePresence 2128 //Send Data to ScenePresence
2094 childAgentUpdate.ChildAgentDataUpdate(cAgentData, tRegionX, tRegionY, rRegionX, rRegionY); 2129 childAgentUpdate.ChildAgentDataUpdate(cAgentData, tRegionX, tRegionY, rRegionX, rRegionY);
2095 // Not Implemented: 2130 // Not Implemented:
2096 //TODO: Do we need to pass the message on to one of our neighbors? 2131 //TODO: Do we need to pass the message on to one of our neighbors?
2132
2097 } 2133 }
2098 return true; 2134 return true;
2099 } 2135 }
@@ -2121,7 +2157,7 @@ namespace OpenSim.Region.Environment.Scenes
2121 m_innerScene.removeUserCount(true); 2157 m_innerScene.removeUserCount(true);
2122 } 2158 }
2123 // Tell a single agent to disconnect from the region. 2159 // Tell a single agent to disconnect from the region.
2124 DisableSimulatorPacket disable = (DisableSimulatorPacket) PacketPool.Instance.GetPacket(PacketType.DisableSimulator); 2160 DisableSimulatorPacket disable = (DisableSimulatorPacket)PacketPool.Instance.GetPacket(PacketType.DisableSimulator);
2125 presence.ControllingClient.OutPacket(disable, ThrottleOutPacketType.Unknown); 2161 presence.ControllingClient.OutPacket(disable, ThrottleOutPacketType.Unknown);
2126 presence.ControllingClient.Close(true); 2162 presence.ControllingClient.Close(true);
2127 } 2163 }
@@ -2271,9 +2307,9 @@ namespace OpenSim.Region.Environment.Scenes
2271 /// <param name="mod"></param> 2307 /// <param name="mod"></param>
2272 public void RegisterModuleInterface<M>(M mod) 2308 public void RegisterModuleInterface<M>(M mod)
2273 { 2309 {
2274 if (!ModuleInterfaces.ContainsKey(typeof (M))) 2310 if (!ModuleInterfaces.ContainsKey(typeof(M)))
2275 { 2311 {
2276 ModuleInterfaces.Add(typeof (M), mod); 2312 ModuleInterfaces.Add(typeof(M), mod);
2277 } 2313 }
2278 } 2314 }
2279 2315
@@ -2283,9 +2319,9 @@ namespace OpenSim.Region.Environment.Scenes
2283 /// <returns></returns> 2319 /// <returns></returns>
2284 public T RequestModuleInterface<T>() 2320 public T RequestModuleInterface<T>()
2285 { 2321 {
2286 if (ModuleInterfaces.ContainsKey(typeof (T))) 2322 if (ModuleInterfaces.ContainsKey(typeof(T)))
2287 { 2323 {
2288 return (T) ModuleInterfaces[typeof (T)]; 2324 return (T)ModuleInterfaces[typeof(T)];
2289 } 2325 }
2290 else 2326 else
2291 { 2327 {
@@ -2300,12 +2336,14 @@ namespace OpenSim.Region.Environment.Scenes
2300 m_statsReporter.SetObjectCapacity(objects); 2336 m_statsReporter.SetObjectCapacity(objects);
2301 } 2337 }
2302 objectCapacity = objects; 2338 objectCapacity = objects;
2339
2303 } 2340 }
2304 2341
2305 public List<FriendListItem> GetFriendList(LLUUID avatarID) 2342 public List<FriendListItem> GetFriendList(LLUUID avatarID)
2306 { 2343 {
2307 return CommsManager.GetUserFriendList(avatarID); 2344 return CommsManager.GetUserFriendList(avatarID);
2308 } 2345 }
2346
2309 2347
2310 #endregion 2348 #endregion
2311 2349
@@ -2340,8 +2378,7 @@ namespace OpenSim.Region.Environment.Scenes
2340 } 2378 }
2341 } 2379 }
2342 2380
2343 public void SendDialogToUser(LLUUID avatarID, string objectName, LLUUID objectID, LLUUID ownerID, string message, LLUUID TextureID, int ch, 2381 public void SendDialogToUser(LLUUID avatarID, string objectName, LLUUID objectID, LLUUID ownerID, string message, LLUUID TextureID, int ch, string[] buttonlabels)
2344 string[] buttonlabels)
2345 { 2382 {
2346 if (m_scenePresences.ContainsKey(avatarID)) 2383 if (m_scenePresences.ContainsKey(avatarID))
2347 { 2384 {
@@ -2364,7 +2401,7 @@ namespace OpenSim.Region.Environment.Scenes
2364 } 2401 }
2365 return LLUUID.Zero; 2402 return LLUUID.Zero;
2366 } 2403 }
2367 2404
2368 2405
2369 /// <summary> 2406 /// <summary>
2370 /// This method is a way for the Friends Module to create an instant 2407 /// This method is a way for the Friends Module to create an instant
@@ -2399,7 +2436,6 @@ namespace OpenSim.Region.Environment.Scenes
2399 // TODO: m_sceneGridService.DoStuff; 2436 // TODO: m_sceneGridService.DoStuff;
2400 m_sceneGridService.RemoveUserFriend(ownerID, ExfriendID); 2437 m_sceneGridService.RemoveUserFriend(ownerID, ExfriendID);
2401 } 2438 }
2402
2403 public virtual List<FriendListItem> StoreGetFriendsForUser(LLUUID ownerID) 2439 public virtual List<FriendListItem> StoreGetFriendsForUser(LLUUID ownerID)
2404 { 2440 {
2405 // TODO: m_sceneGridService.DoStuff; 2441 // TODO: m_sceneGridService.DoStuff;
@@ -2412,13 +2448,11 @@ namespace OpenSim.Region.Environment.Scenes
2412 m_statsReporter.AddOutPackets(outPackets); 2448 m_statsReporter.AddOutPackets(outPackets);
2413 m_statsReporter.AddunAckedBytes(unAckedBytes); 2449 m_statsReporter.AddunAckedBytes(unAckedBytes);
2414 } 2450 }
2415
2416 public void AddAgentTime(int ms) 2451 public void AddAgentTime(int ms)
2417 { 2452 {
2418 m_statsReporter.addFrameMS(ms); 2453 m_statsReporter.addFrameMS(ms);
2419 m_statsReporter.addAgentMS(ms); 2454 m_statsReporter.addAgentMS(ms);
2420 } 2455 }
2421
2422 public void AddAgentUpdates(int count) 2456 public void AddAgentUpdates(int count)
2423 { 2457 {
2424 m_statsReporter.AddAgentUpdates(count); 2458 m_statsReporter.AddAgentUpdates(count);
@@ -2512,6 +2546,7 @@ namespace OpenSim.Region.Environment.Scenes
2512 /// <param name="Message">The Message being sent to the user</param> 2546 /// <param name="Message">The Message being sent to the user</param>
2513 public void SendRegionMessageFromEstateTools(LLUUID FromAvatarID, LLUUID fromSessionID, String FromAvatarName, String Message) 2547 public void SendRegionMessageFromEstateTools(LLUUID FromAvatarID, LLUUID fromSessionID, String FromAvatarName, String Message)
2514 { 2548 {
2549
2515 List<ScenePresence> presenceList = GetScenePresences(); 2550 List<ScenePresence> presenceList = GetScenePresences();
2516 2551
2517 foreach (ScenePresence presence in presenceList) 2552 foreach (ScenePresence presence in presenceList)
@@ -2531,7 +2566,11 @@ namespace OpenSim.Region.Environment.Scenes
2531 /// <param name="Message">The Message being sent to the user</param> 2566 /// <param name="Message">The Message being sent to the user</param>
2532 public void SendEstateMessageFromEstateTools(LLUUID FromAvatarID, LLUUID fromSessionID, String FromAvatarName, String Message) 2567 public void SendEstateMessageFromEstateTools(LLUUID FromAvatarID, LLUUID fromSessionID, String FromAvatarName, String Message)
2533 { 2568 {
2534 ClientManager.ForEachClient(delegate(IClientAPI controller) { controller.SendBlueBoxMessage(FromAvatarID, fromSessionID, FromAvatarName, Message); } 2569
2570 ClientManager.ForEachClient(delegate(IClientAPI controller)
2571 {
2572 controller.SendBlueBoxMessage(FromAvatarID, fromSessionID, FromAvatarName, Message);
2573 }
2535 ); 2574 );
2536 } 2575 }
2537 2576
@@ -2557,24 +2596,27 @@ namespace OpenSim.Region.Environment.Scenes
2557 if (agentID == kickUserID) 2596 if (agentID == kickUserID)
2558 { 2597 {
2559 ClientManager.ForEachClient(delegate(IClientAPI controller) 2598 ClientManager.ForEachClient(delegate(IClientAPI controller)
2560 { 2599 {
2561 if (controller.AgentId != godID) 2600 if (controller.AgentId != godID)
2562 controller.Kick(Helpers.FieldToUTF8String(reason)); 2601 controller.Kick(Helpers.FieldToUTF8String(reason));
2563 } 2602
2603
2604
2605 }
2564 ); 2606 );
2565 // This is a bit crude. It seems the client will be null before it actually stops the thread 2607 // This is a bit crude. It seems the client will be null before it actually stops the thread
2566 // The thread will kill itself eventually :/ 2608 // The thread will kill itself eventually :/
2567 // Is there another way to make sure *all* clients get this 'inter region' message? 2609 // Is there another way to make sure *all* clients get this 'inter region' message?
2568 ClientManager.ForEachClient(delegate(IClientAPI controller) 2610 ClientManager.ForEachClient(delegate(IClientAPI controller)
2611 {
2612 ScenePresence p = GetScenePresence(controller.AgentId);
2613 bool childagent = !p.Equals(null) && p.IsChildAgent;
2614 if (controller.AgentId != godID && !childagent)
2615 // Do we really want to kick the initiator of this madness?
2569 { 2616 {
2570 ScenePresence p = GetScenePresence(controller.AgentId); 2617 controller.Close(true);
2571 bool childagent = !p.Equals(null) && p.IsChildAgent;
2572 if (controller.AgentId != godID && !childagent)
2573 // Do we really want to kick the initiator of this madness?
2574 {
2575 controller.Close(true);
2576 }
2577 } 2618 }
2619 }
2578 ); 2620 );
2579 } 2621 }
2580 else 2622 else
@@ -2605,6 +2647,7 @@ namespace OpenSim.Region.Environment.Scenes
2605 // Check for spoofing.. since this is permissions we're talking about here! 2647 // Check for spoofing.. since this is permissions we're talking about here!
2606 if ((controller.SessionId == sessionID) && (controller.AgentId == agentID)) 2648 if ((controller.SessionId == sessionID) && (controller.AgentId == agentID))
2607 { 2649 {
2650
2608 // Tell the object to do permission update 2651 // Tell the object to do permission update
2609 if (localId != 0) 2652 if (localId != 0)
2610 { 2653 {
@@ -2614,6 +2657,7 @@ namespace OpenSim.Region.Environment.Scenes
2614 chObjectGroup.UpdatePermissions(agentID, field, localId, mask, set); 2657 chObjectGroup.UpdatePermissions(agentID, field, localId, mask, set);
2615 } 2658 }
2616 } 2659 }
2660
2617 } 2661 }
2618 } 2662 }
2619 2663
@@ -2679,7 +2723,7 @@ namespace OpenSim.Region.Environment.Scenes
2679 { 2723 {
2680 if (ent is SceneObjectGroup) 2724 if (ent is SceneObjectGroup)
2681 { 2725 {
2682 ((SceneObjectGroup) ent).ScheduleGroupForFullUpdate(); 2726 ((SceneObjectGroup)ent).ScheduleGroupForFullUpdate();
2683 } 2727 }
2684 } 2728 }
2685 } 2729 }
@@ -2699,7 +2743,7 @@ namespace OpenSim.Region.Environment.Scenes
2699 { 2743 {
2700 if (ent is SceneObjectGroup) 2744 if (ent is SceneObjectGroup)
2701 { 2745 {
2702 SceneObjectPart part = ((SceneObjectGroup) ent).GetChildPart((ent).UUID); 2746 SceneObjectPart part = ((SceneObjectGroup)ent).GetChildPart(((SceneObjectGroup)ent).UUID);
2703 if (part != null) 2747 if (part != null)
2704 { 2748 {
2705 if (part.Name == cmdparams[0]) 2749 if (part.Name == cmdparams[0])
@@ -2823,8 +2867,8 @@ namespace OpenSim.Region.Environment.Scenes
2823 2867
2824 #region Script Engine 2868 #region Script Engine
2825 2869
2826 private readonly bool m_dumpAssetsToFile; 2870 private List<ScriptEngineInterface> ScriptEngines = new List<ScriptEngineInterface>();
2827 private readonly List<ScriptEngineInterface> ScriptEngines = new List<ScriptEngineInterface>(); 2871 private bool m_dumpAssetsToFile;
2828 2872
2829 /// <summary> 2873 /// <summary>
2830 /// 2874 ///
@@ -2838,11 +2882,13 @@ namespace OpenSim.Region.Environment.Scenes
2838 2882
2839 public void TriggerObjectChanged(uint localID, uint change) 2883 public void TriggerObjectChanged(uint localID, uint change)
2840 { 2884 {
2885
2841 m_eventManager.TriggerOnScriptChangedEvent(localID, change); 2886 m_eventManager.TriggerOnScriptChangedEvent(localID, change);
2842 } 2887 }
2843 2888
2844 public void TriggerAtTargetEvent(uint localID, uint handle, LLVector3 targetpos, LLVector3 currentpos) 2889 public void TriggerAtTargetEvent(uint localID, uint handle, LLVector3 targetpos, LLVector3 currentpos)
2845 { 2890 {
2891
2846 m_eventManager.TriggerAtTargetEvent(localID, handle, targetpos, currentpos); 2892 m_eventManager.TriggerAtTargetEvent(localID, handle, targetpos, currentpos);
2847 } 2893 }
2848 2894
@@ -2851,21 +2897,20 @@ namespace OpenSim.Region.Environment.Scenes
2851 m_eventManager.TriggerNotAtTargetEvent(localID); 2897 m_eventManager.TriggerNotAtTargetEvent(localID);
2852 } 2898 }
2853 2899
2854 private bool scriptDanger(SceneObjectPart part, LLVector3 pos) 2900 private bool scriptDanger(SceneObjectPart part,LLVector3 pos)
2855 { 2901 {
2856 ILandObject parcel = LandChannel.getLandObject(pos.X, pos.Y); 2902 ILandObject parcel = LandChannel.getLandObject(pos.X, pos.Y);
2857 if (part != null) 2903 if (part != null)
2858 { 2904 {
2859 if (parcel != null) 2905 if (parcel != null)
2860 { 2906 {
2861 if ((parcel.landData.landFlags & (uint) Parcel.ParcelFlags.AllowOtherScripts) != 0) 2907 if ((parcel.landData.landFlags & (uint)Parcel.ParcelFlags.AllowOtherScripts) != 0)
2862 { 2908 {
2863 return true; 2909 return true;
2864 } 2910 }
2865 else if ((parcel.landData.landFlags & (uint) Parcel.ParcelFlags.AllowGroupScripts) != 0) 2911 else if ((parcel.landData.landFlags & (uint)Parcel.ParcelFlags.AllowGroupScripts) != 0)
2866 { 2912 {
2867 if (part.OwnerID == parcel.landData.ownerID || (parcel.landData.isGroupOwned && part.GroupID == parcel.landData.groupID) || 2913 if (part.OwnerID == parcel.landData.ownerID || (parcel.landData.isGroupOwned && part.GroupID == parcel.landData.groupID) || PermissionsMngr.GenericEstatePermission(part.OwnerID))
2868 PermissionsMngr.GenericEstatePermission(part.OwnerID))
2869 { 2914 {
2870 return true; 2915 return true;
2871 } 2916 }
@@ -2873,7 +2918,7 @@ namespace OpenSim.Region.Environment.Scenes
2873 { 2918 {
2874 return false; 2919 return false;
2875 } 2920 }
2876 } 2921 }
2877 else 2922 else
2878 { 2923 {
2879 if (part.OwnerID == parcel.landData.ownerID) 2924 if (part.OwnerID == parcel.landData.ownerID)
@@ -2888,6 +2933,7 @@ namespace OpenSim.Region.Environment.Scenes
2888 } 2933 }
2889 else 2934 else
2890 { 2935 {
2936
2891 if (pos.X > 0f && pos.X < Constants.RegionSize && pos.Y > 0f && pos.Y < Constants.RegionSize) 2937 if (pos.X > 0f && pos.X < Constants.RegionSize && pos.Y > 0f && pos.Y < Constants.RegionSize)
2892 { 2938 {
2893 // The only time parcel != null when an object is inside a region is when 2939 // The only time parcel != null when an object is inside a region is when
@@ -2906,7 +2952,6 @@ namespace OpenSim.Region.Environment.Scenes
2906 return false; 2952 return false;
2907 } 2953 }
2908 } 2954 }
2909
2910 public bool scriptDanger(uint localID, LLVector3 pos) 2955 public bool scriptDanger(uint localID, LLVector3 pos)
2911 { 2956 {
2912 SceneObjectPart part = GetSceneObjectPart(localID); 2957 SceneObjectPart part = GetSceneObjectPart(localID);
@@ -2922,11 +2967,13 @@ namespace OpenSim.Region.Environment.Scenes
2922 2967
2923 public bool pipeEventsForScript(uint localID) 2968 public bool pipeEventsForScript(uint localID)
2924 { 2969 {
2970
2925 SceneObjectPart part = GetSceneObjectPart(localID); 2971 SceneObjectPart part = GetSceneObjectPart(localID);
2926 if (part != null) 2972 if (part != null)
2927 { 2973 {
2928 LLVector3 pos = part.GetWorldPosition(); 2974 LLVector3 pos = part.GetWorldPosition();
2929 return scriptDanger(part, pos); 2975 return scriptDanger(part, pos);
2976
2930 } 2977 }
2931 else 2978 else
2932 { 2979 {
@@ -3043,17 +3090,17 @@ namespace OpenSim.Region.Environment.Scenes
3043 } 3090 }
3044 catch (Exception e) 3091 catch (Exception e)
3045 { 3092 {
3046 m_log.Info("[BUG]: " + e); 3093 m_log.Info("[BUG]: " + e.ToString());
3047 } 3094 }
3048 } 3095 }
3049 } 3096 }
3050 3097
3051 /// <summary> 3098 /// <summary>
3052 /// Delete this object from the scene. 3099 /// Delete this object from the scene.
3053 /// </summary> 3100 /// </summary>
3054 /// <param name="group"></param> 3101 /// <param name="group"></param>
3055 public void DeleteSceneObjectGroup(SceneObjectGroup group) 3102 public void DeleteSceneObjectGroup(SceneObjectGroup group)
3056 { 3103 {
3057 SceneObjectPart rootPart = (group).GetChildPart(group.UUID); 3104 SceneObjectPart rootPart = (group).GetChildPart(group.UUID);
3058 if (rootPart.PhysActor != null) 3105 if (rootPart.PhysActor != null)
3059 { 3106 {
@@ -3070,15 +3117,15 @@ namespace OpenSim.Region.Environment.Scenes
3070 m_innerScene.RemoveAPrimCount(); 3117 m_innerScene.RemoveAPrimCount();
3071 } 3118 }
3072 group.DeleteParts(); 3119 group.DeleteParts();
3073 3120
3074 // In case anybody else retains a reference to this group, signal deletion by changing the name 3121 // In case anybody else retains a reference to this group, signal deletion by changing the name
3075 // to null. We can't zero out the UUID because this is taken from the root part, which has already 3122 // to null. We can't zero out the UUID because this is taken from the root part, which has already
3076 // been removed. 3123 // been removed.
3077 // FIXME: This is a really poor temporary solution, since it still leaves plenty of scope for race 3124 // FIXME: This is a really poor temporary solution, since it still leaves plenty of scope for race
3078 // conditions where a user deletes an entity while it is being stored. Really, the update 3125 // conditions where a user deletes an entity while it is being stored. Really, the update
3079 // code needs a redesign. 3126 // code needs a redesign.
3080 group.Name = null; 3127 group.Name = null;
3081 } 3128 }
3082 3129
3083 /// <summary> 3130 /// <summary>
3084 /// 3131 ///
@@ -3098,6 +3145,7 @@ namespace OpenSim.Region.Environment.Scenes
3098 // action(presence); 3145 // action(presence);
3099 // } 3146 // }
3100 // } 3147 // }
3148
3101 /// <summary> 3149 /// <summary>
3102 /// 3150 ///
3103 /// </summary> 3151 /// </summary>
@@ -3187,7 +3235,6 @@ namespace OpenSim.Region.Environment.Scenes
3187 } 3235 }
3188 return visualParams; 3236 return visualParams;
3189 } 3237 }
3190
3191 #endregion 3238 #endregion
3192 } 3239 }
3193} \ No newline at end of file 3240}
diff --git a/OpenSim/Region/Environment/Scenes/SceneBase.cs b/OpenSim/Region/Environment/Scenes/SceneBase.cs
index 435dc8b..d9dc1da 100644
--- a/OpenSim/Region/Environment/Scenes/SceneBase.cs
+++ b/OpenSim/Region/Environment/Scenes/SceneBase.cs
@@ -40,11 +40,6 @@ namespace OpenSim.Region.Environment.Scenes
40 { 40 {
41 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 41 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
42 42
43 /// <summary>
44 /// XXX These two methods are very temporary
45 /// </summary>
46 protected Dictionary<LLUUID, string> capsPaths = new Dictionary<LLUUID, string>();
47
48 #region Events 43 #region Events
49 44
50 public event restart OnRestart; 45 public event restart OnRestart;
@@ -55,38 +50,41 @@ namespace OpenSim.Region.Environment.Scenes
55 50
56 private readonly ClientManager m_clientManager = new ClientManager(); 51 private readonly ClientManager m_clientManager = new ClientManager();
57 52
53 public ClientManager ClientManager
54 {
55 get { return m_clientManager; }
56 }
57
58 protected ulong m_regionHandle;
59 protected string m_regionName;
60 protected RegionInfo m_regInfo;
61
58 //public TerrainEngine Terrain; 62 //public TerrainEngine Terrain;
59 public ITerrainChannel Heightmap; 63 public ITerrainChannel Heightmap;
60 64
61 public ILandChannel LandChannel; 65 public ILandChannel LandChannel;
62 private AssetCache m_assetCache;
63 66
64
65 protected string m_datastore;
66 protected EventManager m_eventManager; 67 protected EventManager m_eventManager;
67 68
68 private uint m_nextLocalId = 8880000;
69 protected RegionInfo m_regInfo;
70 protected ulong m_regionHandle;
71 protected string m_regionName;
72
73 protected RegionStatus m_regStatus;
74
75 public EventManager EventManager 69 public EventManager EventManager
76 { 70 {
77 get { return m_eventManager; } 71 get { return m_eventManager; }
78 } 72 }
79 73
74
75 protected string m_datastore;
76
77 private uint m_nextLocalId = 8880000;
78
79 private AssetCache m_assetCache;
80
80 public AssetCache AssetCache 81 public AssetCache AssetCache
81 { 82 {
82 get { return m_assetCache; } 83 get { return m_assetCache; }
83 set { m_assetCache = value; } 84 set { m_assetCache = value; }
84 } 85 }
85 86
86 public ClientManager ClientManager 87 protected RegionStatus m_regStatus;
87 {
88 get { return m_clientManager; }
89 }
90 88
91 public RegionStatus Region_Status 89 public RegionStatus Region_Status
92 { 90 {
@@ -143,8 +141,6 @@ namespace OpenSim.Region.Environment.Scenes
143 141
144 #endregion 142 #endregion
145 143
146 #region IScene Members
147
148 /// <summary> 144 /// <summary>
149 /// 145 ///
150 /// </summary> 146 /// </summary>
@@ -159,18 +155,6 @@ namespace OpenSim.Region.Environment.Scenes
159 get { return m_nextLocalId++; } 155 get { return m_nextLocalId++; }
160 } 156 }
161 157
162 public string GetCapsPath(LLUUID agentId)
163 {
164 if (capsPaths.ContainsKey(agentId))
165 {
166 return capsPaths[agentId];
167 }
168
169 return null;
170 }
171
172 #endregion
173
174 #region admin stuff 158 #region admin stuff
175 159
176 /// <summary> 160 /// <summary>
@@ -189,7 +173,6 @@ namespace OpenSim.Region.Environment.Scenes
189 { 173 {
190 return false; 174 return false;
191 } 175 }
192
193 public abstract bool OtherRegionUp(RegionInfo thisRegion); 176 public abstract bool OtherRegionUp(RegionInfo thisRegion);
194 177
195 public virtual string GetSimulatorVersion() 178 public virtual string GetSimulatorVersion()
@@ -212,10 +195,24 @@ namespace OpenSim.Region.Environment.Scenes
212 } 195 }
213 catch (Exception e) 196 catch (Exception e)
214 { 197 {
215 m_log.Error("[SCENE]: SceneBase.cs: Close() - Failed with exception " + e); 198 m_log.Error("[SCENE]: SceneBase.cs: Close() - Failed with exception " + e.ToString());
216 } 199 }
217 } 200 }
218 201
219 #endregion 202 #endregion
203
204 /// <summary>
205 /// XXX These two methods are very temporary
206 /// </summary>
207 protected Dictionary<LLUUID, string> capsPaths = new Dictionary<LLUUID, string>();
208 public string GetCapsPath(LLUUID agentId)
209 {
210 if (capsPaths.ContainsKey(agentId))
211 {
212 return capsPaths[agentId];
213 }
214
215 return null;
216 }
220 } 217 }
221} \ No newline at end of file 218}
diff --git a/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs
index b44847b..91bbdb7 100644
--- a/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs
+++ b/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs
@@ -43,47 +43,13 @@ namespace OpenSim.Region.Environment.Scenes
43 43
44 public class SceneCommunicationService //one instance per region 44 public class SceneCommunicationService //one instance per region
45 { 45 {
46 #region Delegates
47
48 public delegate void InformNeighbourThatRegionUpDelegate(RegionInfo region, ulong regionhandle);
49
50 public delegate void SendChildAgentDataUpdateDelegate(ChildAgentDataUpdate cAgentData, ScenePresence presence);
51
52 public delegate void SendCloseChildAgentDelegate(LLUUID agentID, List<ulong> regionlst);
53
54 #endregion
55
56 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 46 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
57 public string _debugRegionName = String.Empty;
58 private AgentCrossing handlerAvatarCrossingIntoRegion; // OnAvatarCrossingIntoRegion;
59 private ChildAgentUpdate handlerChildAgentUpdate; // OnChildAgentUpdate;
60 private CloseAgentConnection handlerCloseAgentConnection; // OnCloseAgentConnection;
61 private ExpectPrimDelegate handlerExpectPrim; // OnExpectPrim;
62 private ExpectUserDelegate handlerExpectUser; // OnExpectUser;
63 private PrimCrossing handlerPrimCrossingIntoRegion; // OnPrimCrossingIntoRegion;
64 private RegionUp handlerRegionUp; // OnRegionUp;
65 private RemoveKnownRegionsFromAvatarList handlerRemoveKnownRegionFromAvatar; // OnRemoveKnownRegionFromAvatar;
66
67 public KillObjectDelegate KillObject;
68 47
69 protected CommunicationsManager m_commsProvider; 48 protected CommunicationsManager m_commsProvider;
70 protected RegionInfo m_regionInfo; 49 protected RegionInfo m_regionInfo;
71 50
72 protected RegionCommsListener regionCommsHost; 51 protected RegionCommsListener regionCommsHost;
73 52
74 public SceneCommunicationService(CommunicationsManager commsMan)
75 {
76 m_commsProvider = commsMan;
77 m_commsProvider.GridService.gdebugRegionName = _debugRegionName;
78 m_commsProvider.InterRegion.rdebugRegionName = _debugRegionName;
79 }
80
81 public string debugRegionName
82 {
83 get { return _debugRegionName; }
84 set { _debugRegionName = value; }
85 }
86
87 public event AgentCrossing OnAvatarCrossingIntoRegion; 53 public event AgentCrossing OnAvatarCrossingIntoRegion;
88 public event ExpectUserDelegate OnExpectUser; 54 public event ExpectUserDelegate OnExpectUser;
89 public event ExpectPrimDelegate OnExpectPrim; 55 public event ExpectPrimDelegate OnExpectPrim;
@@ -93,6 +59,31 @@ namespace OpenSim.Region.Environment.Scenes
93 public event ChildAgentUpdate OnChildAgentUpdate; 59 public event ChildAgentUpdate OnChildAgentUpdate;
94 public event RemoveKnownRegionsFromAvatarList OnRemoveKnownRegionFromAvatar; 60 public event RemoveKnownRegionsFromAvatarList OnRemoveKnownRegionFromAvatar;
95 61
62 private AgentCrossing handlerAvatarCrossingIntoRegion = null; // OnAvatarCrossingIntoRegion;
63 private ExpectUserDelegate handlerExpectUser = null; // OnExpectUser;
64 private ExpectPrimDelegate handlerExpectPrim = null; // OnExpectPrim;
65 private CloseAgentConnection handlerCloseAgentConnection = null; // OnCloseAgentConnection;
66 private PrimCrossing handlerPrimCrossingIntoRegion = null; // OnPrimCrossingIntoRegion;
67 private RegionUp handlerRegionUp = null; // OnRegionUp;
68 private ChildAgentUpdate handlerChildAgentUpdate = null; // OnChildAgentUpdate;
69 private RemoveKnownRegionsFromAvatarList handlerRemoveKnownRegionFromAvatar = null; // OnRemoveKnownRegionFromAvatar;
70
71 public KillObjectDelegate KillObject;
72 public string _debugRegionName = String.Empty;
73
74 public string debugRegionName
75 {
76 get { return _debugRegionName; }
77 set { _debugRegionName = value; }
78 }
79
80 public SceneCommunicationService(CommunicationsManager commsMan)
81 {
82 m_commsProvider = commsMan;
83 m_commsProvider.GridService.gdebugRegionName = _debugRegionName;
84 m_commsProvider.InterRegion.rdebugRegionName = _debugRegionName;
85 }
86
96 public void RegisterRegion(RegionInfo regionInfos) 87 public void RegisterRegion(RegionInfo regionInfos)
97 { 88 {
98 m_regionInfo = regionInfos; 89 m_regionInfo = regionInfos;
@@ -108,7 +99,7 @@ namespace OpenSim.Region.Environment.Scenes
108 regionCommsHost.OnAvatarCrossingIntoRegion += AgentCrossing; 99 regionCommsHost.OnAvatarCrossingIntoRegion += AgentCrossing;
109 regionCommsHost.OnCloseAgentConnection += CloseConnection; 100 regionCommsHost.OnCloseAgentConnection += CloseConnection;
110 regionCommsHost.OnRegionUp += newRegionUp; 101 regionCommsHost.OnRegionUp += newRegionUp;
111 regionCommsHost.OnChildAgentUpdate += ChildAgentUpdate; 102 regionCommsHost.OnChildAgentUpdate += ChildAgentUpdate;
112 } 103 }
113 else 104 else
114 { 105 {
@@ -131,6 +122,218 @@ namespace OpenSim.Region.Environment.Scenes
131 } 122 }
132 } 123 }
133 124
125 #region CommsManager Event handlers
126
127 /// <summary>
128 ///
129 /// </summary>
130 /// <param name="regionHandle"></param>
131 /// <param name="agent"></param>
132 ///
133 protected void NewUserConnection(ulong regionHandle, AgentCircuitData agent)
134 {
135 handlerExpectUser = OnExpectUser;
136 if (handlerExpectUser != null)
137 {
138 //m_log.Info("[INTER]: " + debugRegionName + ": SceneCommunicationService: OnExpectUser Fired for User:" + agent.firstname + " " + agent.lastname);
139 handlerExpectUser(regionHandle, agent);
140 }
141 }
142
143 protected bool newRegionUp(RegionInfo region)
144 {
145 handlerRegionUp = OnRegionUp;
146 if (handlerRegionUp != null)
147 {
148 //m_log.Info("[INTER]: " + debugRegionName + ": SceneCommunicationService: newRegionUp Fired for User:" + region.RegionName);
149 handlerRegionUp(region);
150 }
151 return true;
152 }
153
154 protected bool ChildAgentUpdate(ulong regionHandle, ChildAgentDataUpdate cAgentData)
155 {
156 handlerChildAgentUpdate = OnChildAgentUpdate;
157 if (handlerChildAgentUpdate != null)
158 handlerChildAgentUpdate(regionHandle, cAgentData);
159
160
161 return true;
162 }
163
164 protected void AgentCrossing(ulong regionHandle, LLUUID agentID, LLVector3 position, bool isFlying)
165 {
166 handlerAvatarCrossingIntoRegion = OnAvatarCrossingIntoRegion;
167 if (handlerAvatarCrossingIntoRegion != null)
168 {
169 handlerAvatarCrossingIntoRegion(regionHandle, agentID, position, isFlying);
170 }
171 }
172
173 protected bool IncomingPrimCrossing(ulong regionHandle, LLUUID primID, String objXMLData, int XMLMethod)
174 {
175 handlerExpectPrim = OnExpectPrim;
176 if (handlerExpectPrim != null)
177 {
178 return handlerExpectPrim(regionHandle, primID, objXMLData, XMLMethod);
179 }
180 else
181 {
182 return false;
183 }
184
185 }
186
187 protected void PrimCrossing(ulong regionHandle, LLUUID primID, LLVector3 position, bool isPhysical)
188 {
189 handlerPrimCrossingIntoRegion = OnPrimCrossingIntoRegion;
190 if (handlerPrimCrossingIntoRegion != null)
191 {
192 handlerPrimCrossingIntoRegion(regionHandle, primID, position, isPhysical);
193 }
194 }
195
196 protected bool CloseConnection(ulong regionHandle, LLUUID agentID)
197 {
198 m_log.Info("[INTERREGION]: Incoming Agent Close Request for agent: " + agentID.ToString());
199 handlerCloseAgentConnection = OnCloseAgentConnection;
200 if (handlerCloseAgentConnection != null)
201 {
202 return handlerCloseAgentConnection(regionHandle, agentID);
203 }
204 return false;
205 }
206
207 #endregion
208
209 #region Inform Client of Neighbours
210
211 private delegate void InformClientOfNeighbourDelegate(
212 ScenePresence avatar, AgentCircuitData a, ulong regionHandle, IPEndPoint endPoint);
213
214 private void InformClientOfNeighbourCompleted(IAsyncResult iar)
215 {
216 InformClientOfNeighbourDelegate icon = (InformClientOfNeighbourDelegate) iar.AsyncState;
217 icon.EndInvoke(iar);
218 }
219
220 /// <summary>
221 /// Async compnent for informing client of which neighbours exists
222 /// </summary>
223 /// <remarks>
224 /// This needs to run asynchronesously, as a network timeout may block the thread for a long while
225 /// </remarks>
226 /// <param name="remoteClient"></param>
227 /// <param name="a"></param>
228 /// <param name="regionHandle"></param>
229 /// <param name="endPoint"></param>
230 private void InformClientOfNeighbourAsync(ScenePresence avatar, AgentCircuitData a, ulong regionHandle,
231 IPEndPoint endPoint)
232 {
233 m_log.Info("[INTERGRID]: Starting to inform client about neighbours");
234 bool regionAccepted = m_commsProvider.InterRegion.InformRegionOfChildAgent(regionHandle, a);
235
236 if (regionAccepted)
237 {
238 avatar.ControllingClient.InformClientOfNeighbour(regionHandle, endPoint);
239 avatar.AddNeighbourRegion(regionHandle);
240 m_log.Info("[INTERGRID]: Completed inform client about neighbours");
241 }
242 }
243
244 public void RequestNeighbors(RegionInfo region)
245 {
246 List<SimpleRegionInfo> neighbours =
247 m_commsProvider.GridService.RequestNeighbours(m_regionInfo.RegionLocX, m_regionInfo.RegionLocY);
248 //IPEndPoint blah = new IPEndPoint();
249
250 //blah.Address = region.RemotingAddress;
251 //blah.Port = region.RemotingPort;
252 }
253
254 /// <summary>
255 /// This informs all neighboring regions about agent "avatar".
256 /// Calls an asynchronous method to do so.. so it doesn't lag the sim.
257 /// </summary>
258 public void EnableNeighbourChildAgents(ScenePresence avatar, List<RegionInfo> lstneighbours)
259 {
260 List<SimpleRegionInfo> neighbours = new List<SimpleRegionInfo>();
261
262 //m_commsProvider.GridService.RequestNeighbours(m_regionInfo.RegionLocX, m_regionInfo.RegionLocY);
263 for (int i = 0; i < lstneighbours.Count; i++)
264 {
265 // We don't want to keep sending to regions that consistently fail on comms.
266 if (!(lstneighbours[i].commFailTF))
267 {
268 neighbours.Add(new SimpleRegionInfo(lstneighbours[i]));
269 }
270 }
271 // we're going to be using the above code once neighbour cache is correct. Currently it doesn't appear to be
272 // So we're temporarily going back to the old method of grabbing it from the Grid Server Every time :/
273 neighbours =
274 m_commsProvider.GridService.RequestNeighbours(m_regionInfo.RegionLocX, m_regionInfo.RegionLocY);
275
276 if (neighbours != null)
277 {
278 for (int i = 0; i < neighbours.Count; i++)
279 {
280 AgentCircuitData agent = avatar.ControllingClient.RequestClientInfo();
281 agent.BaseFolder = LLUUID.Zero;
282 agent.InventoryFolder = LLUUID.Zero;
283 agent.startpos = new LLVector3(128, 128, 70);
284 agent.child = true;
285
286 InformClientOfNeighbourDelegate d = InformClientOfNeighbourAsync;
287
288 try
289 {
290 d.BeginInvoke(avatar, agent, neighbours[i].RegionHandle, neighbours[i].ExternalEndPoint,
291 InformClientOfNeighbourCompleted,
292 d);
293 }
294 catch (Exception e)
295 {
296 m_log.ErrorFormat(
297 "[REGIONINFO]: Could not resolve external hostname {0} for region {1} ({2}, {3}). {4}",
298 neighbours[i].ExternalHostName,
299 neighbours[i].RegionHandle,
300 neighbours[i].RegionLocX,
301 neighbours[i].RegionLocY,
302 e);
303
304 // FIXME: Okay, even though we've failed, we're still going to throw the exception on,
305 // since I don't know what will happen if we just let the client continue
306
307 // XXX: Well, decided to swallow the exception instead for now. Let us see how that goes.
308 // throw e;
309
310 }
311 }
312 }
313 }
314
315 /// <summary>
316 /// This informs a single neighboring region about agent "avatar".
317 /// Calls an asynchronous method to do so.. so it doesn't lag the sim.
318 /// </summary>
319 public void InformNeighborChildAgent(ScenePresence avatar, RegionInfo region, List<RegionInfo> neighbours)
320 {
321 AgentCircuitData agent = avatar.ControllingClient.RequestClientInfo();
322 agent.BaseFolder = LLUUID.Zero;
323 agent.InventoryFolder = LLUUID.Zero;
324 agent.startpos = new LLVector3(128, 128, 70);
325 agent.child = true;
326
327 InformClientOfNeighbourDelegate d = InformClientOfNeighbourAsync;
328 d.BeginInvoke(avatar, agent, region.RegionHandle, region.ExternalEndPoint,
329 InformClientOfNeighbourCompleted,
330 d);
331 }
332
333 #endregion
334
335 public delegate void InformNeighbourThatRegionUpDelegate(RegionInfo region, ulong regionhandle);
336
134 private void InformNeighborsThatRegionisUpCompleted(IAsyncResult iar) 337 private void InformNeighborsThatRegionisUpCompleted(IAsyncResult iar)
135 { 338 {
136 InformNeighbourThatRegionUpDelegate icon = (InformNeighbourThatRegionUpDelegate) iar.AsyncState; 339 InformNeighbourThatRegionUpDelegate icon = (InformNeighbourThatRegionUpDelegate) iar.AsyncState;
@@ -187,6 +390,8 @@ namespace OpenSim.Region.Environment.Scenes
187 //bool val = m_commsProvider.InterRegion.RegionUp(new SearializableRegionInfo(region)); 390 //bool val = m_commsProvider.InterRegion.RegionUp(new SearializableRegionInfo(region));
188 } 391 }
189 392
393 public delegate void SendChildAgentDataUpdateDelegate(ChildAgentDataUpdate cAgentData, ScenePresence presence);
394
190 /// <summary> 395 /// <summary>
191 /// This informs all neighboring regions about the settings of it's child agent. 396 /// This informs all neighboring regions about the settings of it's child agent.
192 /// Calls an asynchronous method to do so.. so it doesn't lag the sim. 397 /// Calls an asynchronous method to do so.. so it doesn't lag the sim.
@@ -217,6 +422,7 @@ namespace OpenSim.Region.Environment.Scenes
217 { 422 {
218 // We're ignoring a collection was modified error because this data gets old and outdated fast. 423 // We're ignoring a collection was modified error because this data gets old and outdated fast.
219 } 424 }
425
220 } 426 }
221 427
222 private void SendChildAgentDataUpdateCompleted(IAsyncResult iar) 428 private void SendChildAgentDataUpdateCompleted(IAsyncResult iar)
@@ -229,17 +435,20 @@ namespace OpenSim.Region.Environment.Scenes
229 { 435 {
230 // This assumes that we know what our neighbors are. 436 // This assumes that we know what our neighbors are.
231 SendChildAgentDataUpdateDelegate d = SendChildAgentDataUpdateAsync; 437 SendChildAgentDataUpdateDelegate d = SendChildAgentDataUpdateAsync;
232 d.BeginInvoke(cAgentData, presence, 438 d.BeginInvoke(cAgentData,presence,
233 SendChildAgentDataUpdateCompleted, 439 SendChildAgentDataUpdateCompleted,
234 d); 440 d);
235 } 441 }
236 442
443 public delegate void SendCloseChildAgentDelegate( LLUUID agentID, List<ulong> regionlst);
444
237 /// <summary> 445 /// <summary>
238 /// This Closes child agents on neighboring regions 446 /// This Closes child agents on neighboring regions
239 /// Calls an asynchronous method to do so.. so it doesn't lag the sim. 447 /// Calls an asynchronous method to do so.. so it doesn't lag the sim.
240 /// </summary> 448 /// </summary>
241 private void SendCloseChildAgentAsync(LLUUID agentID, List<ulong> regionlst) 449 private void SendCloseChildAgentAsync(LLUUID agentID, List<ulong> regionlst)
242 { 450 {
451
243 foreach (ulong regionHandle in regionlst) 452 foreach (ulong regionHandle in regionlst)
244 { 453 {
245 bool regionAccepted = m_commsProvider.InterRegion.TellRegionToCloseChildConnection(regionHandle, agentID); 454 bool regionAccepted = m_commsProvider.InterRegion.TellRegionToCloseChildConnection(regionHandle, agentID);
@@ -247,11 +456,14 @@ namespace OpenSim.Region.Environment.Scenes
247 if (regionAccepted) 456 if (regionAccepted)
248 { 457 {
249 m_log.Info("[INTERGRID]: Completed sending agent Close agent Request to neighbor"); 458 m_log.Info("[INTERGRID]: Completed sending agent Close agent Request to neighbor");
459
250 } 460 }
251 else 461 else
252 { 462 {
253 m_log.Info("[INTERGRID]: Failed sending agent Close agent Request to neighbor"); 463 m_log.Info("[INTERGRID]: Failed sending agent Close agent Request to neighbor");
464
254 } 465 }
466
255 } 467 }
256 // We remove the list of known regions from the agent's known region list through an event 468 // We remove the list of known regions from the agent's known region list through an event
257 // to scene, because, if an agent logged of, it's likely that there will be no scene presence 469 // to scene, because, if an agent logged of, it's likely that there will be no scene presence
@@ -265,7 +477,7 @@ namespace OpenSim.Region.Environment.Scenes
265 477
266 private void SendCloseChildAgentCompleted(IAsyncResult iar) 478 private void SendCloseChildAgentCompleted(IAsyncResult iar)
267 { 479 {
268 SendCloseChildAgentDelegate icon = (SendCloseChildAgentDelegate) iar.AsyncState; 480 SendCloseChildAgentDelegate icon = (SendCloseChildAgentDelegate)iar.AsyncState;
269 icon.EndInvoke(iar); 481 icon.EndInvoke(iar);
270 } 482 }
271 483
@@ -344,28 +556,28 @@ namespace OpenSim.Region.Environment.Scenes
344 // assume local regions are always up 556 // assume local regions are always up
345 destRegionUp = true; 557 destRegionUp = true;
346 } 558 }
347 if (destRegionUp) 559 if(destRegionUp)
348 { 560 {
349 avatar.Close(); 561 avatar.Close();
350 562
351 // Compared to ScenePresence.CrossToNewRegion(), there's no obvious code to handle a teleport 563 // Compared to ScenePresence.CrossToNewRegion(), there's no obvious code to handle a teleport
352 // failure at this point (unlike a border crossing failure). So perhaps this can never fail 564 // failure at this point (unlike a border crossing failure). So perhaps this can never fail
353 // once we reach here... 565 // once we reach here...
354 avatar.Scene.RemoveCapsHandler(avatar.UUID); 566 avatar.Scene.RemoveCapsHandler(avatar.UUID);
355 567
356 m_commsProvider.InterRegion.InformRegionOfChildAgent(regionHandle, agent); 568 m_commsProvider.InterRegion.InformRegionOfChildAgent(regionHandle, agent);
357 m_commsProvider.InterRegion.ExpectAvatarCrossing(regionHandle, avatar.ControllingClient.AgentId, 569 m_commsProvider.InterRegion.ExpectAvatarCrossing(regionHandle, avatar.ControllingClient.AgentId,
358 position, false); 570 position, false);
359 AgentCircuitData circuitdata = avatar.ControllingClient.RequestClientInfo(); 571 AgentCircuitData circuitdata = avatar.ControllingClient.RequestClientInfo();
360 572
361 // TODO Should construct this behind a method 573 // TODO Should construct this behind a method
362 string capsPath = 574 string capsPath =
363 "http://" + reg.ExternalHostName + ":" + reg.HttpPort 575 "http://" + reg.ExternalHostName + ":" + reg.HttpPort
364 + "/CAPS/" + circuitdata.CapsPath + "0000/"; 576 + "/CAPS/" + circuitdata.CapsPath + "0000/";
365 577
366 m_log.DebugFormat( 578 m_log.DebugFormat(
367 "[CAPS]: Sending new CAPS seed url {0} to client {1}", capsPath, avatar.UUID); 579 "[CAPS]: Sending new CAPS seed url {0} to client {1}", capsPath, avatar.UUID);
368 580
369 avatar.ControllingClient.SendRegionTeleport(regionHandle, 13, reg.ExternalEndPoint, 4, (1 << 4), 581 avatar.ControllingClient.SendRegionTeleport(regionHandle, 13, reg.ExternalEndPoint, 4, (1 << 4),
370 capsPath); 582 capsPath);
371 avatar.MakeChildAgent(); 583 avatar.MakeChildAgent();
@@ -375,13 +587,13 @@ namespace OpenSim.Region.Environment.Scenes
375 { 587 {
376 KillObject(avatar.LocalId); 588 KillObject(avatar.LocalId);
377 } 589 }
378 uint newRegionX = (uint) (regionHandle >> 40); 590 uint newRegionX = (uint)(regionHandle >> 40);
379 uint newRegionY = (((uint) (regionHandle)) >> 8); 591 uint newRegionY = (((uint)(regionHandle)) >> 8);
380 uint oldRegionX = (uint) (m_regionInfo.RegionHandle >> 40); 592 uint oldRegionX = (uint)(m_regionInfo.RegionHandle >> 40);
381 uint oldRegionY = (((uint) (m_regionInfo.RegionHandle)) >> 8); 593 uint oldRegionY = (((uint)(m_regionInfo.RegionHandle)) >> 8);
382 if (Util.fast_distance2d((int) (newRegionX - oldRegionX), (int) (newRegionY - oldRegionY)) > 3) 594 if (Util.fast_distance2d((int)(newRegionX - oldRegionX), (int)(newRegionY - oldRegionY)) > 3)
383 { 595 {
384 SendCloseChildAgentConnections(avatar.UUID, avatar.GetKnownRegionList()); 596 SendCloseChildAgentConnections(avatar.UUID,avatar.GetKnownRegionList());
385 } 597 }
386 } 598 }
387 else 599 else
@@ -416,7 +628,7 @@ namespace OpenSim.Region.Environment.Scenes
416 628
417 public void LogOffUser(LLUUID userid, LLUUID regionid, ulong regionhandle, float posx, float posy, float posz) 629 public void LogOffUser(LLUUID userid, LLUUID regionid, ulong regionhandle, float posx, float posy, float posz)
418 { 630 {
419 m_commsProvider.LogOffUser(userid, regionid, regionhandle, posx, posy, posz); 631 m_commsProvider.LogOffUser(userid, regionid, regionhandle, posx, posy, posz);
420 } 632 }
421 633
422 public void ClearUserAgent(LLUUID avatarID) 634 public void ClearUserAgent(LLUUID avatarID)
@@ -444,7 +656,7 @@ namespace OpenSim.Region.Environment.Scenes
444 return m_commsProvider.GetUserFriendList(friendlistowner); 656 return m_commsProvider.GetUserFriendList(friendlistowner);
445 } 657 }
446 658
447 public List<MapBlockData> RequestNeighbourMapBlocks(int minX, int minY, int maxX, int maxY) 659 public List<MapBlockData> RequestNeighbourMapBlocks(int minX, int minY, int maxX, int maxY)
448 { 660 {
449 return m_commsProvider.GridService.RequestNeighbourMapBlocks(minX, minY, maxX, maxY); 661 return m_commsProvider.GridService.RequestNeighbourMapBlocks(minX, minY, maxX, maxY);
450 } 662 }
@@ -453,213 +665,5 @@ namespace OpenSim.Region.Environment.Scenes
453 { 665 {
454 return m_commsProvider.GenerateAgentPickerRequestResponse(queryID, query); 666 return m_commsProvider.GenerateAgentPickerRequestResponse(queryID, query);
455 } 667 }
456
457 #region CommsManager Event handlers
458
459 /// <summary>
460 ///
461 /// </summary>
462 /// <param name="regionHandle"></param>
463 /// <param name="agent"></param>
464 ///
465 protected void NewUserConnection(ulong regionHandle, AgentCircuitData agent)
466 {
467 handlerExpectUser = OnExpectUser;
468 if (handlerExpectUser != null)
469 {
470 //m_log.Info("[INTER]: " + debugRegionName + ": SceneCommunicationService: OnExpectUser Fired for User:" + agent.firstname + " " + agent.lastname);
471 handlerExpectUser(regionHandle, agent);
472 }
473 }
474
475 protected bool newRegionUp(RegionInfo region)
476 {
477 handlerRegionUp = OnRegionUp;
478 if (handlerRegionUp != null)
479 {
480 //m_log.Info("[INTER]: " + debugRegionName + ": SceneCommunicationService: newRegionUp Fired for User:" + region.RegionName);
481 handlerRegionUp(region);
482 }
483 return true;
484 }
485
486 protected bool ChildAgentUpdate(ulong regionHandle, ChildAgentDataUpdate cAgentData)
487 {
488 handlerChildAgentUpdate = OnChildAgentUpdate;
489 if (handlerChildAgentUpdate != null)
490 handlerChildAgentUpdate(regionHandle, cAgentData);
491
492
493 return true;
494 }
495
496 protected void AgentCrossing(ulong regionHandle, LLUUID agentID, LLVector3 position, bool isFlying)
497 {
498 handlerAvatarCrossingIntoRegion = OnAvatarCrossingIntoRegion;
499 if (handlerAvatarCrossingIntoRegion != null)
500 {
501 handlerAvatarCrossingIntoRegion(regionHandle, agentID, position, isFlying);
502 }
503 }
504
505 protected bool IncomingPrimCrossing(ulong regionHandle, LLUUID primID, String objXMLData, int XMLMethod)
506 {
507 handlerExpectPrim = OnExpectPrim;
508 if (handlerExpectPrim != null)
509 {
510 return handlerExpectPrim(regionHandle, primID, objXMLData, XMLMethod);
511 }
512 else
513 {
514 return false;
515 }
516 }
517
518 protected void PrimCrossing(ulong regionHandle, LLUUID primID, LLVector3 position, bool isPhysical)
519 {
520 handlerPrimCrossingIntoRegion = OnPrimCrossingIntoRegion;
521 if (handlerPrimCrossingIntoRegion != null)
522 {
523 handlerPrimCrossingIntoRegion(regionHandle, primID, position, isPhysical);
524 }
525 }
526
527 protected bool CloseConnection(ulong regionHandle, LLUUID agentID)
528 {
529 m_log.Info("[INTERREGION]: Incoming Agent Close Request for agent: " + agentID);
530 handlerCloseAgentConnection = OnCloseAgentConnection;
531 if (handlerCloseAgentConnection != null)
532 {
533 return handlerCloseAgentConnection(regionHandle, agentID);
534 }
535 return false;
536 }
537
538 #endregion
539
540 #region Inform Client of Neighbours
541
542 private void InformClientOfNeighbourCompleted(IAsyncResult iar)
543 {
544 InformClientOfNeighbourDelegate icon = (InformClientOfNeighbourDelegate) iar.AsyncState;
545 icon.EndInvoke(iar);
546 }
547
548 /// <summary>
549 /// Async compnent for informing client of which neighbours exists
550 /// </summary>
551 /// <remarks>
552 /// This needs to run asynchronesously, as a network timeout may block the thread for a long while
553 /// </remarks>
554 /// <param name="remoteClient"></param>
555 /// <param name="a"></param>
556 /// <param name="regionHandle"></param>
557 /// <param name="endPoint"></param>
558 private void InformClientOfNeighbourAsync(ScenePresence avatar, AgentCircuitData a, ulong regionHandle,
559 IPEndPoint endPoint)
560 {
561 m_log.Info("[INTERGRID]: Starting to inform client about neighbours");
562 bool regionAccepted = m_commsProvider.InterRegion.InformRegionOfChildAgent(regionHandle, a);
563
564 if (regionAccepted)
565 {
566 avatar.ControllingClient.InformClientOfNeighbour(regionHandle, endPoint);
567 avatar.AddNeighbourRegion(regionHandle);
568 m_log.Info("[INTERGRID]: Completed inform client about neighbours");
569 }
570 }
571
572 public void RequestNeighbors(RegionInfo region)
573 {
574 List<SimpleRegionInfo> neighbours =
575 m_commsProvider.GridService.RequestNeighbours(m_regionInfo.RegionLocX, m_regionInfo.RegionLocY);
576 //IPEndPoint blah = new IPEndPoint();
577
578 //blah.Address = region.RemotingAddress;
579 //blah.Port = region.RemotingPort;
580 }
581
582 /// <summary>
583 /// This informs all neighboring regions about agent "avatar".
584 /// Calls an asynchronous method to do so.. so it doesn't lag the sim.
585 /// </summary>
586 public void EnableNeighbourChildAgents(ScenePresence avatar, List<RegionInfo> lstneighbours)
587 {
588 List<SimpleRegionInfo> neighbours = new List<SimpleRegionInfo>();
589
590 //m_commsProvider.GridService.RequestNeighbours(m_regionInfo.RegionLocX, m_regionInfo.RegionLocY);
591 for (int i = 0; i < lstneighbours.Count; i++)
592 {
593 // We don't want to keep sending to regions that consistently fail on comms.
594 if (!(lstneighbours[i].commFailTF))
595 {
596 neighbours.Add(new SimpleRegionInfo(lstneighbours[i]));
597 }
598 }
599 // we're going to be using the above code once neighbour cache is correct. Currently it doesn't appear to be
600 // So we're temporarily going back to the old method of grabbing it from the Grid Server Every time :/
601 neighbours =
602 m_commsProvider.GridService.RequestNeighbours(m_regionInfo.RegionLocX, m_regionInfo.RegionLocY);
603
604 if (neighbours != null)
605 {
606 for (int i = 0; i < neighbours.Count; i++)
607 {
608 AgentCircuitData agent = avatar.ControllingClient.RequestClientInfo();
609 agent.BaseFolder = LLUUID.Zero;
610 agent.InventoryFolder = LLUUID.Zero;
611 agent.startpos = new LLVector3(128, 128, 70);
612 agent.child = true;
613
614 InformClientOfNeighbourDelegate d = InformClientOfNeighbourAsync;
615
616 try
617 {
618 d.BeginInvoke(avatar, agent, neighbours[i].RegionHandle, neighbours[i].ExternalEndPoint,
619 InformClientOfNeighbourCompleted,
620 d);
621 }
622 catch (Exception e)
623 {
624 m_log.ErrorFormat(
625 "[REGIONINFO]: Could not resolve external hostname {0} for region {1} ({2}, {3}). {4}",
626 neighbours[i].ExternalHostName,
627 neighbours[i].RegionHandle,
628 neighbours[i].RegionLocX,
629 neighbours[i].RegionLocY,
630 e);
631
632 // FIXME: Okay, even though we've failed, we're still going to throw the exception on,
633 // since I don't know what will happen if we just let the client continue
634
635 // XXX: Well, decided to swallow the exception instead for now. Let us see how that goes.
636 // throw e;
637 }
638 }
639 }
640 }
641
642 /// <summary>
643 /// This informs a single neighboring region about agent "avatar".
644 /// Calls an asynchronous method to do so.. so it doesn't lag the sim.
645 /// </summary>
646 public void InformNeighborChildAgent(ScenePresence avatar, RegionInfo region, List<RegionInfo> neighbours)
647 {
648 AgentCircuitData agent = avatar.ControllingClient.RequestClientInfo();
649 agent.BaseFolder = LLUUID.Zero;
650 agent.InventoryFolder = LLUUID.Zero;
651 agent.startpos = new LLVector3(128, 128, 70);
652 agent.child = true;
653
654 InformClientOfNeighbourDelegate d = InformClientOfNeighbourAsync;
655 d.BeginInvoke(avatar, agent, region.RegionHandle, region.ExternalEndPoint,
656 InformClientOfNeighbourCompleted,
657 d);
658 }
659
660 private delegate void InformClientOfNeighbourDelegate(
661 ScenePresence avatar, AgentCircuitData a, ulong regionHandle, IPEndPoint endPoint);
662
663 #endregion
664 } 668 }
665} \ No newline at end of file 669}
diff --git a/OpenSim/Region/Environment/Scenes/SceneEvents.cs b/OpenSim/Region/Environment/Scenes/SceneEvents.cs
index 297d796..002fc5d 100644
--- a/OpenSim/Region/Environment/Scenes/SceneEvents.cs
+++ b/OpenSim/Region/Environment/Scenes/SceneEvents.cs
@@ -38,186 +38,236 @@ namespace OpenSim.Region.Environment.Scenes
38 /// </summary> 38 /// </summary>
39 public class EventManager 39 public class EventManager
40 { 40 {
41 #region Delegates 41 public delegate void OnFrameDelegate();
42
43 public delegate void AvatarEnteringNewParcel(ScenePresence avatar, int localLandID, LLUUID regionID);
44 42
45 public delegate void ClientClosed(LLUUID clientID); 43 public event OnFrameDelegate OnFrame;
46 44
47 public delegate void ClientMovement(ScenePresence client); 45 public delegate void ClientMovement(ScenePresence client);
48 46
49 /// <summary> 47 public event ClientMovement OnClientMovement;
50 /// DeregisterCapsEvent is called by Scene when the caps
51 /// handler for an agent are removed.
52 /// </summary>
53 public delegate void DeregisterCapsEvent(LLUUID agentID, Caps caps);
54
55 public delegate void LandBuy(Object sender, LandBuyArgs e);
56
57 public delegate void LandObjectAdded(ILandObject newParcel);
58
59 public delegate void LandObjectRemoved(LLUUID globalID);
60
61 public delegate void MoneyTransferEvent(Object sender, MoneyTransferArgs e);
62
63 public delegate void NewGridInstantMessage(GridInstantMessage message);
64
65 public delegate void NewInventoryItemUploadComplete(LLUUID avatarID, LLUUID assetID, string name, int userlevel);
66
67 public delegate void NewRezScript(uint localID, LLUUID itemID, string script);
68 48
69 public delegate void ObjectDeGrabDelegate(uint localID, IClientAPI remoteClient); 49 public delegate void OnTerrainTickDelegate();
70 50
71 public delegate void ObjectGrabDelegate(uint localID, LLVector3 offsetPos, IClientAPI remoteClient); 51 public event OnTerrainTickDelegate OnTerrainTick;
72 52
73 public delegate void OnBackupDelegate(IRegionDataStore datastore); 53 public delegate void OnBackupDelegate(IRegionDataStore datastore);
74 54
75 public delegate void OnFrameDelegate(); 55 public event OnBackupDelegate OnBackup;
76 56
77 public delegate void OnNewClientDelegate(IClientAPI client); 57 public delegate void OnNewClientDelegate(IClientAPI client);
78 58
79 public delegate void OnNewPresenceDelegate(ScenePresence presence); 59 public event OnNewClientDelegate OnNewClient;
80
81 public delegate void OnParcelPrimCountAddDelegate(SceneObjectGroup obj);
82
83 public delegate void OnParcelPrimCountUpdateDelegate();
84 60
85 public delegate void OnPermissionErrorDelegate(LLUUID user, string reason); 61 public delegate void OnNewPresenceDelegate(ScenePresence presence);
86 62
87 public delegate void OnPluginConsoleDelegate(string[] args); 63 public event OnNewPresenceDelegate OnNewPresence;
88 64
89 public delegate void OnRemovePresenceDelegate(LLUUID agentId); 65 public delegate void OnRemovePresenceDelegate(LLUUID agentId);
90 66
91 public delegate void OnShutdownDelegate(); 67 public event OnRemovePresenceDelegate OnRemovePresence;
92
93 public delegate void OnTerrainTickDelegate();
94
95 /// <summary>
96 /// RegisterCapsEvent is called by Scene after the Caps object
97 /// has been instantiated and before it is return to the
98 /// client and provides region modules to add their caps.
99 /// </summary>
100 public delegate void RegisterCapsEvent(LLUUID agentID, Caps caps);
101
102 public delegate void RemoveScript(uint localID, LLUUID itemID);
103
104 public delegate void SceneGroupGrabed(LLUUID groupID, LLVector3 offset, LLUUID userID);
105
106 public delegate bool SceneGroupMoved(LLUUID groupID, LLVector3 delta);
107
108 public delegate void ScriptAtTargetEvent(uint localID, uint handle, LLVector3 targetpos, LLVector3 atpos);
109
110 public delegate void ScriptChangedEvent(uint localID, uint change);
111
112 public delegate void ScriptNotAtTargetEvent(uint localID);
113
114 #endregion
115
116 private AvatarEnteringNewParcel handlerAvatarEnteringNewParcel; //OnAvatarEnteringNewParcel;
117 private OnBackupDelegate handlerBackup; //OnBackup;
118 private ClientClosed handlerClientClosed; //OnClientClosed;
119 private ClientMovement handlerClientMovement; //OnClientMovement;
120 private DeregisterCapsEvent handlerDeregisterCaps; // OnDeregisterCaps;
121 private OnFrameDelegate handlerFrame; //OnFrame;
122 private NewGridInstantMessage handlerGridInstantMessageToFriends; //OnGridInstantMessageToFriendsModule;
123 private NewGridInstantMessage handlerGridInstantMessageToIM; //OnGridInstantMessageToIMModule;
124 private LandBuy handlerLandBuy;
125 private LandObjectAdded handlerLandObjectAdded; //OnLandObjectAdded;
126 private LandObjectRemoved handlerLandObjectRemoved; //OnLandObjectRemoved;
127 private OnNewPresenceDelegate handlerMakeChildAgent; //OnMakeChildAgent;
128 private MoneyTransferEvent handlerMoneyTransfer; //OnMoneyTransfer;
129 private OnNewClientDelegate handlerNewClient; //OnNewClient;
130 private NewInventoryItemUploadComplete handlerNewInventoryItemUpdateComplete;
131 private OnNewPresenceDelegate handlerNewPresence; //OnNewPresence;
132 private ObjectDeGrabDelegate handlerObjectDeGrab; //OnObjectDeGrab;
133 private ObjectGrabDelegate handlerObjectGrab; //OnObjectGrab;
134 private OnParcelPrimCountAddDelegate handlerParcelPrimCountAdd; //OnParcelPrimCountAdd;
135 private OnParcelPrimCountUpdateDelegate handlerParcelPrimCountUpdate; //OnParcelPrimCountUpdate;
136 private OnPermissionErrorDelegate handlerPermissionError; //OnPermissionError;
137 private OnPluginConsoleDelegate handlerPluginConsole; //OnPluginConsole;
138 private RegisterCapsEvent handlerRegisterCaps; // OnRegisterCaps;
139 private OnRemovePresenceDelegate handlerRemovePresence; //OnRemovePresence;
140 private RemoveScript handlerRemoveScript; //OnRemoveScript;
141 private NewRezScript handlerRezScript; //OnRezScript;
142 private SceneGroupGrabed handlerSceneGroupGrab; //OnSceneGroupGrab;
143 private SceneGroupMoved handlerSceneGroupMove; //OnSceneGroupMove;
144 private ScriptAtTargetEvent handlerScriptAtTargetEvent;
145 private ScriptChangedEvent handlerScriptChangedEvent; //OnScriptChangedEvent;
146 private ScriptNotAtTargetEvent handlerScriptNotAtTargetEvent;
147 private OnShutdownDelegate handlerShutdown; //OnShutdown;
148 private OnTerrainTickDelegate handlerTerrainTick; // OnTerainTick;
149 private LandBuy handlerValidateLandBuy;
150
151 public event OnFrameDelegate OnFrame;
152 68
153 public event ClientMovement OnClientMovement; 69 public delegate void OnParcelPrimCountUpdateDelegate();
154 70
155 public event OnTerrainTickDelegate OnTerrainTick; 71 public event OnParcelPrimCountUpdateDelegate OnParcelPrimCountUpdate;
156 72
157 public event OnBackupDelegate OnBackup; 73 public delegate void OnParcelPrimCountAddDelegate(SceneObjectGroup obj);
158 74
159 public event OnNewClientDelegate OnNewClient; 75 public event OnParcelPrimCountAddDelegate OnParcelPrimCountAdd;
160 76
161 public event OnNewPresenceDelegate OnNewPresence; 77 public delegate void OnPluginConsoleDelegate(string[] args);
162 78
163 public event OnRemovePresenceDelegate OnRemovePresence; 79 public event OnPluginConsoleDelegate OnPluginConsole;
164 80
165 public event OnParcelPrimCountUpdateDelegate OnParcelPrimCountUpdate; 81 public delegate void OnShutdownDelegate();
166 82
167 public event OnParcelPrimCountAddDelegate OnParcelPrimCountAdd; 83 public event OnShutdownDelegate OnShutdown;
168 84
169 public event OnPluginConsoleDelegate OnPluginConsole; 85 public delegate void ObjectGrabDelegate(uint localID, LLVector3 offsetPos, IClientAPI remoteClient);
86 public delegate void ObjectDeGrabDelegate(uint localID, IClientAPI remoteClient);
170 87
171 public event OnShutdownDelegate OnShutdown; 88 public delegate void OnPermissionErrorDelegate(LLUUID user, string reason);
172 89
173 public event ObjectGrabDelegate OnObjectGrab; 90 public event ObjectGrabDelegate OnObjectGrab;
174 public event ObjectDeGrabDelegate OnObjectDeGrab; 91 public event ObjectDeGrabDelegate OnObjectDeGrab;
175 92
176 public event OnPermissionErrorDelegate OnPermissionError; 93 public event OnPermissionErrorDelegate OnPermissionError;
177 94
95 public delegate void NewRezScript(uint localID, LLUUID itemID, string script);
96
178 public event NewRezScript OnRezScript; 97 public event NewRezScript OnRezScript;
179 98
99 public delegate void RemoveScript(uint localID, LLUUID itemID);
100
180 public event RemoveScript OnRemoveScript; 101 public event RemoveScript OnRemoveScript;
181 102
103 public delegate bool SceneGroupMoved(LLUUID groupID, LLVector3 delta);
104
182 public event SceneGroupMoved OnSceneGroupMove; 105 public event SceneGroupMoved OnSceneGroupMove;
183 106
107 public delegate void SceneGroupGrabed(LLUUID groupID, LLVector3 offset, LLUUID userID);
108
184 public event SceneGroupGrabed OnSceneGroupGrab; 109 public event SceneGroupGrabed OnSceneGroupGrab;
185 110
111 public delegate void LandObjectAdded(ILandObject newParcel);
112
186 public event LandObjectAdded OnLandObjectAdded; 113 public event LandObjectAdded OnLandObjectAdded;
187 114
115 public delegate void LandObjectRemoved(LLUUID globalID);
116
188 public event LandObjectRemoved OnLandObjectRemoved; 117 public event LandObjectRemoved OnLandObjectRemoved;
189 118
119 public delegate void AvatarEnteringNewParcel(ScenePresence avatar, int localLandID, LLUUID regionID);
120
190 public event AvatarEnteringNewParcel OnAvatarEnteringNewParcel; 121 public event AvatarEnteringNewParcel OnAvatarEnteringNewParcel;
191 122
192 123
124 public delegate void NewGridInstantMessage(GridInstantMessage message);
125
193 public event NewGridInstantMessage OnGridInstantMessageToIMModule; 126 public event NewGridInstantMessage OnGridInstantMessageToIMModule;
194 127
195 public event NewGridInstantMessage OnGridInstantMessageToFriendsModule; 128 public event NewGridInstantMessage OnGridInstantMessageToFriendsModule;
196 129
197 public event NewGridInstantMessage OnGridInstantMessageToGroupsModule; 130 public event NewGridInstantMessage OnGridInstantMessageToGroupsModule;
198 131
132 public delegate void ClientClosed(LLUUID clientID);
133
199 public event ClientClosed OnClientClosed; 134 public event ClientClosed OnClientClosed;
200 135
136 public delegate void ScriptChangedEvent(uint localID, uint change);
137
201 public event ScriptChangedEvent OnScriptChangedEvent; 138 public event ScriptChangedEvent OnScriptChangedEvent;
202 139
140 public delegate void ScriptAtTargetEvent(uint localID, uint handle, LLVector3 targetpos, LLVector3 atpos);
141
203 public event ScriptAtTargetEvent OnScriptAtTargetEvent; 142 public event ScriptAtTargetEvent OnScriptAtTargetEvent;
204 143
144 public delegate void ScriptNotAtTargetEvent(uint localID);
145
205 public event ScriptNotAtTargetEvent OnScriptNotAtTargetEvent; 146 public event ScriptNotAtTargetEvent OnScriptNotAtTargetEvent;
206 147
207 public event OnNewPresenceDelegate OnMakeChildAgent; 148 public event OnNewPresenceDelegate OnMakeChildAgent;
208 149
150 public delegate void NewInventoryItemUploadComplete(LLUUID avatarID, LLUUID assetID, string name, int userlevel);
151
209 public event NewInventoryItemUploadComplete OnNewInventoryItemUploadComplete; 152 public event NewInventoryItemUploadComplete OnNewInventoryItemUploadComplete;
210 153
154 /// <summary>
155 /// RegisterCapsEvent is called by Scene after the Caps object
156 /// has been instantiated and before it is return to the
157 /// client and provides region modules to add their caps.
158 /// </summary>
159 public delegate void RegisterCapsEvent(LLUUID agentID, Caps caps);
211 public event RegisterCapsEvent OnRegisterCaps; 160 public event RegisterCapsEvent OnRegisterCaps;
212 161 /// <summary>
162 /// DeregisterCapsEvent is called by Scene when the caps
163 /// handler for an agent are removed.
164 /// </summary>
165 public delegate void DeregisterCapsEvent(LLUUID agentID, Caps caps);
213 public event DeregisterCapsEvent OnDeregisterCaps; 166 public event DeregisterCapsEvent OnDeregisterCaps;
214 167
168 public class MoneyTransferArgs : EventArgs
169 {
170 public LLUUID sender;
171 public LLUUID receiver;
172
173 // Always false. The SL protocol sucks.
174 public bool authenticated = false;
175
176 public int amount;
177 public int transactiontype;
178 public string description;
179
180 public MoneyTransferArgs(LLUUID asender, LLUUID areceiver, int aamount, int atransactiontype, string adescription) {
181 sender = asender;
182 receiver = areceiver;
183 amount = aamount;
184 transactiontype = atransactiontype;
185 description = adescription;
186 }
187 }
188
189 public class LandBuyArgs : EventArgs
190 {
191 public LLUUID agentId = LLUUID.Zero;
192
193 public LLUUID groupId = LLUUID.Zero;
194
195 public LLUUID parcelOwnerID = LLUUID.Zero;
196
197 public bool final = false;
198 public bool groupOwned = false;
199 public bool removeContribution = false;
200 public int parcelLocalID = 0;
201 public int parcelArea = 0;
202 public int parcelPrice = 0;
203 public bool authenticated = false;
204 public bool landValidated = false;
205 public bool economyValidated = false;
206 public int transactionID = 0;
207 public int amountDebited = 0;
208
209
210 public LandBuyArgs(LLUUID pagentId, LLUUID pgroupId, bool pfinal, bool pgroupOwned,
211 bool premoveContribution, int pparcelLocalID, int pparcelArea, int pparcelPrice,
212 bool pauthenticated)
213 {
214 agentId = pagentId;
215 groupId = pgroupId;
216 final = pfinal;
217 groupOwned = pgroupOwned;
218 removeContribution = premoveContribution;
219 parcelLocalID = pparcelLocalID;
220 parcelArea = pparcelArea;
221 parcelPrice = pparcelPrice;
222 authenticated = pauthenticated;
223 }
224 }
225
226 public delegate void MoneyTransferEvent(Object sender, MoneyTransferArgs e);
227
228 public delegate void LandBuy(Object sender, LandBuyArgs e);
229
215 public event MoneyTransferEvent OnMoneyTransfer; 230 public event MoneyTransferEvent OnMoneyTransfer;
216 public event LandBuy OnLandBuy; 231 public event LandBuy OnLandBuy;
217 public event LandBuy OnValidateLandBuy; 232 public event LandBuy OnValidateLandBuy;
218 233
219 /* Designated Event Deletage Instances */ 234 /* Designated Event Deletage Instances */
220 235
236 private ScriptChangedEvent handlerScriptChangedEvent = null; //OnScriptChangedEvent;
237 private ScriptAtTargetEvent handlerScriptAtTargetEvent = null;
238 private ScriptNotAtTargetEvent handlerScriptNotAtTargetEvent = null;
239 private ClientMovement handlerClientMovement = null; //OnClientMovement;
240 private OnPermissionErrorDelegate handlerPermissionError = null; //OnPermissionError;
241 private OnPluginConsoleDelegate handlerPluginConsole = null; //OnPluginConsole;
242 private OnFrameDelegate handlerFrame = null; //OnFrame;
243 private OnNewClientDelegate handlerNewClient = null; //OnNewClient;
244 private OnNewPresenceDelegate handlerNewPresence = null; //OnNewPresence;
245 private OnRemovePresenceDelegate handlerRemovePresence = null; //OnRemovePresence;
246 private OnBackupDelegate handlerBackup = null; //OnBackup;
247 private OnParcelPrimCountUpdateDelegate handlerParcelPrimCountUpdate = null; //OnParcelPrimCountUpdate;
248 private MoneyTransferEvent handlerMoneyTransfer = null; //OnMoneyTransfer;
249 private OnParcelPrimCountAddDelegate handlerParcelPrimCountAdd = null; //OnParcelPrimCountAdd;
250 private OnShutdownDelegate handlerShutdown = null; //OnShutdown;
251 private ObjectGrabDelegate handlerObjectGrab = null; //OnObjectGrab;
252 private ObjectDeGrabDelegate handlerObjectDeGrab = null; //OnObjectDeGrab;
253 private NewRezScript handlerRezScript = null; //OnRezScript;
254 private RemoveScript handlerRemoveScript = null; //OnRemoveScript;
255 private SceneGroupMoved handlerSceneGroupMove = null; //OnSceneGroupMove;
256 private SceneGroupGrabed handlerSceneGroupGrab = null; //OnSceneGroupGrab;
257 private LandObjectAdded handlerLandObjectAdded = null; //OnLandObjectAdded;
258 private LandObjectRemoved handlerLandObjectRemoved = null; //OnLandObjectRemoved;
259 private AvatarEnteringNewParcel handlerAvatarEnteringNewParcel = null; //OnAvatarEnteringNewParcel;
260 private NewGridInstantMessage handlerGridInstantMessageToIM = null; //OnGridInstantMessageToIMModule;
261 private NewGridInstantMessage handlerGridInstantMessageToFriends = null; //OnGridInstantMessageToFriendsModule;
262 private ClientClosed handlerClientClosed = null; //OnClientClosed;
263 private OnNewPresenceDelegate handlerMakeChildAgent = null; //OnMakeChildAgent;
264 private OnTerrainTickDelegate handlerTerrainTick = null; // OnTerainTick;
265 private RegisterCapsEvent handlerRegisterCaps = null; // OnRegisterCaps;
266 private DeregisterCapsEvent handlerDeregisterCaps = null; // OnDeregisterCaps;
267 private NewInventoryItemUploadComplete handlerNewInventoryItemUpdateComplete = null;
268 private LandBuy handlerLandBuy = null;
269 private LandBuy handlerValidateLandBuy = null;
270
221 public void TriggerOnScriptChangedEvent(uint localID, uint change) 271 public void TriggerOnScriptChangedEvent(uint localID, uint change)
222 { 272 {
223 handlerScriptChangedEvent = OnScriptChangedEvent; 273 handlerScriptChangedEvent = OnScriptChangedEvent;
@@ -293,7 +343,7 @@ namespace OpenSim.Region.Environment.Scenes
293 if (handlerParcelPrimCountUpdate != null) 343 if (handlerParcelPrimCountUpdate != null)
294 { 344 {
295 handlerParcelPrimCountUpdate(); 345 handlerParcelPrimCountUpdate();
296 } 346 }
297 } 347 }
298 348
299 public void TriggerMoneyTransfer(Object sender, MoneyTransferArgs e) 349 public void TriggerMoneyTransfer(Object sender, MoneyTransferArgs e)
@@ -442,6 +492,7 @@ namespace OpenSim.Region.Environment.Scenes
442 { 492 {
443 handlerGridInstantMessageToFriends(message); 493 handlerGridInstantMessageToFriends(message);
444 } 494 }
495
445 } 496 }
446 } 497 }
447 498
@@ -463,7 +514,7 @@ namespace OpenSim.Region.Environment.Scenes
463 } 514 }
464 } 515 }
465 516
466 public void TriggerOnRegisterCaps(LLUUID agentID, Caps caps) 517 public void TriggerOnRegisterCaps(LLUUID agentID, Caps caps)
467 { 518 {
468 handlerRegisterCaps = OnRegisterCaps; 519 handlerRegisterCaps = OnRegisterCaps;
469 if (handlerRegisterCaps != null) 520 if (handlerRegisterCaps != null)
@@ -472,7 +523,7 @@ namespace OpenSim.Region.Environment.Scenes
472 } 523 }
473 } 524 }
474 525
475 public void TriggerOnDeregisterCaps(LLUUID agentID, Caps caps) 526 public void TriggerOnDeregisterCaps(LLUUID agentID, Caps caps)
476 { 527 {
477 handlerDeregisterCaps = OnDeregisterCaps; 528 handlerDeregisterCaps = OnDeregisterCaps;
478 if (handlerDeregisterCaps != null) 529 if (handlerDeregisterCaps != null)
@@ -489,8 +540,7 @@ namespace OpenSim.Region.Environment.Scenes
489 handlerNewInventoryItemUpdateComplete(agentID, AssetID, AssetName, userlevel); 540 handlerNewInventoryItemUpdateComplete(agentID, AssetID, AssetName, userlevel);
490 } 541 }
491 } 542 }
492 543 public void TriggerLandBuy (Object sender, LandBuyArgs e)
493 public void TriggerLandBuy(Object sender, LandBuyArgs e)
494 { 544 {
495 handlerLandBuy = OnLandBuy; 545 handlerLandBuy = OnLandBuy;
496 if (handlerLandBuy != null) 546 if (handlerLandBuy != null)
@@ -498,7 +548,6 @@ namespace OpenSim.Region.Environment.Scenes
498 handlerLandBuy(sender, e); 548 handlerLandBuy(sender, e);
499 } 549 }
500 } 550 }
501
502 public void TriggerValidateLandBuy(Object sender, LandBuyArgs e) 551 public void TriggerValidateLandBuy(Object sender, LandBuyArgs e)
503 { 552 {
504 handlerValidateLandBuy = OnValidateLandBuy; 553 handlerValidateLandBuy = OnValidateLandBuy;
@@ -507,7 +556,7 @@ namespace OpenSim.Region.Environment.Scenes
507 handlerValidateLandBuy(sender, e); 556 handlerValidateLandBuy(sender, e);
508 } 557 }
509 } 558 }
510 559
511 public void TriggerAtTargetEvent(uint localID, uint handle, LLVector3 targetpos, LLVector3 currentpos) 560 public void TriggerAtTargetEvent(uint localID, uint handle, LLVector3 targetpos, LLVector3 currentpos)
512 { 561 {
513 handlerScriptAtTargetEvent = OnScriptAtTargetEvent; 562 handlerScriptAtTargetEvent = OnScriptAtTargetEvent;
@@ -525,67 +574,5 @@ namespace OpenSim.Region.Environment.Scenes
525 handlerScriptNotAtTargetEvent(localID); 574 handlerScriptNotAtTargetEvent(localID);
526 } 575 }
527 } 576 }
528
529 #region Nested type: LandBuyArgs
530
531 public class LandBuyArgs : EventArgs
532 {
533 public LLUUID agentId = LLUUID.Zero;
534 public int amountDebited;
535 public bool authenticated;
536 public bool economyValidated;
537
538 public bool final;
539 public LLUUID groupId = LLUUID.Zero;
540 public bool groupOwned;
541 public bool landValidated;
542 public int parcelArea;
543 public int parcelLocalID;
544 public LLUUID parcelOwnerID = LLUUID.Zero;
545 public int parcelPrice;
546 public bool removeContribution;
547 public int transactionID;
548
549
550 public LandBuyArgs(LLUUID pagentId, LLUUID pgroupId, bool pfinal, bool pgroupOwned,
551 bool premoveContribution, int pparcelLocalID, int pparcelArea, int pparcelPrice,
552 bool pauthenticated)
553 {
554 agentId = pagentId;
555 groupId = pgroupId;
556 final = pfinal;
557 groupOwned = pgroupOwned;
558 removeContribution = premoveContribution;
559 parcelLocalID = pparcelLocalID;
560 parcelArea = pparcelArea;
561 parcelPrice = pparcelPrice;
562 authenticated = pauthenticated;
563 }
564 }
565
566 #endregion
567
568 #region Nested type: MoneyTransferArgs
569
570 public class MoneyTransferArgs : EventArgs
571 {
572 public int amount;
573 public bool authenticated;
574 public string description;
575 public LLUUID receiver;
576 public LLUUID sender;
577 public int transactiontype;
578
579 public MoneyTransferArgs(LLUUID asender, LLUUID areceiver, int aamount, int atransactiontype, string adescription)
580 {
581 sender = asender;
582 receiver = areceiver;
583 amount = aamount;
584 transactiontype = atransactiontype;
585 description = adescription;
586 }
587 }
588
589 #endregion
590 } 577 }
591} \ No newline at end of file 578}
diff --git a/OpenSim/Region/Environment/Scenes/SceneManager.cs b/OpenSim/Region/Environment/Scenes/SceneManager.cs
index 2325ed4..2dfea2a 100644
--- a/OpenSim/Region/Environment/Scenes/SceneManager.cs
+++ b/OpenSim/Region/Environment/Scenes/SceneManager.cs
@@ -41,13 +41,10 @@ namespace OpenSim.Region.Environment.Scenes
41 { 41 {
42 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 42 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
43 43
44 private readonly List<Scene> m_localScenes; 44 public event RestartSim OnRestartSim;
45 private Scene m_currentScene;
46 45
47 public SceneManager() 46 private readonly List<Scene> m_localScenes;
48 { 47 private Scene m_currentScene = null;
49 m_localScenes = new List<Scene>();
50 }
51 48
52 public List<Scene> Scenes 49 public List<Scene> Scenes
53 { 50 {
@@ -74,7 +71,10 @@ namespace OpenSim.Region.Environment.Scenes
74 } 71 }
75 } 72 }
76 73
77 public event RestartSim OnRestartSim; 74 public SceneManager()
75 {
76 m_localScenes = new List<Scene>();
77 }
78 78
79 public void Close() 79 public void Close()
80 { 80 {
@@ -180,7 +180,7 @@ namespace OpenSim.Region.Environment.Scenes
180 [Obsolete("TODO: Remove this warning by 0.7")] 180 [Obsolete("TODO: Remove this warning by 0.7")]
181 public bool RunTerrainCmdOnCurrentScene(string[] cmdparams, ref string result) 181 public bool RunTerrainCmdOnCurrentScene(string[] cmdparams, ref string result)
182 { 182 {
183 m_log.Warn("DEPRECIATED: The terrain engine has been replaced with a new terrain plugin module. Please type 'plugin terrain help' for new commands."); 183 m_log.Warn("DEPRECIATED: The terrain engine has been replaced with a new terrain plugin module. Please type 'plugin terrain help' for new commands.");
184 return false; 184 return false;
185 } 185 }
186 186
@@ -252,8 +252,8 @@ namespace OpenSim.Region.Environment.Scenes
252 252
253 public bool TrySetCurrentScene(LLUUID regionID) 253 public bool TrySetCurrentScene(LLUUID regionID)
254 { 254 {
255 Console.WriteLine("Searching for Region: '{0}'", regionID); 255 Console.WriteLine("Searching for Region: '{0}'", regionID.ToString());
256 256
257 foreach (Scene scene in m_localScenes) 257 foreach (Scene scene in m_localScenes)
258 { 258 {
259 if (scene.RegionInfo.RegionID == regionID) 259 if (scene.RegionInfo.RegionID == regionID)
@@ -262,7 +262,7 @@ namespace OpenSim.Region.Environment.Scenes
262 return true; 262 return true;
263 } 263 }
264 } 264 }
265 265
266 return false; 266 return false;
267 } 267 }
268 268
@@ -313,7 +313,7 @@ namespace OpenSim.Region.Environment.Scenes
313 { 313 {
314 foreach (Scene mscene in m_localScenes) 314 foreach (Scene mscene in m_localScenes)
315 { 315 {
316 if ((mscene.RegionInfo.InternalEndPoint.Equals(ipEndPoint.Address)) && 316 if((mscene.RegionInfo.InternalEndPoint.Equals(ipEndPoint.Address)) &&
317 (mscene.RegionInfo.InternalEndPoint.Port == ipEndPoint.Port)) 317 (mscene.RegionInfo.InternalEndPoint.Port == ipEndPoint.Port))
318 { 318 {
319 scene = mscene; 319 scene = mscene;
@@ -327,22 +327,22 @@ namespace OpenSim.Region.Environment.Scenes
327 public void SetDebugPacketOnCurrentScene(int newDebug) 327 public void SetDebugPacketOnCurrentScene(int newDebug)
328 { 328 {
329 ForEachCurrentScene(delegate(Scene scene) 329 ForEachCurrentScene(delegate(Scene scene)
330 { 330 {
331 List<ScenePresence> scenePresences = scene.GetScenePresences(); 331 List<ScenePresence> scenePresences = scene.GetScenePresences();
332 332
333 foreach (ScenePresence scenePresence in scenePresences) 333 foreach (ScenePresence scenePresence in scenePresences)
334 {
335 if (!scenePresence.IsChildAgent)
334 { 336 {
335 if (!scenePresence.IsChildAgent) 337 m_log.ErrorFormat("Packet debug for {0} {1} set to {2}",
336 { 338 scenePresence.Firstname,
337 m_log.ErrorFormat("Packet debug for {0} {1} set to {2}", 339 scenePresence.Lastname,
338 scenePresence.Firstname, 340 newDebug);
339 scenePresence.Lastname, 341
340 newDebug); 342 scenePresence.ControllingClient.SetDebug(newDebug);
341
342 scenePresence.ControllingClient.SetDebug(newDebug);
343 }
344 } 343 }
345 }); 344 }
345 });
346 } 346 }
347 347
348 public List<ScenePresence> GetCurrentSceneAvatars() 348 public List<ScenePresence> GetCurrentSceneAvatars()
@@ -350,17 +350,17 @@ namespace OpenSim.Region.Environment.Scenes
350 List<ScenePresence> avatars = new List<ScenePresence>(); 350 List<ScenePresence> avatars = new List<ScenePresence>();
351 351
352 ForEachCurrentScene(delegate(Scene scene) 352 ForEachCurrentScene(delegate(Scene scene)
353 { 353 {
354 List<ScenePresence> scenePresences = scene.GetScenePresences(); 354 List<ScenePresence> scenePresences = scene.GetScenePresences();
355 355
356 foreach (ScenePresence scenePresence in scenePresences) 356 foreach (ScenePresence scenePresence in scenePresences)
357 { 357 {
358 if (!scenePresence.IsChildAgent) 358 if (!scenePresence.IsChildAgent)
359 { 359 {
360 avatars.Add(scenePresence); 360 avatars.Add(scenePresence);
361 } 361 }
362 } 362 }
363 }); 363 });
364 364
365 return avatars; 365 return avatars;
366 } 366 }
@@ -381,11 +381,11 @@ namespace OpenSim.Region.Environment.Scenes
381 public void SetCurrentSceneTimePhase(int timePhase) 381 public void SetCurrentSceneTimePhase(int timePhase)
382 { 382 {
383 ForEachCurrentScene(delegate(Scene scene) 383 ForEachCurrentScene(delegate(Scene scene)
384 { 384 {
385 scene.SetTimePhase( 385 scene.SetTimePhase(
386 timePhase) 386 timePhase)
387 ; 387 ;
388 }); 388 });
389 } 389 }
390 390
391 public void ForceCurrentSceneClientUpdate() 391 public void ForceCurrentSceneClientUpdate()
@@ -453,4 +453,4 @@ namespace OpenSim.Region.Environment.Scenes
453 m_localScenes.ForEach(action); 453 m_localScenes.ForEach(action);
454 } 454 }
455 } 455 }
456} \ No newline at end of file 456}
diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.Inventory.cs b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.Inventory.cs
index d051ed9..824a536 100644
--- a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.Inventory.cs
+++ b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.Inventory.cs
@@ -49,6 +49,7 @@ namespace OpenSim.Region.Environment.Scenes
49 if (part != null) 49 if (part != null)
50 { 50 {
51 part.StartScript(itemID); 51 part.StartScript(itemID);
52
52 } 53 }
53 else 54 else
54 { 55 {
@@ -56,9 +57,9 @@ namespace OpenSim.Region.Environment.Scenes
56 "[PRIMINVENTORY]: " + 57 "[PRIMINVENTORY]: " +
57 "Couldn't find part {0} in object group {1}, {2} to start script with ID {3}", 58 "Couldn't find part {0} in object group {1}, {2} to start script with ID {3}",
58 localID, Name, UUID, itemID); 59 localID, Name, UUID, itemID);
59 } 60 }
60 } 61 }
61 62
62// /// Start a given script. 63// /// Start a given script.
63// /// </summary> 64// /// </summary>
64// /// <param name="localID"> 65// /// <param name="localID">
@@ -79,7 +80,7 @@ namespace OpenSim.Region.Environment.Scenes
79// localID, Name, UUID, itemID); 80// localID, Name, UUID, itemID);
80// } 81// }
81// } 82// }
82 83
83 /// <summary> 84 /// <summary>
84 /// Start the scripts contained in all the prims in this group. 85 /// Start the scripts contained in all the prims in this group.
85 /// </summary> 86 /// </summary>
@@ -105,7 +106,7 @@ namespace OpenSim.Region.Environment.Scenes
105 } 106 }
106 } 107 }
107 } 108 }
108 109
109 /// Start a given script. 110 /// Start a given script.
110 /// </summary> 111 /// </summary>
111 /// <param name="localID"> 112 /// <param name="localID">
@@ -125,9 +126,9 @@ namespace OpenSim.Region.Environment.Scenes
125 "[PRIMINVENTORY]: " + 126 "[PRIMINVENTORY]: " +
126 "Couldn't find part {0} in object group {1}, {2} to stop script with ID {3}", 127 "Couldn't find part {0} in object group {1}, {2} to stop script with ID {3}",
127 partID, Name, UUID, itemID); 128 partID, Name, UUID, itemID);
128 } 129 }
129 } 130 }
130 131
131 /// <summary> 132 /// <summary>
132 /// 133 ///
133 /// </summary> 134 /// </summary>
@@ -170,7 +171,7 @@ namespace OpenSim.Region.Environment.Scenes
170 localID, Name, UUID); 171 localID, Name, UUID);
171 } 172 }
172 } 173 }
173 174
174 /// <summary> 175 /// <summary>
175 /// Add an inventory item to a prim in this group. 176 /// Add an inventory item to a prim in this group.
176 /// </summary> 177 /// </summary>
@@ -179,7 +180,7 @@ namespace OpenSim.Region.Environment.Scenes
179 /// <param name="item"></param> 180 /// <param name="item"></param>
180 /// <param name="copyItemID">The item UUID that should be used by the new item.</param> 181 /// <param name="copyItemID">The item UUID that should be used by the new item.</param>
181 /// <returns></returns> 182 /// <returns></returns>
182 public bool AddInventoryItem(IClientAPI remoteClient, uint localID, 183 public bool AddInventoryItem(IClientAPI remoteClient, uint localID,
183 InventoryItemBase item, LLUUID copyItemID) 184 InventoryItemBase item, LLUUID copyItemID)
184 { 185 {
185 LLUUID newItemId = (copyItemID != LLUUID.Zero) ? copyItemID : item.ID; 186 LLUUID newItemId = (copyItemID != LLUUID.Zero) ? copyItemID : item.ID;
@@ -188,8 +189,8 @@ namespace OpenSim.Region.Environment.Scenes
188 if (part != null) 189 if (part != null)
189 { 190 {
190 TaskInventoryItem taskItem = new TaskInventoryItem(); 191 TaskInventoryItem taskItem = new TaskInventoryItem();
191 192
192 taskItem.ItemID = newItemId; 193 taskItem.ItemID = newItemId;
193 taskItem.AssetID = item.AssetID; 194 taskItem.AssetID = item.AssetID;
194 taskItem.Name = item.Name; 195 taskItem.Name = item.Name;
195 taskItem.Description = item.Description; 196 taskItem.Description = item.Description;
@@ -197,15 +198,15 @@ namespace OpenSim.Region.Environment.Scenes
197 taskItem.CreatorID = item.Creator; 198 taskItem.CreatorID = item.Creator;
198 taskItem.Type = item.AssetType; 199 taskItem.Type = item.AssetType;
199 taskItem.InvType = item.InvType; 200 taskItem.InvType = item.InvType;
200 201
201 taskItem.BaseMask = item.BasePermissions; 202 taskItem.BaseMask = item.BasePermissions;
202 taskItem.OwnerMask = item.CurrentPermissions; 203 taskItem.OwnerMask = item.CurrentPermissions;
203 // FIXME: ignoring group permissions for now as they aren't stored in item 204 // FIXME: ignoring group permissions for now as they aren't stored in item
204 taskItem.EveryoneMask = item.EveryOnePermissions; 205 taskItem.EveryoneMask = item.EveryOnePermissions;
205 taskItem.NextOwnerMask = item.NextPermissions; 206 taskItem.NextOwnerMask = item.NextPermissions;
206 207
207 part.AddInventoryItem(taskItem); 208 part.AddInventoryItem(taskItem);
208 209
209 return true; 210 return true;
210 } 211 }
211 else 212 else
@@ -218,7 +219,7 @@ namespace OpenSim.Region.Environment.Scenes
218 219
219 return false; 220 return false;
220 } 221 }
221 222
222 /// <summary> 223 /// <summary>
223 /// Returns an existing inventory item. Returns the original, so any changes will be live. 224 /// Returns an existing inventory item. Returns the original, so any changes will be live.
224 /// </summary> 225 /// </summary>
@@ -238,11 +239,11 @@ namespace OpenSim.Region.Environment.Scenes
238 "[PRIMINVENTORY]: " + 239 "[PRIMINVENTORY]: " +
239 "Couldn't find prim local ID {0} in prim {1}, {2} to get inventory item ID {3}", 240 "Couldn't find prim local ID {0} in prim {1}, {2} to get inventory item ID {3}",
240 primID, part.Name, part.UUID, itemID); 241 primID, part.Name, part.UUID, itemID);
241 } 242 }
242 243
243 return null; 244 return null;
244 } 245 }
245 246
246 /// <summary> 247 /// <summary>
247 /// Update an existing inventory item. 248 /// Update an existing inventory item.
248 /// </summary> 249 /// </summary>
@@ -254,8 +255,8 @@ namespace OpenSim.Region.Environment.Scenes
254 SceneObjectPart part = GetChildPart(item.ParentPartID); 255 SceneObjectPart part = GetChildPart(item.ParentPartID);
255 if (part != null) 256 if (part != null)
256 { 257 {
257 part.UpdateInventoryItem(item); 258 part.UpdateInventoryItem(item);
258 259
259 return true; 260 return true;
260 } 261 }
261 else 262 else
@@ -264,22 +265,22 @@ namespace OpenSim.Region.Environment.Scenes
264 "[PRIMINVENTORY]: " + 265 "[PRIMINVENTORY]: " +
265 "Couldn't find prim ID {0} to update item {1}, {2}", 266 "Couldn't find prim ID {0} to update item {1}, {2}",
266 item.ParentPartID, item.Name, item.ItemID); 267 item.ParentPartID, item.Name, item.ItemID);
267 } 268 }
268 269
269 return false; 270 return false;
270 } 271 }
271 272
272 public int RemoveInventoryItem(uint localID, LLUUID itemID) 273 public int RemoveInventoryItem(uint localID, LLUUID itemID)
273 { 274 {
274 SceneObjectPart part = GetChildPart(localID); 275 SceneObjectPart part = GetChildPart(localID);
275 if (part != null) 276 if (part != null)
276 { 277 {
277 int type = part.RemoveInventoryItem(itemID); 278 int type = part.RemoveInventoryItem(itemID);
278 279
279 return type; 280 return type;
280 } 281 }
281 282
282 return -1; 283 return -1;
283 } 284 }
284 } 285 }
285} \ No newline at end of file 286}
diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs
index 1ea2f24..5d39790 100644
--- a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs
@@ -72,7 +72,7 @@ namespace OpenSim.Region.Environment.Scenes
72 object_rez = 4194304 72 object_rez = 4194304
73 } 73 }
74 74
75 internal struct scriptPosTarget 75 struct scriptPosTarget
76 { 76 {
77 public LLVector3 targetPos; 77 public LLVector3 targetPos;
78 public float tolerance; 78 public float tolerance;
@@ -82,14 +82,14 @@ namespace OpenSim.Region.Environment.Scenes
82 82
83 public partial class SceneObjectGroup : EntityBase 83 public partial class SceneObjectGroup : EntityBase
84 { 84 {
85 private readonly Dictionary<uint, scriptPosTarget> m_targets = new Dictionary<uint, scriptPosTarget>(); 85 private PrimCountTaintedDelegate handlerPrimCountTainted = null;
86 private PrimCountTaintedDelegate handlerPrimCountTainted;
87 86
88 /// <summary> 87 /// <summary>
89 /// Signal whether the non-inventory attributes of any prims in the group have changed 88 /// Signal whether the non-inventory attributes of any prims in the group have changed
90 /// since the group's last persistent backup 89 /// since the group's last persistent backup
91 /// </summary> 90 /// </summary>
92 public bool HasGroupChanged; 91 public bool HasGroupChanged = false;
92
93 93
94 94
95 private LLVector3 lastPhysGroupPos; 95 private LLVector3 lastPhysGroupPos;
@@ -104,8 +104,11 @@ namespace OpenSim.Region.Environment.Scenes
104 protected SceneObjectPart m_rootPart; 104 protected SceneObjectPart m_rootPart;
105 private Dictionary<LLUUID, scriptEvents> m_scriptEvents = new Dictionary<LLUUID, scriptEvents>(); 105 private Dictionary<LLUUID, scriptEvents> m_scriptEvents = new Dictionary<LLUUID, scriptEvents>();
106 106
107 private bool m_scriptListens_atTarget; 107 private Dictionary<uint, scriptPosTarget> m_targets = new Dictionary<uint, scriptPosTarget>();
108 private bool m_scriptListens_notAtTarget; 108
109 private bool m_scriptListens_atTarget = false;
110 private bool m_scriptListens_notAtTarget = false;
111
109 112
110 #region Properties 113 #region Properties
111 114
@@ -116,7 +119,7 @@ namespace OpenSim.Region.Environment.Scenes
116 /// think really there should be a list (or whatever) in each scenepresence 119 /// think really there should be a list (or whatever) in each scenepresence
117 /// saying what prim(s) that user has selected. 120 /// saying what prim(s) that user has selected.
118 /// </summary> 121 /// </summary>
119 protected bool m_isSelected; 122 protected bool m_isSelected = false;
120 123
121 /// <summary> 124 /// <summary>
122 /// 125 ///
@@ -183,6 +186,7 @@ namespace OpenSim.Region.Environment.Scenes
183 string.Format("[SCENE OBJECT GROUP]: Object {0} has no root part.", m_uuid)); 186 string.Format("[SCENE OBJECT GROUP]: Object {0} has no root part.", m_uuid));
184 } 187 }
185 188
189
186 190
187 return m_rootPart.GroupPosition; 191 return m_rootPart.GroupPosition;
188 } 192 }
@@ -202,7 +206,7 @@ namespace OpenSim.Region.Environment.Scenes
202 part.GroupPosition = val; 206 part.GroupPosition = val;
203 } 207 }
204 } 208 }
205 209
206 //if (m_rootPart.PhysActor != null) 210 //if (m_rootPart.PhysActor != null)
207 //{ 211 //{
208 //m_rootPart.PhysActor.Position = 212 //m_rootPart.PhysActor.Position =
@@ -212,7 +216,7 @@ namespace OpenSim.Region.Environment.Scenes
212 //} 216 //}
213 } 217 }
214 } 218 }
215 219
216 public override uint LocalId 220 public override uint LocalId
217 { 221 {
218 get 222 get
@@ -511,11 +515,10 @@ namespace OpenSim.Region.Environment.Scenes
511 m_scene.EventManager.OnBackup += ProcessBackup; 515 m_scene.EventManager.OnBackup += ProcessBackup;
512 } 516 }
513 } 517 }
514
515 public LLVector3 GroupScale() 518 public LLVector3 GroupScale()
516 { 519 {
517 LLVector3 minScale = new LLVector3(Constants.RegionSize, Constants.RegionSize, Constants.RegionSize); 520 LLVector3 minScale = new LLVector3(Constants.RegionSize,Constants.RegionSize,Constants.RegionSize);
518 LLVector3 maxScale = new LLVector3(0f, 0f, 0f); 521 LLVector3 maxScale = new LLVector3(0f,0f,0f);
519 LLVector3 finalScale = new LLVector3(0.5f, 0.5f, 0.5f); 522 LLVector3 finalScale = new LLVector3(0.5f, 0.5f, 0.5f);
520 523
521 lock (m_parts) 524 lock (m_parts)
@@ -538,8 +541,8 @@ namespace OpenSim.Region.Environment.Scenes
538 finalScale.Y = (minScale.Y > maxScale.Y) ? minScale.Y : maxScale.Y; 541 finalScale.Y = (minScale.Y > maxScale.Y) ? minScale.Y : maxScale.Y;
539 finalScale.Z = (minScale.Z > maxScale.Z) ? minScale.Z : maxScale.Z; 542 finalScale.Z = (minScale.Z > maxScale.Z) ? minScale.Z : maxScale.Z;
540 return finalScale; 543 return finalScale;
541 }
542 544
545 }
543 public EntityIntersection TestIntersection(Ray hRay, bool frontFacesOnly, bool faceCenters) 546 public EntityIntersection TestIntersection(Ray hRay, bool frontFacesOnly, bool faceCenters)
544 { 547 {
545 // We got a request from the inner_scene to raytrace along the Ray hRay 548 // We got a request from the inner_scene to raytrace along the Ray hRay
@@ -562,7 +565,7 @@ namespace OpenSim.Region.Environment.Scenes
562 // Telling the prim to raytrace. 565 // Telling the prim to raytrace.
563 //EntityIntersection inter = part.TestIntersection(hRay, parentrotation); 566 //EntityIntersection inter = part.TestIntersection(hRay, parentrotation);
564 567
565 EntityIntersection inter = part.TestIntersectionOBB(hRay, parentrotation, frontFacesOnly, faceCenters); 568 EntityIntersection inter = part.TestIntersectionOBB(hRay, parentrotation,frontFacesOnly, faceCenters);
566 569
567 // This may need to be updated to the maximum draw distance possible.. 570 // This may need to be updated to the maximum draw distance possible..
568 // We might (and probably will) be checking for prim creation from other sims 571 // We might (and probably will) be checking for prim creation from other sims
@@ -681,11 +684,12 @@ namespace OpenSim.Region.Environment.Scenes
681 DetachFromBackup(this); 684 DetachFromBackup(this);
682 m_rootPart.m_attachedAvatar = agentID; 685 m_rootPart.m_attachedAvatar = agentID;
683 686
684 687
685 if (m_rootPart.PhysActor != null) 688 if (m_rootPart.PhysActor != null)
686 { 689 {
687 m_scene.PhysicsScene.RemovePrim(m_rootPart.PhysActor); 690 m_scene.PhysicsScene.RemovePrim(m_rootPart.PhysActor);
688 m_rootPart.PhysActor = null; 691 m_rootPart.PhysActor = null;
692
689 } 693 }
690 694
691 AbsolutePosition = AttachOffset; 695 AbsolutePosition = AttachOffset;
@@ -705,28 +709,27 @@ namespace OpenSim.Region.Environment.Scenes
705 m_rootPart.ScheduleFullUpdate(); 709 m_rootPart.ScheduleFullUpdate();
706 } 710 }
707 } 711 }
708
709 public byte GetAttachmentPoint() 712 public byte GetAttachmentPoint()
710 { 713 {
711 if (m_rootPart != null) 714 if (m_rootPart != null)
712 { 715 {
713 return m_rootPart.Shape.State; 716 return m_rootPart.Shape.State;
714 } 717 }
715 return 0; 718 return (byte)0;
716 } 719 }
717 720
718 public void ClearPartAttachmentData() 721 public void ClearPartAttachmentData()
719 { 722 {
720 foreach (SceneObjectPart part in m_parts.Values) 723 foreach (SceneObjectPart part in m_parts.Values)
721 { 724 {
722 part.SetAttachmentPoint(0); 725 part.SetAttachmentPoint((Byte)0);
723 } 726 }
724 } 727 }
725 728
726 public void DetachToGround() 729 public void DetachToGround()
727 { 730 {
728 ScenePresence avatar = m_scene.GetScenePresence(m_rootPart.m_attachedAvatar); 731 ScenePresence avatar = m_scene.GetScenePresence(m_rootPart.m_attachedAvatar);
729 LLVector3 detachedpos = new LLVector3(127f, 127f, 127f); 732 LLVector3 detachedpos = new LLVector3(127f,127f,127f);
730 if (avatar != null) 733 if (avatar != null)
731 { 734 {
732 detachedpos = avatar.AbsolutePosition; 735 detachedpos = avatar.AbsolutePosition;
@@ -735,14 +738,14 @@ namespace OpenSim.Region.Environment.Scenes
735 AbsolutePosition = detachedpos; 738 AbsolutePosition = detachedpos;
736 m_rootPart.m_attachedAvatar = LLUUID.Zero; 739 m_rootPart.m_attachedAvatar = LLUUID.Zero;
737 m_rootPart.SetParentLocalId(0); 740 m_rootPart.SetParentLocalId(0);
738 m_rootPart.SetAttachmentPoint(0); 741 m_rootPart.SetAttachmentPoint((byte)0);
739 m_rootPart.m_IsAttachment = false; 742 m_rootPart.m_IsAttachment = false;
740 m_rootPart.ApplyPhysics(m_rootPart.GetEffectiveObjectFlags(), m_scene.m_physicalPrim); 743 m_rootPart.ApplyPhysics(m_rootPart.GetEffectiveObjectFlags(), m_scene.m_physicalPrim);
741 AttachToBackup(); 744 AttachToBackup();
742 m_rootPart.ScheduleFullUpdate(); 745 m_rootPart.ScheduleFullUpdate();
743 m_rootPart.ClearUndoState(); 746 m_rootPart.ClearUndoState();
747
744 } 748 }
745
746 public void DetachToInventoryPrep() 749 public void DetachToInventoryPrep()
747 { 750 {
748 ScenePresence avatar = m_scene.GetScenePresence(m_rootPart.m_attachedAvatar); 751 ScenePresence avatar = m_scene.GetScenePresence(m_rootPart.m_attachedAvatar);
@@ -752,7 +755,7 @@ namespace OpenSim.Region.Environment.Scenes
752 //detachedpos = avatar.AbsolutePosition; 755 //detachedpos = avatar.AbsolutePosition;
753 avatar.RemoveAttachment(this); 756 avatar.RemoveAttachment(this);
754 } 757 }
755 758
756 m_rootPart.m_attachedAvatar = LLUUID.Zero; 759 m_rootPart.m_attachedAvatar = LLUUID.Zero;
757 m_rootPart.SetParentLocalId(0); 760 m_rootPart.SetParentLocalId(0);
758 //m_rootPart.SetAttachmentPoint((byte)0); 761 //m_rootPart.SetAttachmentPoint((byte)0);
@@ -761,8 +764,8 @@ namespace OpenSim.Region.Environment.Scenes
761 //m_rootPart.ApplyPhysics(m_rootPart.GetEffectiveObjectFlags(), m_scene.m_physicalPrim); 764 //m_rootPart.ApplyPhysics(m_rootPart.GetEffectiveObjectFlags(), m_scene.m_physicalPrim);
762 //AttachToBackup(); 765 //AttachToBackup();
763 //m_rootPart.ScheduleFullUpdate(); 766 //m_rootPart.ScheduleFullUpdate();
767
764 } 768 }
765
766 /// <summary> 769 /// <summary>
767 /// 770 ///
768 /// </summary> 771 /// </summary>
@@ -823,6 +826,7 @@ namespace OpenSim.Region.Environment.Scenes
823 try 826 try
824 { 827 {
825 m_parts.Add(part.UUID, part); 828 m_parts.Add(part.UUID, part);
829
826 } 830 }
827 catch (Exception e) 831 catch (Exception e)
828 { 832 {
@@ -843,6 +847,7 @@ namespace OpenSim.Region.Environment.Scenes
843 if (part.UUID != m_rootPart.UUID) 847 if (part.UUID != m_rootPart.UUID)
844 { 848 {
845 part.ParentID = m_rootPart.LocalId; 849 part.ParentID = m_rootPart.LocalId;
850
846 } 851 }
847 } 852 }
848 } 853 }
@@ -855,10 +860,10 @@ namespace OpenSim.Region.Environment.Scenes
855 foreach (SceneObjectPart part in m_parts.Values) 860 foreach (SceneObjectPart part in m_parts.Values)
856 { 861 {
857 part.UUID = LLUUID.Random(); 862 part.UUID = LLUUID.Random();
863
858 } 864 }
859 } 865 }
860 } 866 }
861
862 // helper provided for parts. 867 // helper provided for parts.
863 public int GetSceneMaxUndo() 868 public int GetSceneMaxUndo()
864 { 869 {
@@ -866,7 +871,6 @@ namespace OpenSim.Region.Environment.Scenes
866 return m_scene.MaxUndoCount; 871 return m_scene.MaxUndoCount;
867 return 5; 872 return 5;
868 } 873 }
869
870 public void ResetChildPrimPhysicsPositions() 874 public void ResetChildPrimPhysicsPositions()
871 { 875 {
872 AbsolutePosition = AbsolutePosition; 876 AbsolutePosition = AbsolutePosition;
@@ -893,6 +897,7 @@ namespace OpenSim.Region.Environment.Scenes
893 { 897 {
894 SceneObjectPart part = GetChildPart(localId); 898 SceneObjectPart part = GetChildPart(localId);
895 OnGrabPart(part, offsetPos, remoteClient); 899 OnGrabPart(part, offsetPos, remoteClient);
900
896 } 901 }
897 } 902 }
898 903
@@ -900,6 +905,7 @@ namespace OpenSim.Region.Environment.Scenes
900 { 905 {
901 part.StoreUndoState(); 906 part.StoreUndoState();
902 part.OnGrab(offsetPos, remoteClient); 907 part.OnGrab(offsetPos, remoteClient);
908
903 } 909 }
904 910
905 public virtual void OnGrabGroup(LLVector3 offsetPos, IClientAPI remoteClient) 911 public virtual void OnGrabGroup(LLVector3 offsetPos, IClientAPI remoteClient)
@@ -963,19 +969,19 @@ namespace OpenSim.Region.Environment.Scenes
963 969
964 public void aggregateScriptEvents() 970 public void aggregateScriptEvents()
965 { 971 {
966 uint objectflagupdate = RootPart.GetEffectiveObjectFlags(); 972 uint objectflagupdate=(uint)RootPart.GetEffectiveObjectFlags();
967 973
968 scriptEvents aggregateScriptEvents = 0; 974 scriptEvents aggregateScriptEvents=0;
969 975
970 lock (m_parts) 976 lock (m_parts)
971 { 977 {
972 foreach (SceneObjectPart part in m_parts.Values) 978 foreach (SceneObjectPart part in m_parts.Values)
973 { 979 {
974 if (part == null) 980 if(part == null)
975 continue; 981 continue;
976 if (part != RootPart) 982 if(part != RootPart)
977 part.ObjectFlags = objectflagupdate; 983 part.ObjectFlags = objectflagupdate;
978 aggregateScriptEvents |= part.m_aggregateScriptEvents; 984 aggregateScriptEvents |= part.m_aggregateScriptEvents;
979 } 985 }
980 } 986 }
981 987
@@ -1059,139 +1065,6 @@ namespace OpenSim.Region.Environment.Scenes
1059 } 1065 }
1060 } 1066 }
1061 1067
1062 internal void SetAxisRotation(int axis, int rotate10)
1063 {
1064 bool setX = false;
1065 bool setY = false;
1066 bool setZ = false;
1067
1068 int xaxis = 2;
1069 int yaxis = 4;
1070 int zaxis = 8;
1071
1072 if (m_rootPart != null)
1073 {
1074 setX = ((axis & xaxis) != 0) ? true : false;
1075 setY = ((axis & yaxis) != 0) ? true : false;
1076 setZ = ((axis & zaxis) != 0) ? true : false;
1077
1078 float setval = (rotate10 > 0) ? 1f : 0f;
1079
1080 if (setX)
1081 m_rootPart.m_rotationAxis.X = setval;
1082 if (setY)
1083 m_rootPart.m_rotationAxis.Y = setval;
1084 if (setZ)
1085 m_rootPart.m_rotationAxis.Z = setval;
1086
1087 if (setX || setY || setZ)
1088 {
1089 m_rootPart.SetPhysicsAxisRotation();
1090 }
1091 }
1092 }
1093
1094 public int registerTargetWaypoint(LLVector3 target, float tolerance)
1095 {
1096 scriptPosTarget waypoint = new scriptPosTarget();
1097 waypoint.targetPos = target;
1098 waypoint.tolerance = tolerance;
1099 uint handle = m_scene.PrimIDAllocate();
1100 lock (m_targets)
1101 {
1102 m_targets.Add(handle, waypoint);
1103 }
1104 return (int) handle;
1105 }
1106
1107 public void unregisterTargetWaypoint(int handle)
1108 {
1109 lock (m_targets)
1110 {
1111 if (m_targets.ContainsKey((uint) handle))
1112 m_targets.Remove((uint) handle);
1113 }
1114 }
1115
1116 private void checkAtTargets()
1117 {
1118 if (m_scriptListens_atTarget || m_scriptListens_notAtTarget)
1119 {
1120 if (m_targets.Count > 0)
1121 {
1122 bool at_target = false;
1123 //LLVector3 targetPos;
1124 //uint targetHandle;
1125 Dictionary<uint, scriptPosTarget> atTargets = new Dictionary<uint, scriptPosTarget>();
1126 lock (m_targets)
1127 {
1128 foreach (uint idx in m_targets.Keys)
1129 {
1130 scriptPosTarget target = m_targets[idx];
1131 if (Util.GetDistanceTo(target.targetPos, m_rootPart.GroupPosition) <= target.tolerance)
1132 {
1133 // trigger at_target
1134 if (m_scriptListens_atTarget)
1135 {
1136 // Reusing att.tolerance to hold the index of the target in the targets dictionary
1137 // to avoid deadlocking the sim.
1138 at_target = true;
1139 scriptPosTarget att = new scriptPosTarget();
1140 att.targetPos = target.targetPos;
1141 att.tolerance = idx;
1142 atTargets.Add(idx, att);
1143 }
1144 }
1145 }
1146 }
1147 if (atTargets.Count > 0)
1148 {
1149 uint[] localids = new uint[0];
1150 lock (m_parts)
1151 {
1152 localids = new uint[m_parts.Count];
1153 int cntr = 0;
1154 foreach (SceneObjectPart part in m_parts.Values)
1155 {
1156 localids[cntr] = part.LocalId;
1157 cntr++;
1158 }
1159 }
1160 for (int ctr = 0; ctr < localids.Length; ctr++)
1161 {
1162 foreach (uint target in atTargets.Keys)
1163 {
1164 scriptPosTarget att = atTargets[target];
1165 // Reusing att.tolerance to hold the index of the target in the targets dictionary
1166 // to avoid deadlocking the sim.
1167 m_scene.TriggerAtTargetEvent(localids[ctr], (uint) att.tolerance, att.targetPos, m_rootPart.GroupPosition);
1168 }
1169 }
1170 return;
1171 }
1172 if (m_scriptListens_notAtTarget && !at_target)
1173 {
1174 //trigger not_at_target
1175 uint[] localids = new uint[0];
1176 lock (m_parts)
1177 {
1178 localids = new uint[m_parts.Count];
1179 int cntr = 0;
1180 foreach (SceneObjectPart part in m_parts.Values)
1181 {
1182 localids[cntr] = part.LocalId;
1183 cntr++;
1184 }
1185 }
1186 for (int ctr = 0; ctr < localids.Length; ctr++)
1187 {
1188 m_scene.TriggerNotAtTargetEvent(localids[ctr]);
1189 }
1190 }
1191 }
1192 }
1193 }
1194
1195 #region Events 1068 #region Events
1196 1069
1197 /// <summary> 1070 /// <summary>
@@ -1489,8 +1362,9 @@ namespace OpenSim.Region.Environment.Scenes
1489 { 1362 {
1490 m_parts.Add(newPart.UUID, newPart); 1363 m_parts.Add(newPart.UUID, newPart);
1491 } 1364 }
1492 1365
1493 SetPartAsNonRoot(newPart); 1366 SetPartAsNonRoot(newPart);
1367
1494 } 1368 }
1495 1369
1496 /// <summary> 1370 /// <summary>
@@ -1560,30 +1434,32 @@ namespace OpenSim.Region.Environment.Scenes
1560 /// </summary> 1434 /// </summary>
1561 public override void Update() 1435 public override void Update()
1562 { 1436 {
1437
1563 lock (m_parts) 1438 lock (m_parts)
1564 { 1439 {
1565 //if (m_rootPart.m_IsAttachment) 1440 //if (m_rootPart.m_IsAttachment)
1566 //{ 1441 //{
1567 //foreach (SceneObjectPart part in m_parts.Values) 1442 //foreach (SceneObjectPart part in m_parts.Values)
1568 //{ 1443 //{
1569 //part.SendScheduledUpdates(); 1444 //part.SendScheduledUpdates();
1445 //}
1446 //return;
1570 //} 1447 //}
1571 //return; 1448
1572 //}
1573
1574 if (Util.GetDistanceTo(lastPhysGroupPos, AbsolutePosition) > 0.02) 1449 if (Util.GetDistanceTo(lastPhysGroupPos, AbsolutePosition) > 0.02)
1575 { 1450 {
1576 m_rootPart.UpdateFlag = 1; 1451 m_rootPart.UpdateFlag = 1;
1577 lastPhysGroupPos = AbsolutePosition; 1452 lastPhysGroupPos = AbsolutePosition;
1578 } 1453 }
1579 //foreach (SceneObjectPart part in m_parts.Values) 1454 //foreach (SceneObjectPart part in m_parts.Values)
1580 //{ 1455 //{
1581 //if (part.UpdateFlag == 0) part.UpdateFlag = 1; 1456 //if (part.UpdateFlag == 0) part.UpdateFlag = 1;
1582 //} 1457 //}
1583
1584
1585 checkAtTargets();
1586 1458
1459
1460
1461 checkAtTargets();
1462
1587 1463
1588 if ((Math.Abs(lastPhysGroupRot.W - GroupRotation.W) > 0.1) 1464 if ((Math.Abs(lastPhysGroupRot.W - GroupRotation.W) > 0.1)
1589 || (Math.Abs(lastPhysGroupRot.X - GroupRotation.X) > 0.1) 1465 || (Math.Abs(lastPhysGroupRot.X - GroupRotation.X) > 0.1)
@@ -1887,7 +1763,7 @@ namespace OpenSim.Region.Environment.Scenes
1887 public void DelinkFromGroup(uint partID) 1763 public void DelinkFromGroup(uint partID)
1888 { 1764 {
1889 SceneObjectPart linkPart = GetChildPart(partID); 1765 SceneObjectPart linkPart = GetChildPart(partID);
1890 1766
1891 if (null != linkPart) 1767 if (null != linkPart)
1892 { 1768 {
1893 linkPart.ClearUndoState(); 1769 linkPart.ClearUndoState();
@@ -2072,10 +1948,10 @@ namespace OpenSim.Region.Environment.Scenes
2072 proper.ObjectData[0].FromTaskID = LLUUID.Zero; 1948 proper.ObjectData[0].FromTaskID = LLUUID.Zero;
2073 proper.ObjectData[0].GroupID = LLUUID.Zero; 1949 proper.ObjectData[0].GroupID = LLUUID.Zero;
2074 proper.ObjectData[0].InventorySerial = (short) m_rootPart.InventorySerial; 1950 proper.ObjectData[0].InventorySerial = (short) m_rootPart.InventorySerial;
2075 1951
2076 proper.ObjectData[0].LastOwnerID = m_rootPart.LastOwnerID; 1952 proper.ObjectData[0].LastOwnerID = m_rootPart.LastOwnerID;
2077// proper.ObjectData[0].LastOwnerID = LLUUID.Zero; 1953// proper.ObjectData[0].LastOwnerID = LLUUID.Zero;
2078 1954
2079 proper.ObjectData[0].ObjectID = UUID; 1955 proper.ObjectData[0].ObjectID = UUID;
2080 proper.ObjectData[0].OwnerID = m_rootPart.OwnerID; 1956 proper.ObjectData[0].OwnerID = m_rootPart.OwnerID;
2081 proper.ObjectData[0].TouchName = Helpers.StringToField(m_rootPart.TouchName); 1957 proper.ObjectData[0].TouchName = Helpers.StringToField(m_rootPart.TouchName);
@@ -2515,5 +2391,140 @@ namespace OpenSim.Region.Environment.Scenes
2515 } 2391 }
2516 2392
2517 #endregion 2393 #endregion
2394
2395 internal void SetAxisRotation(int axis, int rotate10)
2396 {
2397 bool setX = false;
2398 bool setY = false;
2399 bool setZ = false;
2400
2401 int xaxis = 2;
2402 int yaxis = 4;
2403 int zaxis = 8;
2404
2405 if (m_rootPart != null)
2406 {
2407 setX = ((axis & xaxis) != 0) ? true : false;
2408 setY = ((axis & yaxis) != 0) ? true : false;
2409 setZ = ((axis & zaxis) != 0) ? true : false;
2410
2411 float setval = (rotate10 > 0) ? 1f : 0f;
2412
2413 if (setX)
2414 m_rootPart.m_rotationAxis.X = setval;
2415 if (setY)
2416 m_rootPart.m_rotationAxis.Y = setval;
2417 if (setZ)
2418 m_rootPart.m_rotationAxis.Z = setval;
2419
2420 if (setX || setY || setZ)
2421 {
2422 m_rootPart.SetPhysicsAxisRotation();
2423 }
2424
2425 }
2426 }
2427
2428 public int registerTargetWaypoint(LLVector3 target, float tolerance)
2429 {
2430 scriptPosTarget waypoint = new scriptPosTarget();
2431 waypoint.targetPos = target;
2432 waypoint.tolerance = tolerance;
2433 uint handle = m_scene.PrimIDAllocate();
2434 lock (m_targets)
2435 {
2436 m_targets.Add(handle, waypoint);
2437 }
2438 return (int)handle;
2439 }
2440 public void unregisterTargetWaypoint(int handle)
2441 {
2442 lock (m_targets)
2443 {
2444 if (m_targets.ContainsKey((uint)handle))
2445 m_targets.Remove((uint)handle);
2446 }
2447 }
2448
2449 private void checkAtTargets()
2450 {
2451 if (m_scriptListens_atTarget || m_scriptListens_notAtTarget)
2452 {
2453 if (m_targets.Count > 0)
2454 {
2455 bool at_target = false;
2456 //LLVector3 targetPos;
2457 //uint targetHandle;
2458 Dictionary<uint, scriptPosTarget> atTargets = new Dictionary<uint, scriptPosTarget>();
2459 lock (m_targets)
2460 {
2461 foreach (uint idx in m_targets.Keys)
2462 {
2463 scriptPosTarget target = m_targets[idx];
2464 if (Util.GetDistanceTo(target.targetPos, m_rootPart.GroupPosition) <= target.tolerance)
2465 {
2466 // trigger at_target
2467 if (m_scriptListens_atTarget)
2468 {
2469 // Reusing att.tolerance to hold the index of the target in the targets dictionary
2470 // to avoid deadlocking the sim.
2471 at_target = true;
2472 scriptPosTarget att = new scriptPosTarget();
2473 att.targetPos = target.targetPos;
2474 att.tolerance = (float)idx;
2475 atTargets.Add(idx, att);
2476 }
2477 }
2478 }
2479 }
2480 if (atTargets.Count > 0)
2481 {
2482 uint[] localids = new uint[0];
2483 lock (m_parts)
2484 {
2485 localids = new uint[m_parts.Count];
2486 int cntr = 0;
2487 foreach (SceneObjectPart part in m_parts.Values)
2488 {
2489 localids[cntr] = part.LocalId;
2490 cntr++;
2491 }
2492 }
2493 for (int ctr = 0; ctr < localids.Length; ctr++)
2494 {
2495 foreach (uint target in atTargets.Keys)
2496 {
2497 scriptPosTarget att = atTargets[target];
2498 // Reusing att.tolerance to hold the index of the target in the targets dictionary
2499 // to avoid deadlocking the sim.
2500 m_scene.TriggerAtTargetEvent(localids[ctr], (uint)att.tolerance, att.targetPos, m_rootPart.GroupPosition);
2501
2502
2503 }
2504 }
2505 return;
2506 }
2507 if (m_scriptListens_notAtTarget && !at_target)
2508 {
2509 //trigger not_at_target
2510 uint[] localids = new uint[0];
2511 lock (m_parts)
2512 {
2513 localids = new uint[m_parts.Count];
2514 int cntr = 0;
2515 foreach (SceneObjectPart part in m_parts.Values)
2516 {
2517 localids[cntr] = part.LocalId;
2518 cntr++;
2519 }
2520 }
2521 for (int ctr = 0; ctr < localids.Length; ctr++)
2522 {
2523 m_scene.TriggerNotAtTargetEvent(localids[ctr]);
2524 }
2525 }
2526 }
2527 }
2528 }
2518 } 2529 }
2519} \ No newline at end of file 2530}
diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectPart.Inventory.cs b/OpenSim/Region/Environment/Scenes/SceneObjectPart.Inventory.cs
index c8a8f95..0215cec 100644
--- a/OpenSim/Region/Environment/Scenes/SceneObjectPart.Inventory.cs
+++ b/OpenSim/Region/Environment/Scenes/SceneObjectPart.Inventory.cs
@@ -41,12 +41,7 @@ namespace OpenSim.Region.Environment.Scenes
41 { 41 {
42 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 42 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
43 43
44 private readonly string m_inventoryFileName = String.Empty; 44 private string m_inventoryFileName = String.Empty;
45
46 /// <summary>
47 /// Tracks whether inventory has changed since the last persistent backup
48 /// </summary>
49 private bool HasInventoryChanged;
50 45
51 /// <summary> 46 /// <summary>
52 /// The inventory folder for this prim 47 /// The inventory folder for this prim
@@ -54,17 +49,6 @@ namespace OpenSim.Region.Environment.Scenes
54 private LLUUID m_folderID = LLUUID.Zero; 49 private LLUUID m_folderID = LLUUID.Zero;
55 50
56 /// <summary> 51 /// <summary>
57 /// Serial count for inventory file , used to tell if inventory has changed
58 /// no need for this to be part of Database backup
59 /// </summary>
60 protected uint m_inventorySerial;
61
62 /// <summary>
63 /// Holds in memory prim inventory
64 /// </summary>
65 protected TaskInventoryDictionary m_taskInventory = new TaskInventoryDictionary();
66
67 /// <summary>
68 /// Exposing this is not particularly good, but it's one of the least evils at the moment to see 52 /// Exposing this is not particularly good, but it's one of the least evils at the moment to see
69 /// folder id from prim inventory item data, since it's not (yet) actually stored with the prim. 53 /// folder id from prim inventory item data, since it's not (yet) actually stored with the prim.
70 /// </summary> 54 /// </summary>
@@ -74,12 +58,23 @@ namespace OpenSim.Region.Environment.Scenes
74 set { m_folderID = value; } 58 set { m_folderID = value; }
75 } 59 }
76 60
61 /// <summary>
62 /// Serial count for inventory file , used to tell if inventory has changed
63 /// no need for this to be part of Database backup
64 /// </summary>
65 protected uint m_inventorySerial = 0;
66
77 public uint InventorySerial 67 public uint InventorySerial
78 { 68 {
79 get { return m_inventorySerial; } 69 get { return m_inventorySerial; }
80 set { m_inventorySerial = value; } 70 set { m_inventorySerial = value; }
81 } 71 }
82 72
73 /// <summary>
74 /// Holds in memory prim inventory
75 /// </summary>
76 protected TaskInventoryDictionary m_taskInventory = new TaskInventoryDictionary();
77
83 public TaskInventoryDictionary TaskInventory 78 public TaskInventoryDictionary TaskInventory
84 { 79 {
85 get { return m_taskInventory; } 80 get { return m_taskInventory; }
@@ -87,6 +82,11 @@ namespace OpenSim.Region.Environment.Scenes
87 } 82 }
88 83
89 /// <summary> 84 /// <summary>
85 /// Tracks whether inventory has changed since the last persistent backup
86 /// </summary>
87 private bool HasInventoryChanged;
88
89 /// <summary>
90 /// Reset LLUUIDs for all the items in the prim's inventory. This involves either generating 90 /// Reset LLUUIDs for all the items in the prim's inventory. This involves either generating
91 /// new ones or setting existing UUIDs to the correct parent UUIDs. 91 /// new ones or setting existing UUIDs to the correct parent UUIDs.
92 /// 92 ///
@@ -96,14 +96,14 @@ namespace OpenSim.Region.Environment.Scenes
96 public void ResetInventoryIDs() 96 public void ResetInventoryIDs()
97 { 97 {
98 lock (TaskInventory) 98 lock (TaskInventory)
99 { 99 {
100 if (0 == TaskInventory.Count) 100 if (0 == TaskInventory.Count)
101 { 101 {
102 return; 102 return;
103 } 103 }
104 104
105 HasInventoryChanged = true; 105 HasInventoryChanged = true;
106 106
107 IList<TaskInventoryItem> items = new List<TaskInventoryItem>(TaskInventory.Values); 107 IList<TaskInventoryItem> items = new List<TaskInventoryItem>(TaskInventory.Values);
108 TaskInventory.Clear(); 108 TaskInventory.Clear();
109 109
@@ -132,9 +132,9 @@ namespace OpenSim.Region.Environment.Scenes
132 if (ownerId != item.OwnerID) 132 if (ownerId != item.OwnerID)
133 { 133 {
134 item.LastOwnerID = item.OwnerID; 134 item.LastOwnerID = item.OwnerID;
135 item.OwnerID = ownerId; 135 item.OwnerID = ownerId;
136 item.BaseMask = item.NextOwnerMask & (uint) PermissionMask.All; 136 item.BaseMask = item.NextOwnerMask & (uint)PermissionMask.All;
137 item.OwnerMask = item.NextOwnerMask & (uint) PermissionMask.All; 137 item.OwnerMask = item.NextOwnerMask & (uint)PermissionMask.All;
138 } 138 }
139 } 139 }
140 } 140 }
@@ -194,22 +194,22 @@ namespace OpenSim.Region.Environment.Scenes
194 AssetCache cache = m_parentGroup.Scene.AssetCache; 194 AssetCache cache = m_parentGroup.Scene.AssetCache;
195 195
196 cache.GetAsset(item.AssetID, delegate(LLUUID assetID, AssetBase asset) 196 cache.GetAsset(item.AssetID, delegate(LLUUID assetID, AssetBase asset)
197 { 197 {
198 if (null == asset) 198 if (null == asset)
199 { 199 {
200 m_log.ErrorFormat( 200 m_log.ErrorFormat(
201 "[PRIMINVENTORY]: " + 201 "[PRIMINVENTORY]: " +
202 "Couldn't start script {0}, {1} since asset ID {2} could not be found", 202 "Couldn't start script {0}, {1} since asset ID {2} could not be found",
203 item.Name, item.ItemID, item.AssetID); 203 item.Name, item.ItemID, item.AssetID);
204 } 204 }
205 else 205 else
206 { 206 {
207 string script = Helpers.FieldToUTF8String(asset.Data); 207 string script = Helpers.FieldToUTF8String(asset.Data);
208 m_parentGroup.Scene.EventManager.TriggerRezScript(LocalId, item.ItemID, script); 208 m_parentGroup.Scene.EventManager.TriggerRezScript(LocalId,item.ItemID,script);
209 m_parentGroup.AddActiveScriptCount(1); 209 m_parentGroup.AddActiveScriptCount(1);
210 ScheduleFullUpdate(); 210 ScheduleFullUpdate();
211 } 211 }
212 }, false); 212 }, false);
213 } 213 }
214 } 214 }
215 215
@@ -226,6 +226,7 @@ namespace OpenSim.Region.Environment.Scenes
226 if (m_taskInventory.ContainsKey(itemId)) 226 if (m_taskInventory.ContainsKey(itemId))
227 { 227 {
228 StartScript(m_taskInventory[itemId]); 228 StartScript(m_taskInventory[itemId]);
229
229 } 230 }
230 else 231 else
231 { 232 {
@@ -262,7 +263,7 @@ namespace OpenSim.Region.Environment.Scenes
262 { 263 {
263 foreach (TaskInventoryItem item in m_taskInventory.Values) 264 foreach (TaskInventoryItem item in m_taskInventory.Values)
264 { 265 {
265 if (item.Name == name) 266 if(item.Name == name)
266 return true; 267 return true;
267 } 268 }
268 return false; 269 return false;
@@ -270,14 +271,14 @@ namespace OpenSim.Region.Environment.Scenes
270 271
271 private string FindAvailableInventoryName(string name) 272 private string FindAvailableInventoryName(string name)
272 { 273 {
273 if (!InventoryContainsName(name)) 274 if(!InventoryContainsName(name))
274 return name; 275 return name;
275 276
276 int suffix = 1; 277 int suffix=1;
277 while (suffix < 256) 278 while(suffix < 256)
278 { 279 {
279 string tryName = String.Format("{0} {1}", name, suffix); 280 string tryName=String.Format("{0} {1}", name, suffix);
280 if (!InventoryContainsName(tryName)) 281 if(!InventoryContainsName(tryName))
281 return tryName; 282 return tryName;
282 suffix++; 283 suffix++;
283 } 284 }
@@ -294,11 +295,11 @@ namespace OpenSim.Region.Environment.Scenes
294 item.CreationDate = 1000; 295 item.CreationDate = 1000;
295 item.ParentPartID = UUID; 296 item.ParentPartID = UUID;
296 297
297 string name = FindAvailableInventoryName(item.Name); 298 string name=FindAvailableInventoryName(item.Name);
298 if (name == String.Empty) 299 if(name == String.Empty)
299 return; 300 return;
300 301
301 item.Name = name; 302 item.Name=name;
302 303
303 lock (m_taskInventory) 304 lock (m_taskInventory)
304 { 305 {
@@ -346,7 +347,7 @@ namespace OpenSim.Region.Environment.Scenes
346// m_log.DebugFormat( 347// m_log.DebugFormat(
347// "[PRIM INVENTORY]: Retrieved task inventory item {0}, {1} from prim {2}, {3}", 348// "[PRIM INVENTORY]: Retrieved task inventory item {0}, {1} from prim {2}, {3}",
348// m_taskInventory[itemID].Name, itemID, Name, UUID); 349// m_taskInventory[itemID].Name, itemID, Name, UUID);
349 350
350 return m_taskInventory[itemID]; 351 return m_taskInventory[itemID];
351 } 352 }
352 else 353 else
@@ -427,6 +428,7 @@ namespace OpenSim.Region.Environment.Scenes
427 scriptcount++; 428 scriptcount++;
428 } 429 }
429 } 430 }
431
430 } 432 }
431 if (scriptcount <= 0) 433 if (scriptcount <= 0)
432 { 434 {
@@ -455,14 +457,14 @@ namespace OpenSim.Region.Environment.Scenes
455 /// <param name="client"></param> 457 /// <param name="client"></param>
456 /// <param name="localID"></param> 458 /// <param name="localID"></param>
457 public bool GetInventoryFileName(IClientAPI client, uint localID) 459 public bool GetInventoryFileName(IClientAPI client, uint localID)
458 { 460 {
459// m_log.DebugFormat( 461// m_log.DebugFormat(
460// "[PRIM INVENTORY]: Received request from client {0} for inventory file name of {1}, {2}", 462// "[PRIM INVENTORY]: Received request from client {0} for inventory file name of {1}, {2}",
461// client.AgentId, Name, UUID); 463// client.AgentId, Name, UUID);
462 464
463 if (m_inventorySerial > 0) 465 if (m_inventorySerial > 0)
464 { 466 {
465 client.SendTaskInventory(m_uuid, (short) m_inventorySerial, 467 client.SendTaskInventory(m_uuid, (short)m_inventorySerial,
466 Helpers.StringToField(m_inventoryFileName)); 468 Helpers.StringToField(m_inventoryFileName));
467 return true; 469 return true;
468 } 470 }
@@ -478,9 +480,9 @@ namespace OpenSim.Region.Environment.Scenes
478 /// </summary> 480 /// </summary>
479 /// <param name="xferManager"></param> 481 /// <param name="xferManager"></param>
480 public void RequestInventoryFile(IXfer xferManager) 482 public void RequestInventoryFile(IXfer xferManager)
481 { 483 {
482 byte[] fileData = new byte[0]; 484 byte[] fileData = new byte[0];
483 485
484 // Confusingly, the folder item has to be the object id, while the 'parent id' has to be zero. This matches 486 // Confusingly, the folder item has to be the object id, while the 'parent id' has to be zero. This matches
485 // what appears to happen in the Second Life protocol. If this isn't the case. then various functionality 487 // what appears to happen in the Second Life protocol. If this isn't the case. then various functionality
486 // isn't available (such as drag from prim inventory to agent inventory) 488 // isn't available (such as drag from prim inventory to agent inventory)
@@ -491,53 +493,53 @@ namespace OpenSim.Region.Environment.Scenes
491 foreach (TaskInventoryItem item in m_taskInventory.Values) 493 foreach (TaskInventoryItem item in m_taskInventory.Values)
492 { 494 {
493 invString.AddItemStart(); 495 invString.AddItemStart();
494 invString.AddNameValueLine("item_id", item.ItemID.ToString()); 496 invString.AddNameValueLine("item_id", item.ItemID.ToString());
495 invString.AddNameValueLine("parent_id", m_folderID.ToString()); 497 invString.AddNameValueLine("parent_id", m_folderID.ToString());
496 498
497 invString.AddPermissionsStart(); 499 invString.AddPermissionsStart();
498 500
499 // FIXME: Temporary until permissions are properly sorted. 501 // FIXME: Temporary until permissions are properly sorted.
500 invString.AddNameValueLine("base_mask", "7fffffff"); 502 invString.AddNameValueLine("base_mask", "7fffffff");
501 invString.AddNameValueLine("owner_mask", "7fffffff"); 503 invString.AddNameValueLine("owner_mask", "7fffffff");
502 invString.AddNameValueLine("group_mask", "7fffffff"); 504 invString.AddNameValueLine("group_mask", "7fffffff");
503 invString.AddNameValueLine("everyone_mask", "7fffffff"); 505 invString.AddNameValueLine("everyone_mask", "7fffffff");
504 invString.AddNameValueLine("next_owner_mask", "7fffffff"); 506 invString.AddNameValueLine("next_owner_mask", "7fffffff");
505 507
506// invString.AddNameValueLine("group_mask", "00000000"); 508// invString.AddNameValueLine("group_mask", "00000000");
507// invString.AddNameValueLine("everyone_mask", "00000000"); 509// invString.AddNameValueLine("everyone_mask", "00000000");
508// invString.AddNameValueLine("next_owner_mask", "00086000"); 510// invString.AddNameValueLine("next_owner_mask", "00086000");
509 511
510// invString.AddNameValueLine("base_mask", Helpers.UIntToHexString(item.BaseMask)); 512// invString.AddNameValueLine("base_mask", Helpers.UIntToHexString(item.BaseMask));
511// invString.AddNameValueLine("owner_mask", Helpers.UIntToHexString(item.OwnerMask)); 513// invString.AddNameValueLine("owner_mask", Helpers.UIntToHexString(item.OwnerMask));
512// invString.AddNameValueLine("group_mask", Helpers.UIntToHexString(item.GroupMask)); 514// invString.AddNameValueLine("group_mask", Helpers.UIntToHexString(item.GroupMask));
513// invString.AddNameValueLine("everyone_mask", Helpers.UIntToHexString(item.EveryoneMask)); 515// invString.AddNameValueLine("everyone_mask", Helpers.UIntToHexString(item.EveryoneMask));
514// invString.AddNameValueLine("next_owner_mask", Helpers.UIntToHexString(item.NextOwnerMask)); 516// invString.AddNameValueLine("next_owner_mask", Helpers.UIntToHexString(item.NextOwnerMask));
515 517
516 invString.AddNameValueLine("creator_id", item.CreatorID.ToString()); 518 invString.AddNameValueLine("creator_id", item.CreatorID.ToString());
517 invString.AddNameValueLine("owner_id", item.OwnerID.ToString()); 519 invString.AddNameValueLine("owner_id", item.OwnerID.ToString());
518 520
519 invString.AddNameValueLine("last_owner_id", item.LastOwnerID.ToString()); 521 invString.AddNameValueLine("last_owner_id", item.LastOwnerID.ToString());
520// invString.AddNameValueLine("last_owner_id", item.OwnerID.ToString()); 522// invString.AddNameValueLine("last_owner_id", item.OwnerID.ToString());
521 523
522 invString.AddNameValueLine("group_id", item.GroupID.ToString()); 524 invString.AddNameValueLine("group_id", item.GroupID.ToString());
523 invString.AddSectionEnd(); 525 invString.AddSectionEnd();
524 526
525 invString.AddNameValueLine("asset_id", item.AssetID.ToString()); 527 invString.AddNameValueLine("asset_id", item.AssetID.ToString());
526 invString.AddNameValueLine("type", TaskInventoryItem.Types[item.Type]); 528 invString.AddNameValueLine("type", TaskInventoryItem.Types[item.Type]);
527 invString.AddNameValueLine("inv_type", TaskInventoryItem.InvTypes[item.InvType]); 529 invString.AddNameValueLine("inv_type", TaskInventoryItem.InvTypes[item.InvType]);
528 invString.AddNameValueLine("flags", "00000000"); 530 invString.AddNameValueLine("flags", "00000000");
529 531
530 invString.AddSaleStart(); 532 invString.AddSaleStart();
531 invString.AddNameValueLine("sale_type", "not"); 533 invString.AddNameValueLine("sale_type", "not");
532 invString.AddNameValueLine("sale_price", "0"); 534 invString.AddNameValueLine("sale_price", "0");
533 invString.AddSectionEnd(); 535 invString.AddSectionEnd();
534 536
535 invString.AddNameValueLine("name", item.Name + "|"); 537 invString.AddNameValueLine("name", item.Name + "|");
536 invString.AddNameValueLine("desc", item.Description + "|"); 538 invString.AddNameValueLine("desc", item.Description + "|");
537 539
538 invString.AddNameValueLine("creation_date", item.CreationDate.ToString()); 540 invString.AddNameValueLine("creation_date", item.CreationDate.ToString());
539// invString.AddNameValueLine("creation_date", "1209151453"); 541// invString.AddNameValueLine("creation_date", "1209151453");
540 542
541 invString.AddSectionEnd(); 543 invString.AddSectionEnd();
542 } 544 }
543 } 545 }
@@ -569,8 +571,6 @@ namespace OpenSim.Region.Environment.Scenes
569 } 571 }
570 } 572 }
571 573
572 #region Nested type: InventoryStringBuilder
573
574 public class InventoryStringBuilder 574 public class InventoryStringBuilder
575 { 575 {
576 public string BuildString = String.Empty; 576 public string BuildString = String.Empty;
@@ -596,13 +596,13 @@ namespace OpenSim.Region.Environment.Scenes
596 BuildString += "\tpermissions 0\n"; 596 BuildString += "\tpermissions 0\n";
597 AddSectionStart(); 597 AddSectionStart();
598 } 598 }
599 599
600 public void AddSaleStart() 600 public void AddSaleStart()
601 { 601 {
602 BuildString += "\tsale_info\t0\n"; 602 BuildString += "\tsale_info\t0\n";
603 AddSectionStart(); 603 AddSectionStart();
604 } 604 }
605 605
606 protected void AddSectionStart() 606 protected void AddSectionStart()
607 { 607 {
608 BuildString += "\t{\n"; 608 BuildString += "\t{\n";
@@ -629,7 +629,5 @@ namespace OpenSim.Region.Environment.Scenes
629 { 629 {
630 } 630 }
631 } 631 }
632
633 #endregion
634 } 632 }
635} \ No newline at end of file 633}
diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs
index 3a9e1c2..3dbd809 100644
--- a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs
@@ -56,7 +56,6 @@ namespace OpenSim.Region.Environment.Scenes
56 Something5 = 64, 56 Something5 = 64,
57 Something6 = 128 57 Something6 = 128
58 } 58 }
59
60 [Flags] 59 [Flags]
61 public enum Changed : uint 60 public enum Changed : uint
62 { 61 {
@@ -69,7 +68,6 @@ namespace OpenSim.Region.Environment.Scenes
69 ALLOWED_DROP = 64, 68 ALLOWED_DROP = 64,
70 OWNER = 128 69 OWNER = 128
71 } 70 }
72
73 [Flags] 71 [Flags]
74 public enum TextureAnimFlags : byte 72 public enum TextureAnimFlags : byte
75 { 73 {
@@ -83,36 +81,70 @@ namespace OpenSim.Region.Environment.Scenes
83 SCALE = 0x40 81 SCALE = 0x40
84 } 82 }
85 83
86 84
87 [Serializable] 85 [Serializable]
88 public partial class SceneObjectPart : IScriptHost, ISerializable 86 public partial class SceneObjectPart : IScriptHost, ISerializable
89 { 87 {
90 public uint Category;
91 public Int32 CreationDate;
92 [XmlIgnore] public LLUUID fromAssetID = LLUUID.Zero;
93 public LLUUID GroupID;
94 public LLUUID LastOwnerID;
95 88
89 [XmlIgnore] public PhysicsActor PhysActor = null;
90
91 public LLUUID LastOwnerID;
92 public LLUUID OwnerID;
93 public LLUUID GroupID;
94 public int OwnershipCost;
95 public byte ObjectSaleType;
96 public int SalePrice;
97 public uint Category;
98
96 // TODO: This needs to be persisted in next XML version update! 99 // TODO: This needs to be persisted in next XML version update!
100 [XmlIgnore] public int[] PayPrice = {-2,-2,-2,-2,-2};
101 [XmlIgnore] private Dictionary<LLUUID, scriptEvents> m_scriptEvents = new Dictionary<LLUUID, scriptEvents>();
102 [XmlIgnore] public scriptEvents m_aggregateScriptEvents=0;
97 [XmlIgnore] private LLObject.ObjectFlags LocalFlags = LLObject.ObjectFlags.None; 103 [XmlIgnore] private LLObject.ObjectFlags LocalFlags = LLObject.ObjectFlags.None;
98 [XmlIgnore] public scriptEvents m_aggregateScriptEvents = 0;
99 104
100 105
106 [XmlIgnore] public bool m_IsAttachment = false;
107 [XmlIgnore] public uint m_attachmentPoint = (byte)0;
101 [XmlIgnore] public LLUUID m_attachedAvatar = LLUUID.Zero; 108 [XmlIgnore] public LLUUID m_attachedAvatar = LLUUID.Zero;
102 [XmlIgnore] public LLVector3 m_attachedPos = LLVector3.Zero; 109 [XmlIgnore] public LLVector3 m_attachedPos = LLVector3.Zero;
103 [XmlIgnore] public uint m_attachmentPoint = 0; 110 [XmlIgnore] public LLUUID fromAssetID = LLUUID.Zero;
104 [XmlIgnore] public bool m_IsAttachment; 111
112 [XmlIgnore] public bool m_undoing = false;
113
114 public Int32 CreationDate;
115 public uint ParentID = 0;
105 116
106 private PhysicsVector m_lastRotationalVelocity = PhysicsVector.Zero; 117 private PhysicsVector m_lastRotationalVelocity = PhysicsVector.Zero;
107 protected SceneObjectGroup m_parentGroup; 118 private Vector3 m_sitTargetPosition = new Vector3(0, 0, 0);
119 private Quaternion m_sitTargetOrientation = new Quaternion(0, 0, 0, 1);
120 public LLUUID m_sitTargetAvatar = LLUUID.Zero;
121 [XmlIgnore] public PhysicsVector m_rotationAxis = new PhysicsVector(1f,1f,1f);
122
123 #region Permissions
124
125 public uint BaseMask = (uint)PermissionMask.All;
126 public uint OwnerMask = (uint)PermissionMask.All;
127 public uint GroupMask = (uint)PermissionMask.None;
128 public uint EveryoneMask = (uint)PermissionMask.None;
129 public uint NextOwnerMask = (uint)PermissionMask.All;
130
131 private UndoStack<UndoState> m_undo = new UndoStack<UndoState>(5);
132
133 public LLObject.ObjectFlags Flags = LLObject.ObjectFlags.None;
134
135 public uint ObjectFlags
136 {
137 get { return (uint)Flags; }
138 set { Flags = (LLObject.ObjectFlags)value; }
139 }
140
141 #endregion
108 142
109 protected byte[] m_particleSystem = new byte[0]; 143 protected byte[] m_particleSystem = new byte[0];
110 [XmlIgnore] public PhysicsVector m_rotationAxis = new PhysicsVector(1f, 1f, 1f); 144
111 [XmlIgnore] private Dictionary<LLUUID, scriptEvents> m_scriptEvents = new Dictionary<LLUUID, scriptEvents>(); 145 [XmlIgnore] public uint TimeStampFull = 0;
112 public LLUUID m_sitTargetAvatar = LLUUID.Zero; 146 [XmlIgnore] public uint TimeStampTerse = 0;
113 private Quaternion m_sitTargetOrientation = new Quaternion(0, 0, 0, 1); 147 [XmlIgnore] public uint TimeStampLastActivity = 0; // Will be used for AutoReturn
114 private Vector3 m_sitTargetPosition = new Vector3(0, 0, 0);
115 [XmlIgnore] public bool m_undoing;
116 148
117 /// <summary> 149 /// <summary>
118 /// Only used internally to schedule client updates. 150 /// Only used internally to schedule client updates.
@@ -124,44 +156,24 @@ namespace OpenSim.Region.Environment.Scenes
124 /// </summary> 156 /// </summary>
125 private byte m_updateFlag; 157 private byte m_updateFlag;
126 158
127 public byte ObjectSaleType;
128 public LLUUID OwnerID;
129 public int OwnershipCost;
130 public uint ParentID;
131 [XmlIgnore] public int[] PayPrice = {-2, -2, -2, -2, -2};
132 [XmlIgnore] public PhysicsActor PhysActor;
133 public int SalePrice;
134
135 [XmlIgnore] public uint TimeStampFull;
136 [XmlIgnore] public uint TimeStampLastActivity; // Will be used for AutoReturn
137 [XmlIgnore] public uint TimeStampTerse;
138
139 #region Properties 159 #region Properties
140 160
141 public LLUUID CreatorID; 161 public LLUUID CreatorID;
142 protected LLVector3 m_acceleration;
143 protected LLVector3 m_angularVelocity;
144 private byte m_clickAction;
145 private Color m_color = Color.Black;
146 private string m_description = String.Empty;
147 protected LLVector3 m_groupPosition;
148 private int m_linkNum;
149 162
150 protected uint m_localId; 163 public LLUUID ObjectCreator
151 protected LLObject.MaterialType m_material = 0; 164 {
165 get { return CreatorID; }
166 }
152 167
153 protected string m_name;
154 protected LLVector3 m_offsetPosition;
155 protected ulong m_regionHandle;
156 protected LLVector3 m_rotationalvelocity;
157 protected LLQuaternion m_rotationOffset;
158 protected PrimitiveBaseShape m_shape;
159 private string m_sitName = String.Empty;
160 private string m_text = String.Empty;
161 private byte[] m_TextureAnimation;
162 private string m_touchName = String.Empty;
163 protected LLUUID m_uuid; 168 protected LLUUID m_uuid;
164 protected LLVector3 m_velocity; 169
170 public LLUUID UUID
171 {
172 get { return m_uuid; }
173 set { m_uuid = value; }
174 }
175
176 protected uint m_localId;
165 177
166 public uint LocalId 178 public uint LocalId
167 { 179 {
@@ -169,23 +181,145 @@ namespace OpenSim.Region.Environment.Scenes
169 set { m_localId = value; } 181 set { m_localId = value; }
170 } 182 }
171 183
172 public scriptEvents ScriptEvents 184 protected string m_name;
185
186 public virtual string Name
173 { 187 {
174 get { return m_aggregateScriptEvents; } 188 get { return m_name; }
189 set { m_name = value; }
175 } 190 }
176 191
192 public scriptEvents ScriptEvents
193 {
194 get { return m_aggregateScriptEvents; }
195 }
196
197 protected LLObject.MaterialType m_material = 0;
198
177 public byte Material 199 public byte Material
178 { 200 {
179 get { return (byte) m_material; } 201 get { return (byte) m_material; }
180 set { m_material = (LLObject.MaterialType) value; } 202 set { m_material = (LLObject.MaterialType) value; }
181 } 203 }
182 204
205 protected ulong m_regionHandle;
206
183 public ulong RegionHandle 207 public ulong RegionHandle
184 { 208 {
185 get { return m_regionHandle; } 209 get { return m_regionHandle; }
186 set { m_regionHandle = value; } 210 set { m_regionHandle = value; }
187 } 211 }
188 212
213 public uint GetEffectiveObjectFlags()
214 {
215 LLObject.ObjectFlags f=Flags;
216 if(m_parentGroup == null || m_parentGroup.RootPart == this)
217 f &= ~(LLObject.ObjectFlags.Touch | LLObject.ObjectFlags.Money);
218
219 return (uint)Flags | (uint)LocalFlags;
220 }
221
222 //unkown if this will be kept, added as a way of removing the group position from the group class
223 protected LLVector3 m_groupPosition;
224
225 /// <summary>
226 /// Method for a prim to get it's world position from the group.
227 /// Remember, the Group Position simply gives the position of the group itself
228 /// </summary>
229 /// <returns>A Linked Child Prim objects position in world</returns>
230 public LLVector3 GetWorldPosition()
231 {
232
233 Quaternion parentRot = new Quaternion(
234 ParentGroup.RootPart.RotationOffset.W,
235 ParentGroup.RootPart.RotationOffset.X,
236 ParentGroup.RootPart.RotationOffset.Y,
237 ParentGroup.RootPart.RotationOffset.Z);
238
239 Vector3 axPos
240 = new Vector3(
241 OffsetPosition.X,
242 OffsetPosition.Y,
243 OffsetPosition.Z);
244
245 axPos = parentRot * axPos;
246 LLVector3 translationOffsetPosition = new LLVector3(axPos.x, axPos.y, axPos.z);
247 return GroupPosition + translationOffsetPosition;
248
249 //return (new LLVector3(axiomPos.x, axiomPos.y, axiomPos.z) + AbsolutePosition);
250 }
251
252 /// <summary>
253 /// Gets the rotation of this prim offset by the group rotation
254 /// </summary>
255 /// <returns></returns>
256 public LLQuaternion GetWorldRotation()
257 {
258
259 Quaternion newRot;
260
261 if (this.LinkNum == 0)
262 {
263 newRot = new Quaternion(RotationOffset.W,RotationOffset.X,RotationOffset.Y,RotationOffset.Z);
264
265 }
266 else
267 {
268 Quaternion parentRot = new Quaternion(
269 ParentGroup.RootPart.RotationOffset.W,
270 ParentGroup.RootPart.RotationOffset.X,
271 ParentGroup.RootPart.RotationOffset.Y,
272 ParentGroup.RootPart.RotationOffset.Z);
273
274 Quaternion oldRot
275 = new Quaternion(
276 RotationOffset.W,
277 RotationOffset.X,
278 RotationOffset.Y,
279 RotationOffset.Z);
280
281 newRot = parentRot * oldRot;
282 }
283 return new LLQuaternion(newRot.x, newRot.y, newRot.z, newRot.w);
284
285 //return new LLQuaternion(axiomPartRotation.x, axiomPartRotation.y, axiomPartRotation.z, axiomPartRotation.w);
286
287 }
288
289 public void StoreUndoState()
290 {
291 if (!m_undoing)
292 {
293 if (m_parentGroup != null)
294 {
295 if (m_undo.Count > 0)
296 {
297 UndoState last = m_undo.Peek();
298 if (last != null)
299 {
300 if (last.Compare(this))
301 return;
302 }
303 }
304
305
306 if (m_parentGroup.GetSceneMaxUndo() > 0)
307 {
308 UndoState nUndo = new UndoState(this);
309
310 m_undo.Push(nUndo);
311
312 }
313 }
314 }
315 }
316
317 public void ClearUndoState()
318 {
319 m_undo.Clear();
320 StoreUndoState();
321 }
322
189 public LLVector3 GroupPosition 323 public LLVector3 GroupPosition
190 { 324 {
191 get 325 get
@@ -218,13 +352,16 @@ namespace OpenSim.Region.Environment.Scenes
218 { 352 {
219 try 353 try
220 { 354 {
355
221 // Root prim actually goes at Position 356 // Root prim actually goes at Position
222 if (ParentID == 0) 357 if (ParentID == 0)
223 { 358 {
224 PhysActor.Position = new PhysicsVector(value.X, value.Y, value.Z); 359 PhysActor.Position = new PhysicsVector(value.X, value.Y, value.Z);
360
225 } 361 }
226 else 362 else
227 { 363 {
364
228 // To move the child prim in respect to the group position and rotation we have to calculate 365 // To move the child prim in respect to the group position and rotation we have to calculate
229 366
230 LLVector3 resultingposition = GetWorldPosition(); 367 LLVector3 resultingposition = GetWorldPosition();
@@ -232,7 +369,7 @@ namespace OpenSim.Region.Environment.Scenes
232 LLQuaternion resultingrot = GetWorldRotation(); 369 LLQuaternion resultingrot = GetWorldRotation();
233 PhysActor.Orientation = new Quaternion(resultingrot.W, resultingrot.X, resultingrot.Y, resultingrot.Z); 370 PhysActor.Orientation = new Quaternion(resultingrot.W, resultingrot.X, resultingrot.Y, resultingrot.Z);
234 } 371 }
235 372
236 // Tell the physics engines that this prim changed. 373 // Tell the physics engines that this prim changed.
237 m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor); 374 m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor);
238 } 375 }
@@ -241,9 +378,14 @@ namespace OpenSim.Region.Environment.Scenes
241 Console.WriteLine(e.Message); 378 Console.WriteLine(e.Message);
242 } 379 }
243 } 380 }
381
244 } 382 }
245 } 383 }
246 384
385 private byte[] m_TextureAnimation;
386
387 protected LLVector3 m_offsetPosition;
388
247 public LLVector3 OffsetPosition 389 public LLVector3 OffsetPosition
248 { 390 {
249 get { return m_offsetPosition; } 391 get { return m_offsetPosition; }
@@ -251,19 +393,31 @@ namespace OpenSim.Region.Environment.Scenes
251 { 393 {
252 StoreUndoState(); 394 StoreUndoState();
253 m_offsetPosition = value; 395 m_offsetPosition = value;
254 try 396 try
255 { 397 {
256 // Hack to get the child prim to update world positions in the physics engine 398 // Hack to get the child prim to update world positions in the physics engine
257 ParentGroup.ResetChildPrimPhysicsPositions(); 399 ParentGroup.ResetChildPrimPhysicsPositions();
258 } 400
259 catch (NullReferenceException) 401 }
260 { 402 catch (NullReferenceException)
261 // Ignore, and skip over. 403 {
262 } 404 // Ignore, and skip over.
263 //m_log.Info("[PART]: OFFSET:" + m_offsetPosition.ToString()); 405 }
406 //m_log.Info("[PART]: OFFSET:" + m_offsetPosition.ToString());
264 } 407 }
265 } 408 }
266 409
410 public LLVector3 AbsolutePosition
411 {
412 get {
413 if (m_IsAttachment)
414 return GroupPosition;
415
416 return m_offsetPosition + m_groupPosition; }
417 }
418
419 protected LLQuaternion m_rotationOffset;
420
267 public LLQuaternion RotationOffset 421 public LLQuaternion RotationOffset
268 { 422 {
269 get 423 get
@@ -312,9 +466,13 @@ namespace OpenSim.Region.Environment.Scenes
312 Console.WriteLine(ex.Message); 466 Console.WriteLine(ex.Message);
313 } 467 }
314 } 468 }
469
315 } 470 }
316 } 471 }
317 472
473 protected LLVector3 m_velocity;
474 protected LLVector3 m_rotationalvelocity;
475
318 /// <summary></summary> 476 /// <summary></summary>
319 public LLVector3 Velocity 477 public LLVector3 Velocity
320 { 478 {
@@ -335,8 +493,8 @@ namespace OpenSim.Region.Environment.Scenes
335 493
336 return m_velocity; 494 return m_velocity;
337 } 495 }
338 set 496 set {
339 { 497
340 m_velocity = value; 498 m_velocity = value;
341 if (PhysActor != null) 499 if (PhysActor != null)
342 { 500 {
@@ -346,6 +504,7 @@ namespace OpenSim.Region.Environment.Scenes
346 m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor); 504 m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor);
347 } 505 }
348 } 506 }
507
349 } 508 }
350 } 509 }
351 510
@@ -360,7 +519,7 @@ namespace OpenSim.Region.Environment.Scenes
360 { 519 {
361 if (PhysActor.IsPhysical) 520 if (PhysActor.IsPhysical)
362 { 521 {
363 m_rotationalvelocity.FromBytes(PhysActor.RotationalVelocity.GetBytes(), 0); 522 m_rotationalvelocity.FromBytes(PhysActor.RotationalVelocity.GetBytes(),0);
364 } 523 }
365 } 524 }
366 525
@@ -370,6 +529,8 @@ namespace OpenSim.Region.Environment.Scenes
370 } 529 }
371 530
372 531
532 protected LLVector3 m_angularVelocity;
533
373 /// <summary></summary> 534 /// <summary></summary>
374 public LLVector3 AngularVelocity 535 public LLVector3 AngularVelocity
375 { 536 {
@@ -377,6 +538,8 @@ namespace OpenSim.Region.Environment.Scenes
377 set { m_angularVelocity = value; } 538 set { m_angularVelocity = value; }
378 } 539 }
379 540
541 protected LLVector3 m_acceleration;
542
380 /// <summary></summary> 543 /// <summary></summary>
381 public LLVector3 Acceleration 544 public LLVector3 Acceleration
382 { 545 {
@@ -384,6 +547,16 @@ namespace OpenSim.Region.Environment.Scenes
384 set { m_acceleration = value; } 547 set { m_acceleration = value; }
385 } 548 }
386 549
550 private string m_description = String.Empty;
551
552 public string Description
553 {
554 get { return m_description; }
555 set { m_description = value; }
556 }
557
558 private Color m_color = Color.Black;
559
387 public Color Color 560 public Color Color
388 { 561 {
389 get { return m_color; } 562 get { return m_color; }
@@ -391,7 +564,7 @@ namespace OpenSim.Region.Environment.Scenes
391 { 564 {
392 m_color = value; 565 m_color = value;
393 TriggerScriptChangedEvent(Changed.COLOR); 566 TriggerScriptChangedEvent(Changed.COLOR);
394 567
395 /* ScheduleFullUpdate() need not be called b/c after 568 /* ScheduleFullUpdate() need not be called b/c after
396 * setting the color, the text will be set, so then 569 * setting the color, the text will be set, so then
397 * ScheduleFullUpdate() will be called. */ 570 * ScheduleFullUpdate() will be called. */
@@ -399,6 +572,8 @@ namespace OpenSim.Region.Environment.Scenes
399 } 572 }
400 } 573 }
401 574
575 private string m_text = String.Empty;
576
402 public Vector3 SitTargetPosition 577 public Vector3 SitTargetPosition
403 { 578 {
404 get { return m_sitTargetPosition; } 579 get { return m_sitTargetPosition; }
@@ -412,93 +587,13 @@ namespace OpenSim.Region.Environment.Scenes
412 public string Text 587 public string Text
413 { 588 {
414 get { return m_text; } 589 get { return m_text; }
415 set { m_text = value; }
416 }
417
418 public int LinkNum
419 {
420 get { return m_linkNum; }
421 set
422 {
423 m_linkNum = value;
424 TriggerScriptChangedEvent(Changed.LINK);
425 }
426 }
427
428 public byte ClickAction
429 {
430 get { return m_clickAction; }
431 set { m_clickAction = value; }
432 }
433
434 public PrimitiveBaseShape Shape
435 {
436 get { return m_shape; }
437 set
438 {
439 m_shape = value;
440 TriggerScriptChangedEvent(Changed.SHAPE);
441 }
442 }
443
444 public LLVector3 Scale
445 {
446 get { return m_shape.Scale; }
447 set 590 set
448 { 591 {
449 StoreUndoState(); 592 m_text = value;
450 m_shape.Scale = value;
451 TriggerScriptChangedEvent(Changed.SCALE);
452 }
453 }
454
455 public bool Stopped
456 {
457 get
458 {
459 double threshold = 0.02;
460 return (Math.Abs(Velocity.X) < threshold &&
461 Math.Abs(Velocity.Y) < threshold &&
462 Math.Abs(Velocity.Z) < threshold &&
463 Math.Abs(AngularVelocity.X) < threshold &&
464 Math.Abs(AngularVelocity.Y) < threshold &&
465 Math.Abs(AngularVelocity.Z) < threshold);
466 }
467 }
468
469 public LLUUID ObjectCreator
470 {
471 get { return CreatorID; }
472 }
473
474 public LLUUID UUID
475 {
476 get { return m_uuid; }
477 set { m_uuid = value; }
478 }
479
480 public virtual string Name
481 {
482 get { return m_name; }
483 set { m_name = value; }
484 }
485
486 public LLVector3 AbsolutePosition
487 {
488 get
489 {
490 if (m_IsAttachment)
491 return GroupPosition;
492
493 return m_offsetPosition + m_groupPosition;
494 } 593 }
495 } 594 }
496 595
497 public string Description 596 private string m_sitName = String.Empty;
498 {
499 get { return m_description; }
500 set { m_description = value; }
501 }
502 597
503 public string SitName 598 public string SitName
504 { 599 {
@@ -506,113 +601,39 @@ namespace OpenSim.Region.Environment.Scenes
506 set { m_sitName = value; } 601 set { m_sitName = value; }
507 } 602 }
508 603
604 private string m_touchName = String.Empty;
605
509 public string TouchName 606 public string TouchName
510 { 607 {
511 get { return m_touchName; } 608 get { return m_touchName; }
512 set { m_touchName = value; } 609 set { m_touchName = value; }
513 } 610 }
514 611
515 public uint GetEffectiveObjectFlags() 612 private int m_linkNum = 0;
516 {
517 LLObject.ObjectFlags f = Flags;
518 if (m_parentGroup == null || m_parentGroup.RootPart == this)
519 f &= ~(LLObject.ObjectFlags.Touch | LLObject.ObjectFlags.Money);
520
521 return (uint) Flags | (uint) LocalFlags;
522 }
523
524 /// <summary>
525 /// Method for a prim to get it's world position from the group.
526 /// Remember, the Group Position simply gives the position of the group itself
527 /// </summary>
528 /// <returns>A Linked Child Prim objects position in world</returns>
529 public LLVector3 GetWorldPosition()
530 {
531 Quaternion parentRot = new Quaternion(
532 ParentGroup.RootPart.RotationOffset.W,
533 ParentGroup.RootPart.RotationOffset.X,
534 ParentGroup.RootPart.RotationOffset.Y,
535 ParentGroup.RootPart.RotationOffset.Z);
536
537 Vector3 axPos
538 = new Vector3(
539 OffsetPosition.X,
540 OffsetPosition.Y,
541 OffsetPosition.Z);
542
543 axPos = parentRot * axPos;
544 LLVector3 translationOffsetPosition = new LLVector3(axPos.x, axPos.y, axPos.z);
545 return GroupPosition + translationOffsetPosition;
546
547 //return (new LLVector3(axiomPos.x, axiomPos.y, axiomPos.z) + AbsolutePosition);
548 }
549 613
550 /// <summary> 614 public int LinkNum
551 /// Gets the rotation of this prim offset by the group rotation
552 /// </summary>
553 /// <returns></returns>
554 public LLQuaternion GetWorldRotation()
555 { 615 {
556 Quaternion newRot; 616 get { return m_linkNum; }
557 617 set
558 if (LinkNum == 0) 618 {
559 { 619 m_linkNum = value;
560 newRot = new Quaternion(RotationOffset.W, RotationOffset.X, RotationOffset.Y, RotationOffset.Z); 620 TriggerScriptChangedEvent(Changed.LINK);
561 } 621
562 else
563 {
564 Quaternion parentRot = new Quaternion(
565 ParentGroup.RootPart.RotationOffset.W,
566 ParentGroup.RootPart.RotationOffset.X,
567 ParentGroup.RootPart.RotationOffset.Y,
568 ParentGroup.RootPart.RotationOffset.Z);
569
570 Quaternion oldRot
571 = new Quaternion(
572 RotationOffset.W,
573 RotationOffset.X,
574 RotationOffset.Y,
575 RotationOffset.Z);
576
577 newRot = parentRot * oldRot;
578 } 622 }
579 return new LLQuaternion(newRot.x, newRot.y, newRot.z, newRot.w);
580
581 //return new LLQuaternion(axiomPartRotation.x, axiomPartRotation.y, axiomPartRotation.z, axiomPartRotation.w);
582 } 623 }
583 624
584 public void StoreUndoState() 625 private byte m_clickAction = 0;
626
627 public byte ClickAction
585 { 628 {
586 if (!m_undoing) 629 get { return m_clickAction; }
630 set
587 { 631 {
588 if (m_parentGroup != null) 632 m_clickAction = value;
589 {
590 if (m_undo.Count > 0)
591 {
592 UndoState last = m_undo.Peek();
593 if (last != null)
594 {
595 if (last.Compare(this))
596 return;
597 }
598 }
599
600
601 if (m_parentGroup.GetSceneMaxUndo() > 0)
602 {
603 UndoState nUndo = new UndoState(this);
604
605 m_undo.Push(nUndo);
606 }
607 }
608 } 633 }
609 } 634 }
610 635
611 public void ClearUndoState() 636 protected PrimitiveBaseShape m_shape;
612 {
613 m_undo.Clear();
614 StoreUndoState();
615 }
616 637
617 /// <summary> 638 /// <summary>
618 /// hook to the physics scene to apply impulse 639 /// hook to the physics scene to apply impulse
@@ -624,17 +645,20 @@ namespace OpenSim.Region.Environment.Scenes
624 public void ApplyImpulse(LLVector3 impulsei, bool localGlobalTF) 645 public void ApplyImpulse(LLVector3 impulsei, bool localGlobalTF)
625 { 646 {
626 PhysicsVector impulse = new PhysicsVector(impulsei.X, impulsei.Y, impulsei.Z); 647 PhysicsVector impulse = new PhysicsVector(impulsei.X, impulsei.Y, impulsei.Z);
627 648
628 if (localGlobalTF) 649 if (localGlobalTF)
629 { 650 {
651
630 LLQuaternion grot = GetWorldRotation(); 652 LLQuaternion grot = GetWorldRotation();
631 Quaternion AXgrot = new Quaternion(grot.W, grot.X, grot.Y, grot.Z); 653 Quaternion AXgrot = new Quaternion(grot.W,grot.X,grot.Y,grot.Z);
632 Vector3 AXimpulsei = new Vector3(impulsei.X, impulsei.Y, impulsei.Z); 654 Vector3 AXimpulsei = new Vector3(impulsei.X, impulsei.Y, impulsei.Z);
633 Vector3 newimpulse = AXgrot * AXimpulsei; 655 Vector3 newimpulse = AXgrot * AXimpulsei;
634 impulse = new PhysicsVector(newimpulse.x, newimpulse.y, newimpulse.z); 656 impulse = new PhysicsVector(newimpulse.x, newimpulse.y, newimpulse.z);
657
635 } 658 }
636 else 659 else
637 { 660 {
661
638 if (m_parentGroup != null) 662 if (m_parentGroup != null)
639 { 663 {
640 m_parentGroup.applyImpulse(impulse); 664 m_parentGroup.applyImpulse(impulse);
@@ -652,6 +676,7 @@ namespace OpenSim.Region.Environment.Scenes
652 { 676 {
653 StopMoveToTarget(); 677 StopMoveToTarget();
654 } 678 }
679
655 } 680 }
656 681
657 public void StopMoveToTarget() 682 public void StopMoveToTarget()
@@ -664,48 +689,56 @@ namespace OpenSim.Region.Environment.Scenes
664 if (m_parentGroup != null) 689 if (m_parentGroup != null)
665 { 690 {
666 if (m_parentGroup.Scene != null) 691 if (m_parentGroup.Scene != null)
667 m_parentGroup.Scene.TriggerObjectChanged(LocalId, (uint) val); 692 m_parentGroup.Scene.TriggerObjectChanged(LocalId, (uint)val);
668 } 693 }
669 }
670
671 #endregion
672
673 #region Permissions
674
675 private readonly UndoStack<UndoState> m_undo = new UndoStack<UndoState>(5);
676 public uint BaseMask = (uint) PermissionMask.All;
677 public uint EveryoneMask = (uint) PermissionMask.None;
678 694
679 public LLObject.ObjectFlags Flags = LLObject.ObjectFlags.None; 695 }
680 public uint GroupMask = (uint) PermissionMask.None;
681 public uint NextOwnerMask = (uint) PermissionMask.All;
682 public uint OwnerMask = (uint) PermissionMask.All;
683 696
684 public uint ObjectFlags 697 public PrimitiveBaseShape Shape
685 { 698 {
686 get { return (uint) Flags; } 699 get { return m_shape; }
687 set { Flags = (LLObject.ObjectFlags) value; } 700 set
701 {
702
703 m_shape = value;
704 TriggerScriptChangedEvent(Changed.SHAPE);
705 }
688 } 706 }
689 707
690 #endregion 708 public LLVector3 Scale
691
692 protected SceneObjectPart(SerializationInfo info, StreamingContext context)
693 { 709 {
694 //System.Console.WriteLine("SceneObjectPart Deserialize BGN"); 710 get { return m_shape.Scale; }
695 711 set
696 if (info == null)
697 { 712 {
698 throw new ArgumentNullException("info"); 713 StoreUndoState();
714 m_shape.Scale = value;
715 TriggerScriptChangedEvent(Changed.SCALE);
699 } 716 }
717 }
700 718
701 /* 719 public bool Stopped
702 m_queue = (Queue<SceneObjectPart>)info.GetValue("m_queue", typeof(Queue<SceneObjectPart>)); 720 {
703 m_ids = (List<LLUUID>)info.GetValue("m_ids", typeof(List<LLUUID>)); 721 get {
704 */ 722 double threshold = 0.02;
723 return (Math.Abs(Velocity.X) < threshold &&
724 Math.Abs(Velocity.Y) < threshold &&
725 Math.Abs(Velocity.Z) < threshold &&
726 Math.Abs(AngularVelocity.X) < threshold &&
727 Math.Abs(AngularVelocity.Y) < threshold &&
728 Math.Abs(AngularVelocity.Z) < threshold);
729 }
730 }
705 731
706 //System.Console.WriteLine("SceneObjectPart Deserialize END"); 732 #endregion
733
734 public LLUUID ObjectOwner
735 {
736 get { return OwnerID; }
707 } 737 }
708 738
739 // FIXME, TODO, ERROR: 'ParentGroup' can't be in here, move it out.
740 protected SceneObjectGroup m_parentGroup;
741
709 public SceneObjectGroup ParentGroup 742 public SceneObjectGroup ParentGroup
710 { 743 {
711 get { return m_parentGroup; } 744 get { return m_parentGroup; }
@@ -725,7 +758,7 @@ namespace OpenSim.Region.Environment.Scenes
725 public SceneObjectPart() 758 public SceneObjectPart()
726 { 759 {
727 // It's not necessary to persist this 760 // It's not necessary to persist this
728 m_inventoryFileName = "inventory_" + LLUUID.Random() + ".tmp"; 761 m_inventoryFileName = "inventory_" + LLUUID.Random().ToString() + ".tmp";
729 m_TextureAnimation = new byte[0]; 762 m_TextureAnimation = new byte[0];
730 } 763 }
731 764
@@ -757,13 +790,13 @@ namespace OpenSim.Region.Environment.Scenes
757 CreatorID = OwnerID; 790 CreatorID = OwnerID;
758 LastOwnerID = LLUUID.Zero; 791 LastOwnerID = LLUUID.Zero;
759 UUID = LLUUID.Random(); 792 UUID = LLUUID.Random();
760 LocalId = (localID); 793 LocalId = (uint) (localID);
761 Shape = shape; 794 Shape = shape;
762 // Todo: Add More Object Parameter from above! 795 // Todo: Add More Object Parameter from above!
763 OwnershipCost = 0; 796 OwnershipCost = 0;
764 ObjectSaleType = 0; 797 ObjectSaleType = (byte) 0;
765 SalePrice = 0; 798 SalePrice = 0;
766 Category = 0; 799 Category = (uint) 0;
767 LastOwnerID = CreatorID; 800 LastOwnerID = CreatorID;
768 // End Todo: /// 801 // End Todo: ///
769 GroupPosition = groupPosition; 802 GroupPosition = groupPosition;
@@ -774,20 +807,20 @@ namespace OpenSim.Region.Environment.Scenes
774 AngularVelocity = new LLVector3(0, 0, 0); 807 AngularVelocity = new LLVector3(0, 0, 0);
775 Acceleration = new LLVector3(0, 0, 0); 808 Acceleration = new LLVector3(0, 0, 0);
776 m_TextureAnimation = new byte[0]; 809 m_TextureAnimation = new byte[0];
777 m_inventoryFileName = "inventory_" + LLUUID.Random() + ".tmp"; 810 m_inventoryFileName = "inventory_" + LLUUID.Random().ToString() + ".tmp";
778 811
779 // Prims currently only contain a single folder (Contents). From looking at the Second Life protocol, 812 // Prims currently only contain a single folder (Contents). From looking at the Second Life protocol,
780 // this appears to have the same UUID (!) as the prim. If this isn't the case, one can't drag items from 813 // this appears to have the same UUID (!) as the prim. If this isn't the case, one can't drag items from
781 // the prim into an agent inventory (Linden client reports that the "Object not found for drop" in its log 814 // the prim into an agent inventory (Linden client reports that the "Object not found for drop" in its log
782 m_folderID = UUID; 815 m_folderID = UUID;
783 816
784 Flags = 0; 817 Flags = 0;
785 Flags |= LLObject.ObjectFlags.AllowInventoryDrop | 818 Flags |= LLObject.ObjectFlags.AllowInventoryDrop |
786 LLObject.ObjectFlags.CreateSelected; 819 LLObject.ObjectFlags.CreateSelected;
787 820
788 TrimPermissions(); 821 TrimPermissions();
789 //m_undo = new UndoStack<UndoState>(ParentGroup.GetSceneMaxUndo()); 822 //m_undo = new UndoStack<UndoState>(ParentGroup.GetSceneMaxUndo());
790 823
791 ScheduleFullUpdate(); 824 ScheduleFullUpdate();
792 } 825 }
793 826
@@ -813,149 +846,29 @@ namespace OpenSim.Region.Environment.Scenes
813 CreatorID = creatorID; 846 CreatorID = creatorID;
814 LastOwnerID = lastOwnerID; 847 LastOwnerID = lastOwnerID;
815 UUID = LLUUID.Random(); 848 UUID = LLUUID.Random();
816 LocalId = (localID); 849 LocalId = (uint) (localID);
817 Shape = shape; 850 Shape = shape;
818 OwnershipCost = 0; 851 OwnershipCost = 0;
819 ObjectSaleType = 0; 852 ObjectSaleType = (byte) 0;
820 SalePrice = 0; 853 SalePrice = 0;
821 Category = 0; 854 Category = (uint) 0;
822 LastOwnerID = CreatorID; 855 LastOwnerID = CreatorID;
823 OffsetPosition = position; 856 OffsetPosition = position;
824 RotationOffset = rotation; 857 RotationOffset = rotation;
825 ObjectFlags = flags; 858 ObjectFlags = flags;
826 859
827 // Since we don't store script state, this is only a 'temporary' objectflag now 860 // Since we don't store script state, this is only a 'temporary' objectflag now
828 // If the object is scripted, the script will get loaded and this will be set again 861 // If the object is scripted, the script will get loaded and this will be set again
829 ObjectFlags &= ~(uint) (LLObject.ObjectFlags.Scripted | LLObject.ObjectFlags.Touch); 862 ObjectFlags &= ~(uint)(LLObject.ObjectFlags.Scripted | LLObject.ObjectFlags.Touch);
830 863
831 TrimPermissions(); 864 TrimPermissions();
832 // ApplyPhysics(); 865 // ApplyPhysics();
833 866
834 ScheduleFullUpdate(); 867 ScheduleFullUpdate();
835 } 868 }
836 869
837 #endregion 870 #endregion
838 871
839 #region IScriptHost Members
840
841 public LLUUID ObjectOwner
842 {
843 get { return OwnerID; }
844 }
845
846 public void SetText(string text, Vector3 color, double alpha)
847 {
848 Color = Color.FromArgb(0xff - (int) (alpha * 0xff),
849 (int) (color.x * 0xff),
850 (int) (color.y * 0xff),
851 (int) (color.z * 0xff));
852 SetText(text);
853 }
854
855 #endregion
856
857 #region ISerializable Members
858
859 [SecurityPermission(SecurityAction.LinkDemand,
860 Flags = SecurityPermissionFlag.SerializationFormatter)]
861 public virtual void GetObjectData(
862 SerializationInfo info, StreamingContext context)
863 {
864 if (info == null)
865 {
866 throw new ArgumentNullException("info");
867 }
868
869 info.AddValue("m_inventoryFileName", m_inventoryFileName);
870 info.AddValue("m_folderID", m_folderID.UUID);
871 info.AddValue("PhysActor", PhysActor);
872
873 Dictionary<Guid, TaskInventoryItem> TaskInventory_work = new Dictionary<Guid, TaskInventoryItem>();
874
875 foreach (LLUUID id in TaskInventory.Keys)
876 {
877 TaskInventory_work.Add(id.UUID, TaskInventory[id]);
878 }
879
880 info.AddValue("TaskInventory", TaskInventory_work);
881
882 info.AddValue("LastOwnerID", LastOwnerID.UUID);
883 info.AddValue("OwnerID", OwnerID.UUID);
884 info.AddValue("GroupID", GroupID.UUID);
885
886 info.AddValue("OwnershipCost", OwnershipCost);
887 info.AddValue("ObjectSaleType", ObjectSaleType);
888 info.AddValue("SalePrice", SalePrice);
889 info.AddValue("Category", Category);
890
891 info.AddValue("CreationDate", CreationDate);
892 info.AddValue("ParentID", ParentID);
893
894 info.AddValue("OwnerMask", OwnerMask);
895 info.AddValue("NextOwnerMask", NextOwnerMask);
896 info.AddValue("GroupMask", GroupMask);
897 info.AddValue("EveryoneMask", EveryoneMask);
898 info.AddValue("BaseMask", BaseMask);
899
900 info.AddValue("m_particleSystem", m_particleSystem);
901
902 info.AddValue("TimeStampFull", TimeStampFull);
903 info.AddValue("TimeStampTerse", TimeStampTerse);
904 info.AddValue("TimeStampLastActivity", TimeStampLastActivity);
905
906 info.AddValue("m_updateFlag", m_updateFlag);
907 info.AddValue("CreatorID", CreatorID.UUID);
908
909 info.AddValue("m_inventorySerial", m_inventorySerial);
910 info.AddValue("m_uuid", m_uuid.UUID);
911 info.AddValue("m_localID", m_localId);
912 info.AddValue("m_name", m_name);
913 info.AddValue("m_flags", Flags);
914 info.AddValue("m_material", m_material);
915 info.AddValue("m_regionHandle", m_regionHandle);
916
917 info.AddValue("m_groupPosition.X", m_groupPosition.X);
918 info.AddValue("m_groupPosition.Y", m_groupPosition.Y);
919 info.AddValue("m_groupPosition.Z", m_groupPosition.Z);
920
921 info.AddValue("m_offsetPosition.X", m_offsetPosition.X);
922 info.AddValue("m_offsetPosition.Y", m_offsetPosition.Y);
923 info.AddValue("m_offsetPosition.Z", m_offsetPosition.Z);
924
925 info.AddValue("m_rotationOffset.W", m_rotationOffset.W);
926 info.AddValue("m_rotationOffset.X", m_rotationOffset.X);
927 info.AddValue("m_rotationOffset.Y", m_rotationOffset.Y);
928 info.AddValue("m_rotationOffset.Z", m_rotationOffset.Z);
929
930 info.AddValue("m_velocity.X", m_velocity.X);
931 info.AddValue("m_velocity.Y", m_velocity.Y);
932 info.AddValue("m_velocity.Z", m_velocity.Z);
933
934 info.AddValue("m_rotationalvelocity.X", m_rotationalvelocity.X);
935 info.AddValue("m_rotationalvelocity.Y", m_rotationalvelocity.Y);
936 info.AddValue("m_rotationalvelocity.Z", m_rotationalvelocity.Z);
937
938 info.AddValue("m_angularVelocity.X", m_angularVelocity.X);
939 info.AddValue("m_angularVelocity.Y", m_angularVelocity.Y);
940 info.AddValue("m_angularVelocity.Z", m_angularVelocity.Z);
941
942 info.AddValue("m_acceleration.X", m_acceleration.X);
943 info.AddValue("m_acceleration.Y", m_acceleration.Y);
944 info.AddValue("m_acceleration.Z", m_acceleration.Z);
945
946 info.AddValue("m_description", m_description);
947 info.AddValue("m_color", m_color);
948 info.AddValue("m_text", m_text);
949 info.AddValue("m_sitName", m_sitName);
950 info.AddValue("m_touchName", m_touchName);
951 info.AddValue("m_clickAction", m_clickAction);
952 info.AddValue("m_shape", m_shape);
953 info.AddValue("m_parentGroup", m_parentGroup);
954 info.AddValue("PayPrice", PayPrice);
955 }
956
957 #endregion
958
959 /// <summary> 872 /// <summary>
960 /// Restore this part from the serialized xml representation. 873 /// Restore this part from the serialized xml representation.
961 /// </summary> 874 /// </summary>
@@ -968,9 +881,10 @@ namespace OpenSim.Region.Environment.Scenes
968 881
969 return newobject; 882 return newobject;
970 } 883 }
971 884
972 public void ApplyPhysics(uint rootObjectFlags, bool m_physicalPrim) 885 public void ApplyPhysics(uint rootObjectFlags, bool m_physicalPrim)
973 { 886 {
887
974 bool isPhysical = (((rootObjectFlags & (uint) LLObject.ObjectFlags.Physics) != 0) && m_physicalPrim); 888 bool isPhysical = (((rootObjectFlags & (uint) LLObject.ObjectFlags.Physics) != 0) && m_physicalPrim);
975 bool isPhantom = ((rootObjectFlags & (uint) LLObject.ObjectFlags.Phantom) != 0); 889 bool isPhantom = ((rootObjectFlags & (uint) LLObject.ObjectFlags.Phantom) != 0);
976 890
@@ -988,7 +902,7 @@ namespace OpenSim.Region.Environment.Scenes
988 new PhysicsVector(Scale.X, Scale.Y, Scale.Z), 902 new PhysicsVector(Scale.X, Scale.Y, Scale.Z),
989 new Quaternion(RotationOffset.W, RotationOffset.X, 903 new Quaternion(RotationOffset.W, RotationOffset.X,
990 RotationOffset.Y, RotationOffset.Z), RigidBody); 904 RotationOffset.Y, RotationOffset.Z), RigidBody);
991 905
992 // Basic Physics returns null.. joy joy joy. 906 // Basic Physics returns null.. joy joy joy.
993 if (PhysActor != null) 907 if (PhysActor != null)
994 { 908 {
@@ -1004,15 +918,18 @@ namespace OpenSim.Region.Environment.Scenes
1004 OwnerMask = NextOwnerMask; 918 OwnerMask = NextOwnerMask;
1005 919
1006 TriggerScriptChangedEvent(Changed.OWNER); 920 TriggerScriptChangedEvent(Changed.OWNER);
921
1007 } 922 }
1008 923
1009 public void TrimPermissions() 924 public void TrimPermissions()
1010 { 925 {
1011 BaseMask &= (uint) PermissionMask.All; 926
1012 OwnerMask &= (uint) PermissionMask.All; 927 BaseMask &= (uint)PermissionMask.All;
1013 GroupMask &= (uint) PermissionMask.All; 928 OwnerMask &= (uint)PermissionMask.All;
1014 EveryoneMask &= (uint) PermissionMask.All; 929 GroupMask &= (uint)PermissionMask.All;
1015 NextOwnerMask &= (uint) PermissionMask.All; 930 EveryoneMask &= (uint)PermissionMask.All;
931 NextOwnerMask &= (uint)PermissionMask.All;
932
1016 } 933 }
1017 934
1018 /// <summary> 935 /// <summary>
@@ -1046,24 +963,25 @@ namespace OpenSim.Region.Environment.Scenes
1046 Vector3 rOrigin = iray.Origin; 963 Vector3 rOrigin = iray.Origin;
1047 Vector3 rDirection = iray.Direction; 964 Vector3 rDirection = iray.Direction;
1048 965
966
1049 967
1050 //rDirection = rDirection.Normalize(); 968 //rDirection = rDirection.Normalize();
1051 // Buidling the first part of the Quadratic equation 969 // Buidling the first part of the Quadratic equation
1052 Vector3 r2ndDirection = rDirection * rDirection; 970 Vector3 r2ndDirection = rDirection*rDirection;
1053 float itestPart1 = r2ndDirection.x + r2ndDirection.y + r2ndDirection.z; 971 float itestPart1 = r2ndDirection.x + r2ndDirection.y + r2ndDirection.z;
1054 972
1055 // Buidling the second part of the Quadratic equation 973 // Buidling the second part of the Quadratic equation
1056 Vector3 tmVal2 = rOrigin - vAbsolutePosition; 974 Vector3 tmVal2 = rOrigin - vAbsolutePosition;
1057 Vector3 r2Direction = rDirection * 2.0f; 975 Vector3 r2Direction = rDirection*2.0f;
1058 Vector3 tmVal3 = r2Direction * tmVal2; 976 Vector3 tmVal3 = r2Direction*tmVal2;
1059 977
1060 float itestPart2 = tmVal3.x + tmVal3.y + tmVal3.z; 978 float itestPart2 = tmVal3.x + tmVal3.y + tmVal3.z;
1061 979
1062 // Buidling the third part of the Quadratic equation 980 // Buidling the third part of the Quadratic equation
1063 Vector3 tmVal4 = rOrigin * rOrigin; 981 Vector3 tmVal4 = rOrigin*rOrigin;
1064 Vector3 tmVal5 = vAbsolutePosition * vAbsolutePosition; 982 Vector3 tmVal5 = vAbsolutePosition*vAbsolutePosition;
1065 983
1066 Vector3 tmVal6 = vAbsolutePosition * rOrigin; 984 Vector3 tmVal6 = vAbsolutePosition*rOrigin;
1067 985
1068 986
1069 // Set Radius to the largest dimention of the prim 987 // Set Radius to the largest dimention of the prim
@@ -1085,21 +1003,21 @@ namespace OpenSim.Region.Environment.Scenes
1085 //radius = radius; 1003 //radius = radius;
1086 1004
1087 float itestPart3 = tmVal4.x + tmVal4.y + tmVal4.z + tmVal5.x + tmVal5.y + tmVal5.z - 1005 float itestPart3 = tmVal4.x + tmVal4.y + tmVal4.z + tmVal5.x + tmVal5.y + tmVal5.z -
1088 (2.0f * (tmVal6.x + tmVal6.y + tmVal6.z + (radius * radius))); 1006 (2.0f*(tmVal6.x + tmVal6.y + tmVal6.z + (radius*radius)));
1089 1007
1090 // Yuk Quadradrics.. Solve first 1008 // Yuk Quadradrics.. Solve first
1091 float rootsqr = (itestPart2 * itestPart2) - (4.0f * itestPart1 * itestPart3); 1009 float rootsqr = (itestPart2*itestPart2) - (4.0f*itestPart1*itestPart3);
1092 if (rootsqr < 0.0f) 1010 if (rootsqr < 0.0f)
1093 { 1011 {
1094 // No intersection 1012 // No intersection
1095 return returnresult; 1013 return returnresult;
1096 } 1014 }
1097 float root = ((-itestPart2) - (float) Math.Sqrt(rootsqr)) / (itestPart1 * 2.0f); 1015 float root = ((-itestPart2) - (float) Math.Sqrt((double) rootsqr))/(itestPart1*2.0f);
1098 1016
1099 if (root < 0.0f) 1017 if (root < 0.0f)
1100 { 1018 {
1101 // perform second quadratic root solution 1019 // perform second quadratic root solution
1102 root = ((-itestPart2) + (float) Math.Sqrt(rootsqr)) / (itestPart1 * 2.0f); 1020 root = ((-itestPart2) + (float) Math.Sqrt((double) rootsqr))/(itestPart1*2.0f);
1103 1021
1104 // is there any intersection? 1022 // is there any intersection?
1105 if (root < 0.0f) 1023 if (root < 0.0f)
@@ -1112,8 +1030,8 @@ namespace OpenSim.Region.Environment.Scenes
1112 // We got an intersection. putting together an EntityIntersection object with the 1030 // We got an intersection. putting together an EntityIntersection object with the
1113 // intersection information 1031 // intersection information
1114 Vector3 ipoint = 1032 Vector3 ipoint =
1115 new Vector3(iray.Origin.x + (iray.Direction.x * root), iray.Origin.y + (iray.Direction.y * root), 1033 new Vector3(iray.Origin.x + (iray.Direction.x*root), iray.Origin.y + (iray.Direction.y*root),
1116 iray.Origin.z + (iray.Direction.z * root)); 1034 iray.Origin.z + (iray.Direction.z*root));
1117 1035
1118 returnresult.HitTF = true; 1036 returnresult.HitTF = true;
1119 returnresult.ipoint = ipoint; 1037 returnresult.ipoint = ipoint;
@@ -1174,7 +1092,7 @@ namespace OpenSim.Region.Environment.Scenes
1174 1092
1175 // Variables prefixed with AX are Axiom.Math copies of the LL variety. 1093 // Variables prefixed with AX are Axiom.Math copies of the LL variety.
1176 1094
1177 Quaternion AXrot = new Quaternion(rot.W, rot.X, rot.Y, rot.Z); 1095 Quaternion AXrot = new Quaternion(rot.W,rot.X,rot.Y,rot.Z);
1178 AXrot.Normalize(); 1096 AXrot.Normalize();
1179 1097
1180 Vector3 AXpos = new Vector3(pos.X, pos.Y, pos.Z); 1098 Vector3 AXpos = new Vector3(pos.X, pos.Y, pos.Z);
@@ -1183,33 +1101,31 @@ namespace OpenSim.Region.Environment.Scenes
1183 // it's different for each vertex because we've got to rotate it 1101 // it's different for each vertex because we've got to rotate it
1184 // to get the world position of the vertex to produce the Oriented Bounding Box 1102 // to get the world position of the vertex to produce the Oriented Bounding Box
1185 1103
1186 Vector3 tScale = new Vector3(); 1104 Vector3 tScale = new Vector3();
1187 1105
1188 Vector3 AXscale = new Vector3(m_shape.Scale.X * 0.5f, m_shape.Scale.Y * 0.5f, m_shape.Scale.Z * 0.5f); 1106 Vector3 AXscale = new Vector3(m_shape.Scale.X * 0.5f, m_shape.Scale.Y * 0.5f, m_shape.Scale.Z * 0.5f);
1189 1107
1190 //Vector3 pScale = (AXscale) - (AXrot.Inverse() * (AXscale)); 1108 //Vector3 pScale = (AXscale) - (AXrot.Inverse() * (AXscale));
1191 //Vector3 nScale = (AXscale * -1) - (AXrot.Inverse() * (AXscale * -1)); 1109 //Vector3 nScale = (AXscale * -1) - (AXrot.Inverse() * (AXscale * -1));
1192 1110
1193 // rScale is the rotated offset to find a vertex based on the scale and the world rotation. 1111 // rScale is the rotated offset to find a vertex based on the scale and the world rotation.
1194 Vector3 rScale = new Vector3(); 1112 Vector3 rScale = new Vector3();
1195 1113
1196 // Get Vertexes for Faces Stick them into ABCD for each Face 1114 // Get Vertexes for Faces Stick them into ABCD for each Face
1197 // Form: Face<vertex>[face] that corresponds to the below diagram 1115 // Form: Face<vertex>[face] that corresponds to the below diagram
1198
1199 #region ABCD Face Vertex Map Comment Diagram 1116 #region ABCD Face Vertex Map Comment Diagram
1200
1201 // A _________ B 1117 // A _________ B
1202 // | | 1118 // | |
1203 // | 4 top | 1119 // | 4 top |
1204 // |_________| 1120 // |_________|
1205 // C D 1121 // C D
1206 1122
1207 // A _________ B 1123 // A _________ B
1208 // | Back | 1124 // | Back |
1209 // | 3 | 1125 // | 3 |
1210 // |_________| 1126 // |_________|
1211 // C D 1127 // C D
1212 1128
1213 // A _________ B B _________ A 1129 // A _________ B B _________ A
1214 // | Left | | Right | 1130 // | Left | | Right |
1215 // | 0 | | 2 | 1131 // | 0 | | 2 |
@@ -1227,15 +1143,13 @@ namespace OpenSim.Region.Environment.Scenes
1227 // | 5 bot | 1143 // | 5 bot |
1228 // |_________| 1144 // |_________|
1229 // A B 1145 // A B
1230
1231 #endregion 1146 #endregion
1232 1147
1233 #region Plane Decomposition of Oriented Bounding Box 1148 #region Plane Decomposition of Oriented Bounding Box
1234
1235 tScale = new Vector3(AXscale.x, -AXscale.y, AXscale.z); 1149 tScale = new Vector3(AXscale.x, -AXscale.y, AXscale.z);
1236 rScale = ((AXrot * tScale)); 1150 rScale = ((AXrot * tScale));
1237 vertexes[0] = (new Vector3((pos.X + rScale.x), (pos.Y + rScale.y), (pos.Z + rScale.z))); 1151 vertexes[0] = (new Vector3((pos.X + rScale.x), (pos.Y + rScale.y), (pos.Z + rScale.z)));
1238 // vertexes[0].x = pos.X + vertexes[0].x; 1152 // vertexes[0].x = pos.X + vertexes[0].x;
1239 //vertexes[0].y = pos.Y + vertexes[0].y; 1153 //vertexes[0].y = pos.Y + vertexes[0].y;
1240 //vertexes[0].z = pos.Z + vertexes[0].z; 1154 //vertexes[0].z = pos.Z + vertexes[0].z;
1241 1155
@@ -1247,8 +1161,8 @@ namespace OpenSim.Region.Environment.Scenes
1247 rScale = ((AXrot * tScale)); 1161 rScale = ((AXrot * tScale));
1248 vertexes[1] = (new Vector3((pos.X + rScale.x), (pos.Y + rScale.y), (pos.Z + rScale.z))); 1162 vertexes[1] = (new Vector3((pos.X + rScale.x), (pos.Y + rScale.y), (pos.Z + rScale.z)));
1249 1163
1250 // vertexes[1].x = pos.X + vertexes[1].x; 1164 // vertexes[1].x = pos.X + vertexes[1].x;
1251 // vertexes[1].y = pos.Y + vertexes[1].y; 1165 // vertexes[1].y = pos.Y + vertexes[1].y;
1252 //vertexes[1].z = pos.Z + vertexes[1].z; 1166 //vertexes[1].z = pos.Z + vertexes[1].z;
1253 1167
1254 FaceB[0] = vertexes[1]; 1168 FaceB[0] = vertexes[1];
@@ -1273,8 +1187,8 @@ namespace OpenSim.Region.Environment.Scenes
1273 vertexes[3] = (new Vector3((pos.X + rScale.x), (pos.Y + rScale.y), (pos.Z + rScale.z))); 1187 vertexes[3] = (new Vector3((pos.X + rScale.x), (pos.Y + rScale.y), (pos.Z + rScale.z)));
1274 1188
1275 //vertexes[3].x = pos.X + vertexes[3].x; 1189 //vertexes[3].x = pos.X + vertexes[3].x;
1276 // vertexes[3].y = pos.Y + vertexes[3].y; 1190 // vertexes[3].y = pos.Y + vertexes[3].y;
1277 // vertexes[3].z = pos.Z + vertexes[3].z; 1191 // vertexes[3].z = pos.Z + vertexes[3].z;
1278 1192
1279 FaceD[0] = vertexes[3]; 1193 FaceD[0] = vertexes[3];
1280 FaceC[1] = vertexes[3]; 1194 FaceC[1] = vertexes[3];
@@ -1284,9 +1198,9 @@ namespace OpenSim.Region.Environment.Scenes
1284 rScale = ((AXrot * tScale)); 1198 rScale = ((AXrot * tScale));
1285 vertexes[4] = (new Vector3((pos.X + rScale.x), (pos.Y + rScale.y), (pos.Z + rScale.z))); 1199 vertexes[4] = (new Vector3((pos.X + rScale.x), (pos.Y + rScale.y), (pos.Z + rScale.z)));
1286 1200
1287 // vertexes[4].x = pos.X + vertexes[4].x; 1201 // vertexes[4].x = pos.X + vertexes[4].x;
1288 // vertexes[4].y = pos.Y + vertexes[4].y; 1202 // vertexes[4].y = pos.Y + vertexes[4].y;
1289 // vertexes[4].z = pos.Z + vertexes[4].z; 1203 // vertexes[4].z = pos.Z + vertexes[4].z;
1290 1204
1291 FaceB[1] = vertexes[4]; 1205 FaceB[1] = vertexes[4];
1292 FaceA[2] = vertexes[4]; 1206 FaceA[2] = vertexes[4];
@@ -1296,9 +1210,9 @@ namespace OpenSim.Region.Environment.Scenes
1296 rScale = ((AXrot * tScale)); 1210 rScale = ((AXrot * tScale));
1297 vertexes[5] = (new Vector3((pos.X + rScale.x), (pos.Y + rScale.y), (pos.Z + rScale.z))); 1211 vertexes[5] = (new Vector3((pos.X + rScale.x), (pos.Y + rScale.y), (pos.Z + rScale.z)));
1298 1212
1299 // vertexes[5].x = pos.X + vertexes[5].x; 1213 // vertexes[5].x = pos.X + vertexes[5].x;
1300 // vertexes[5].y = pos.Y + vertexes[5].y; 1214 // vertexes[5].y = pos.Y + vertexes[5].y;
1301 // vertexes[5].z = pos.Z + vertexes[5].z; 1215 // vertexes[5].z = pos.Z + vertexes[5].z;
1302 1216
1303 FaceD[1] = vertexes[5]; 1217 FaceD[1] = vertexes[5];
1304 FaceC[2] = vertexes[5]; 1218 FaceC[2] = vertexes[5];
@@ -1308,9 +1222,9 @@ namespace OpenSim.Region.Environment.Scenes
1308 rScale = ((AXrot * tScale)); 1222 rScale = ((AXrot * tScale));
1309 vertexes[6] = (new Vector3((pos.X + rScale.x), (pos.Y + rScale.y), (pos.Z + rScale.z))); 1223 vertexes[6] = (new Vector3((pos.X + rScale.x), (pos.Y + rScale.y), (pos.Z + rScale.z)));
1310 1224
1311 // vertexes[6].x = pos.X + vertexes[6].x; 1225 // vertexes[6].x = pos.X + vertexes[6].x;
1312 // vertexes[6].y = pos.Y + vertexes[6].y; 1226 // vertexes[6].y = pos.Y + vertexes[6].y;
1313 // vertexes[6].z = pos.Z + vertexes[6].z; 1227 // vertexes[6].z = pos.Z + vertexes[6].z;
1314 1228
1315 FaceB[2] = vertexes[6]; 1229 FaceB[2] = vertexes[6];
1316 FaceA[3] = vertexes[6]; 1230 FaceA[3] = vertexes[6];
@@ -1320,36 +1234,35 @@ namespace OpenSim.Region.Environment.Scenes
1320 rScale = ((AXrot * tScale)); 1234 rScale = ((AXrot * tScale));
1321 vertexes[7] = (new Vector3((pos.X + rScale.x), (pos.Y + rScale.y), (pos.Z + rScale.z))); 1235 vertexes[7] = (new Vector3((pos.X + rScale.x), (pos.Y + rScale.y), (pos.Z + rScale.z)));
1322 1236
1323 // vertexes[7].x = pos.X + vertexes[7].x; 1237 // vertexes[7].x = pos.X + vertexes[7].x;
1324 // vertexes[7].y = pos.Y + vertexes[7].y; 1238 // vertexes[7].y = pos.Y + vertexes[7].y;
1325 // vertexes[7].z = pos.Z + vertexes[7].z; 1239 // vertexes[7].z = pos.Z + vertexes[7].z;
1326 1240
1327 FaceD[2] = vertexes[7]; 1241 FaceD[2] = vertexes[7];
1328 FaceC[3] = vertexes[7]; 1242 FaceC[3] = vertexes[7];
1329 FaceD[5] = vertexes[7]; 1243 FaceD[5] = vertexes[7];
1330
1331 #endregion 1244 #endregion
1332 1245
1333 // Get our plane normals 1246 // Get our plane normals
1334 for (int i = 0; i < 6; i++) 1247 for (int i = 0; i < 6; i++)
1335 { 1248 {
1336 //m_log.Info("[FACECALCULATION]: FaceA[" + i + "]=" + FaceA[i] + " FaceB[" + i + "]=" + FaceB[i] + " FaceC[" + i + "]=" + FaceC[i] + " FaceD[" + i + "]=" + FaceD[i]); 1249 //m_log.Info("[FACECALCULATION]: FaceA[" + i + "]=" + FaceA[i] + " FaceB[" + i + "]=" + FaceB[i] + " FaceC[" + i + "]=" + FaceC[i] + " FaceD[" + i + "]=" + FaceD[i]);
1337 1250
1338 // Our Plane direction 1251 // Our Plane direction
1339 AmBa = FaceA[i] - FaceB[i]; 1252 AmBa = FaceA[i] - FaceB[i];
1340 AmBb = FaceB[i] - FaceC[i]; 1253 AmBb = FaceB[i] - FaceC[i];
1341 1254
1342 cross = AmBb.Cross(AmBa); 1255 cross = AmBb.Cross(AmBa);
1343 1256
1344 // normalize the cross product to get the normal. 1257 // normalize the cross product to get the normal.
1345 normals[i] = cross / cross.Length; 1258 normals[i] = cross / cross.Length;
1346 1259
1347 //m_log.Info("[NORMALS]: normals[ " + i + "]" + normals[i].ToString()); 1260 //m_log.Info("[NORMALS]: normals[ " + i + "]" + normals[i].ToString());
1348 //distance[i] = (normals[i].x * AmBa.x + normals[i].y * AmBa.y + normals[i].z * AmBa.z) * -1; 1261 //distance[i] = (normals[i].x * AmBa.x + normals[i].y * AmBa.y + normals[i].z * AmBa.z) * -1;
1349 } 1262 }
1350 1263
1351 EntityIntersection returnresult = new EntityIntersection(); 1264 EntityIntersection returnresult = new EntityIntersection();
1352 1265
1353 returnresult.distance = 1024; 1266 returnresult.distance = 1024;
1354 float c = 0; 1267 float c = 0;
1355 float a = 0; 1268 float a = 0;
@@ -1357,59 +1270,57 @@ namespace OpenSim.Region.Environment.Scenes
1357 Vector3 q = new Vector3(); 1270 Vector3 q = new Vector3();
1358 1271
1359 #region OBB Version 2 Experiment 1272 #region OBB Version 2 Experiment
1360
1361 //float fmin = 999999; 1273 //float fmin = 999999;
1362 //float fmax = -999999; 1274 //float fmax = -999999;
1363 //float s = 0; 1275 //float s = 0;
1364 1276
1365 //for (int i=0;i<6;i++) 1277 //for (int i=0;i<6;i++)
1366 //{ 1278 //{
1367 //s = iray.Direction.Dot(normals[i]); 1279 //s = iray.Direction.Dot(normals[i]);
1368 //d = normals[i].Dot(FaceB[i]); 1280 //d = normals[i].Dot(FaceB[i]);
1369 1281
1370 //if (s == 0) 1282 //if (s == 0)
1371 //{ 1283 //{
1372 //if (iray.Origin.Dot(normals[i]) > d) 1284 //if (iray.Origin.Dot(normals[i]) > d)
1373 //{ 1285 //{
1374 //return returnresult; 1286 //return returnresult;
1375 //} 1287 //}
1376 // else 1288 // else
1377 //{ 1289 //{
1378 //continue; 1290 //continue;
1379 //} 1291 //}
1380 //} 1292 //}
1381 //a = (d - iray.Origin.Dot(normals[i])) / s; 1293 //a = (d - iray.Origin.Dot(normals[i])) / s;
1382 //if ( iray.Direction.Dot(normals[i]) < 0) 1294 //if ( iray.Direction.Dot(normals[i]) < 0)
1383 //{ 1295 //{
1384 //if (a > fmax) 1296 //if (a > fmax)
1385 //{ 1297 //{
1386 //if (a > fmin) 1298 //if (a > fmin)
1387 //{ 1299 //{
1388 //return returnresult; 1300 //return returnresult;
1389 //} 1301 //}
1390 //fmax = a; 1302 //fmax = a;
1391 //} 1303 //}
1392 1304
1393 //} 1305 //}
1394 //else 1306 //else
1395 //{ 1307 //{
1396 //if (a < fmin) 1308 //if (a < fmin)
1397 //{ 1309 //{
1398 //if (a < 0 || a < fmax) 1310 //if (a < 0 || a < fmax)
1399 //{ 1311 //{
1400 //return returnresult; 1312 //return returnresult;
1401 //} 1313 //}
1402 //fmin = a; 1314 //fmin = a;
1403 //} 1315 //}
1404 //} 1316 //}
1405 //} 1317 //}
1406 //if (fmax > 0) 1318 //if (fmax > 0)
1407 // a= fmax; 1319 // a= fmax;
1408 //else 1320 //else
1409 // a=fmin; 1321 // a=fmin;
1410 1322
1411 //q = iray.Origin + a * iray.Direction; 1323 //q = iray.Origin + a * iray.Direction;
1412
1413 #endregion 1324 #endregion
1414 1325
1415 // Loop over faces (6 of them) 1326 // Loop over faces (6 of them)
@@ -1430,6 +1341,7 @@ namespace OpenSim.Region.Environment.Scenes
1430 // If the normal is pointing outside the object 1341 // If the normal is pointing outside the object
1431 if (iray.Direction.Dot(normals[i]) < 0 || !frontFacesOnly) 1342 if (iray.Direction.Dot(normals[i]) < 0 || !frontFacesOnly)
1432 { 1343 {
1344
1433 if (faceCenters) 1345 if (faceCenters)
1434 { 1346 {
1435 q = AXpos + a * AAfacenormals[i]; //(FaceA[i] + FaceB[i] + FaceC[1] + FaceD[i]) / 4f; 1347 q = AXpos + a * AAfacenormals[i]; //(FaceA[i] + FaceB[i] + FaceC[1] + FaceD[i]) / 4f;
@@ -1439,13 +1351,13 @@ namespace OpenSim.Region.Environment.Scenes
1439 q = iray.Origin + a * iray.Direction; 1351 q = iray.Origin + a * iray.Direction;
1440 } 1352 }
1441 1353
1442 float distance2 = (float) GetDistanceTo(q, AXpos); 1354 float distance2 = (float)GetDistanceTo(q, AXpos);
1443 // Is this the closest hit to the object's origin? 1355 // Is this the closest hit to the object's origin?
1444 if (faceCenters) 1356 if (faceCenters)
1445 { 1357 {
1446 distance2 = (float) GetDistanceTo(q, iray.Origin); 1358 distance2 = (float)GetDistanceTo(q, iray.Origin);
1447 } 1359 }
1448 1360
1449 1361
1450 if (distance2 < returnresult.distance) 1362 if (distance2 < returnresult.distance)
1451 { 1363 {
@@ -1456,12 +1368,14 @@ namespace OpenSim.Region.Environment.Scenes
1456 //m_log.Info("[POINT]: " + q.ToString()); 1368 //m_log.Info("[POINT]: " + q.ToString());
1457 returnresult.normal = normals[i]; 1369 returnresult.normal = normals[i];
1458 returnresult.AAfaceNormal = AAfacenormals[i]; 1370 returnresult.AAfaceNormal = AAfacenormals[i];
1371
1459 } 1372 }
1460 } 1373 }
1374
1461 } 1375 }
1462 return returnresult; 1376 return returnresult;
1463 } 1377 }
1464 1378
1465 // Use this for attachments! LocalID should be avatar's localid 1379 // Use this for attachments! LocalID should be avatar's localid
1466 public void SetParentLocalId(uint localID) 1380 public void SetParentLocalId(uint localID)
1467 { 1381 {
@@ -1471,14 +1385,14 @@ namespace OpenSim.Region.Environment.Scenes
1471 public void SetAttachmentPoint(uint AttachmentPoint) 1385 public void SetAttachmentPoint(uint AttachmentPoint)
1472 { 1386 {
1473 m_attachmentPoint = AttachmentPoint; 1387 m_attachmentPoint = AttachmentPoint;
1474 1388
1475 // save the attachment point. 1389 // save the attachment point.
1476 //if (AttachmentPoint != 0) 1390 //if (AttachmentPoint != 0)
1477 //{ 1391 //{
1478 m_shape.State = (byte) AttachmentPoint; 1392 m_shape.State = (byte)AttachmentPoint;
1479 //} 1393 //}
1394
1480 } 1395 }
1481
1482 /// <summary> 1396 /// <summary>
1483 /// 1397 ///
1484 /// </summary> 1398 /// </summary>
@@ -1500,12 +1414,13 @@ namespace OpenSim.Region.Environment.Scenes
1500 PhysActor.Buoyancy = fvalue; 1414 PhysActor.Buoyancy = fvalue;
1501 } 1415 }
1502 } 1416 }
1503 1417
1504 public void SetAxisRotation(int axis, int rotate) 1418 public void SetAxisRotation(int axis, int rotate)
1505 { 1419 {
1506 if (m_parentGroup != null) 1420 if (m_parentGroup != null)
1507 { 1421 {
1508 m_parentGroup.SetAxisRotation(axis, rotate); 1422 m_parentGroup.SetAxisRotation(axis, rotate);
1423
1509 } 1424 }
1510 } 1425 }
1511 1426
@@ -1527,9 +1442,10 @@ namespace OpenSim.Region.Environment.Scenes
1527 { 1442 {
1528 PhysActor.FloatOnWater = false; 1443 PhysActor.FloatOnWater = false;
1529 } 1444 }
1445
1530 } 1446 }
1531 } 1447 }
1532 1448
1533 1449
1534 public LLVector3 GetSitTargetPositionLL() 1450 public LLVector3 GetSitTargetPositionLL()
1535 { 1451 {
@@ -1600,403 +1516,66 @@ namespace OpenSim.Region.Environment.Scenes
1600 return part; 1516 return part;
1601 } 1517 }
1602 1518
1603 /// <summary> 1519 #region Copying
1604 /// Reset LLUUIDs for this part. This involves generate this part's own LLUUID and
1605 /// generating new LLUUIDs for all the items in the inventory.
1606 /// </summary>
1607 /// <param name="linkNum">Link number for the part</param>
1608 public void ResetIDs(int linkNum)
1609 {
1610 UUID = LLUUID.Random();
1611 LinkNum = linkNum;
1612
1613 ResetInventoryIDs();
1614 }
1615
1616 public void UpdatePermissions(LLUUID AgentID, byte field, uint localID, uint mask, byte addRemTF)
1617 {
1618 bool set = addRemTF == 1;
1619
1620 // Are we the owner?
1621 if (AgentID == OwnerID)
1622 {
1623 switch (field)
1624 {
1625 case 2:
1626 OwnerMask = ApplyMask(OwnerMask, set, mask);
1627 break;
1628 case 4:
1629 GroupMask = ApplyMask(GroupMask, set, mask);
1630 break;
1631 case 8:
1632 EveryoneMask = ApplyMask(EveryoneMask, set, mask);
1633 break;
1634 case 16:
1635 NextOwnerMask = ApplyMask(NextOwnerMask, set, mask);
1636 break;
1637 }
1638 SendFullUpdateToAllClients();
1639
1640 SendObjectPropertiesToClient(AgentID);
1641 }
1642 }
1643
1644 private void SendObjectPropertiesToClient(LLUUID AgentID)
1645 {
1646 List<ScenePresence> avatars = m_parentGroup.GetScenePresences();
1647 for (int i = 0; i < avatars.Count; i++)
1648 {
1649 // Ugly reference :(
1650 if (avatars[i].UUID == AgentID)
1651 {
1652 m_parentGroup.GetProperties(avatars[i].ControllingClient);
1653 }
1654 }
1655 }
1656
1657 private uint ApplyMask(uint val, bool set, uint mask)
1658 {
1659 if (set)
1660 {
1661 return val |= mask;
1662 }
1663 else
1664 {
1665 return val &= ~mask;
1666 }
1667 }
1668
1669 public virtual void UpdateMovement()
1670 {
1671 }
1672
1673 public void PhysicsOutOfBounds(PhysicsVector pos)
1674 {
1675 m_log.Info("[PHYSICS]: Physical Object went out of bounds.");
1676 RemFlag(LLObject.ObjectFlags.Physics);
1677 DoPhysicsPropertyUpdate(false, true);
1678 //m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor);
1679 }
1680
1681 public virtual void OnGrab(LLVector3 offsetPos, IClientAPI remoteClient)
1682 {
1683 }
1684
1685
1686 public void SetText(string text)
1687 {
1688 Text = text;
1689 ScheduleFullUpdate();
1690 }
1691
1692 public int registerTargetWaypoint(LLVector3 target, float tolerance)
1693 {
1694 if (m_parentGroup != null)
1695 {
1696 return m_parentGroup.registerTargetWaypoint(target, tolerance);
1697 }
1698 return 0;
1699 }
1700
1701 public void unregisterTargetWaypoint(int handle)
1702 {
1703 if (m_parentGroup != null)
1704 {
1705 m_parentGroup.unregisterTargetWaypoint(handle);
1706 }
1707 }
1708
1709
1710 public void Undo()
1711 {
1712 if (m_undo.Count > 0)
1713 {
1714 UndoState goback = m_undo.Pop();
1715 if (goback != null)
1716 goback.PlaybackState(this);
1717 }
1718 }
1719
1720 public void SetScriptEvents(LLUUID scriptid, int events)
1721 {
1722 scriptEvents oldparts;
1723 lock (m_scriptEvents)
1724 {
1725 if (m_scriptEvents.ContainsKey(scriptid))
1726 {
1727 oldparts = m_scriptEvents[scriptid];
1728
1729 // remove values from aggregated script events
1730 m_scriptEvents[scriptid] = (scriptEvents) events;
1731 }
1732 else
1733 {
1734 m_scriptEvents.Add(scriptid, (scriptEvents) events);
1735 }
1736 }
1737 aggregateScriptEvents();
1738 }
1739
1740 public void RemoveScriptEvents(LLUUID scriptid)
1741 {
1742 lock (m_scriptEvents)
1743 {
1744 if (m_scriptEvents.ContainsKey(scriptid))
1745 {
1746 scriptEvents oldparts = scriptEvents.None;
1747 oldparts = m_scriptEvents[scriptid];
1748
1749 // remove values from aggregated script events
1750 m_aggregateScriptEvents &= ~oldparts;
1751 m_scriptEvents.Remove(scriptid);
1752 }
1753 }
1754 aggregateScriptEvents();
1755 }
1756
1757 public void aggregateScriptEvents()
1758 {
1759 // Aggregate script events
1760 lock (m_scriptEvents)
1761 {
1762 foreach (scriptEvents s in m_scriptEvents.Values)
1763 {
1764 m_aggregateScriptEvents |= s;
1765 }
1766 }
1767
1768 uint objectflagupdate = 0;
1769
1770 if (
1771 ((m_aggregateScriptEvents & scriptEvents.touch) != 0) ||
1772 ((m_aggregateScriptEvents & scriptEvents.touch_end) != 0) ||
1773 ((m_aggregateScriptEvents & scriptEvents.touch_start) != 0)
1774 )
1775 {
1776 objectflagupdate |= (uint) LLObject.ObjectFlags.Touch;
1777 }
1778
1779 if ((m_aggregateScriptEvents & scriptEvents.money) != 0)
1780 {
1781 objectflagupdate |= (uint) LLObject.ObjectFlags.Money;
1782 }
1783
1784 if (
1785 ((m_aggregateScriptEvents & scriptEvents.collision) != 0) ||
1786 ((m_aggregateScriptEvents & scriptEvents.collision_end) != 0) ||
1787 ((m_aggregateScriptEvents & scriptEvents.collision_start) != 0)
1788 )
1789 {
1790 // subscribe to physics updates.
1791 }
1792
1793 LocalFlags = (LLObject.ObjectFlags) objectflagupdate;
1794
1795 if (m_parentGroup != null && m_parentGroup.RootPart == this)
1796 m_parentGroup.aggregateScriptEvents();
1797 else
1798 ScheduleFullUpdate();
1799 }
1800
1801 #region Events
1802
1803 public void PhysicsRequestingTerseUpdate()
1804 {
1805 if (PhysActor != null)
1806 {
1807 LLVector3 newpos = new LLVector3(PhysActor.Position.GetBytes(), 0);
1808 if (newpos.X > 257f || newpos.X < -1f || newpos.Y > 257f || newpos.Y < -1f)
1809 {
1810 m_parentGroup.AbsolutePosition = newpos;
1811 return;
1812 }
1813 }
1814 ScheduleTerseUpdate();
1815
1816 //SendTerseUpdateToAllClients();
1817 }
1818
1819 #endregion
1820
1821 #region Client Update Methods
1822
1823 /// <summary>
1824 /// Tell all scene presences that they should send updates for this part to their clients
1825 /// </summary>
1826 public void AddFullUpdateToAllAvatars()
1827 {
1828 List<ScenePresence> avatars = m_parentGroup.GetScenePresences();
1829 for (int i = 0; i < avatars.Count; i++)
1830 {
1831 avatars[i].QueuePartForUpdate(this);
1832 }
1833 }
1834
1835 public void SendFullUpdateToAllClientsExcept(LLUUID agentID)
1836 {
1837 List<ScenePresence> avatars = m_parentGroup.GetScenePresences();
1838 for (int i = 0; i < avatars.Count; i++)
1839 {
1840 // Ugly reference :(
1841 if (avatars[i].UUID != agentID)
1842 {
1843 m_parentGroup.SendPartFullUpdate(avatars[i].ControllingClient, this,
1844 avatars[i].GenerateClientFlags(UUID));
1845 }
1846 }
1847 }
1848
1849
1850 public void AddFullUpdateToAvatar(ScenePresence presence)
1851 {
1852 presence.QueuePartForUpdate(this);
1853 }
1854
1855 /// <summary>
1856 ///
1857 /// </summary>
1858 public void SendFullUpdateToAllClients()
1859 {
1860 List<ScenePresence> avatars = m_parentGroup.GetScenePresences();
1861 for (int i = 0; i < avatars.Count; i++)
1862 {
1863 // Ugly reference :(
1864 m_parentGroup.SendPartFullUpdate(avatars[i].ControllingClient, this,
1865 avatars[i].GenerateClientFlags(UUID));
1866 }
1867 }
1868
1869 /// <summary>
1870 ///
1871 /// </summary>
1872 /// <param name="remoteClient"></param>
1873 public void SendFullUpdate(IClientAPI remoteClient, uint clientFlags)
1874 {
1875 m_parentGroup.SendPartFullUpdate(remoteClient, this, clientFlags);
1876 }
1877
1878 /// <summary>
1879 /// Sends a full update to the client
1880 /// </summary>
1881 /// <param name="remoteClient"></param>
1882 /// <param name="clientFlags"></param>
1883 public void SendFullUpdateToClient(IClientAPI remoteClient, uint clientflags)
1884 {
1885 LLVector3 lPos;
1886 lPos = OffsetPosition;
1887 SendFullUpdateToClient(remoteClient, lPos, clientflags);
1888 }
1889 1520
1890 /// <summary> 1521 /// <summary>
1891 /// Sends a full update to the client 1522 /// Duplicates this part.
1892 /// </summary> 1523 /// </summary>
1893 /// <param name="remoteClient"></param> 1524 /// <returns></returns>
1894 /// <param name="lPos"></param> 1525 public SceneObjectPart Copy(uint localID, LLUUID AgentID, LLUUID GroupID, int linkNum)
1895 /// <param name="clientFlags"></param>
1896 public void SendFullUpdateToClient(IClientAPI remoteClient, LLVector3 lPos, uint clientFlags)
1897 { 1526 {
1898 LLQuaternion lRot; 1527 SceneObjectPart dupe = (SceneObjectPart) MemberwiseClone();
1899 lRot = RotationOffset; 1528 dupe.m_shape = m_shape.Copy();
1900 clientFlags &= ~(uint) LLObject.ObjectFlags.CreateSelected; 1529 dupe.m_regionHandle = m_regionHandle;
1901 1530 dupe.UUID = LLUUID.Random();
1902 if (remoteClient.AgentId == OwnerID) 1531 dupe.LocalId = localID;
1903 { 1532 dupe.OwnerID = AgentID;
1904 if ((uint) (Flags & LLObject.ObjectFlags.CreateSelected) != 0) 1533 dupe.GroupID = GroupID;
1905 { 1534 dupe.GroupPosition = new LLVector3(GroupPosition.X, GroupPosition.Y, GroupPosition.Z);
1906 clientFlags |= (uint) LLObject.ObjectFlags.CreateSelected; 1535 dupe.OffsetPosition = new LLVector3(OffsetPosition.X, OffsetPosition.Y, OffsetPosition.Z);
1907 Flags &= ~LLObject.ObjectFlags.CreateSelected; 1536 dupe.RotationOffset =
1908 } 1537 new LLQuaternion(RotationOffset.X, RotationOffset.Y, RotationOffset.Z, RotationOffset.W);
1909 } 1538 dupe.Velocity = new LLVector3(0, 0, 0);
1910 1539 dupe.Acceleration = new LLVector3(0, 0, 0);
1540 dupe.AngularVelocity = new LLVector3(0, 0, 0);
1541 dupe.ObjectFlags = ObjectFlags;
1911 1542
1912 byte[] color = new[] {m_color.R, m_color.G, m_color.B, m_color.A}; 1543 dupe.OwnershipCost = OwnershipCost;
1913 remoteClient.SendPrimitiveToClient(m_regionHandle, (ushort) (m_parentGroup.GetTimeDilation() * ushort.MaxValue), LocalId, m_shape, lPos, clientFlags, 1544 dupe.ObjectSaleType = ObjectSaleType;
1914 m_uuid, 1545 dupe.SalePrice = SalePrice;
1915 OwnerID, 1546 dupe.Category = Category;
1916 m_text, color, ParentID, m_particleSystem, lRot, m_clickAction, m_TextureAnimation, m_IsAttachment, 1547
1917 m_attachmentPoint, fromAssetID); 1548 dupe.TaskInventory = (TaskInventoryDictionary)dupe.TaskInventory.Clone();
1918 } 1549
1550 dupe.ResetIDs(linkNum);
1919 1551
1920 /// Terse updates 1552 // This may be wrong... it might have to be applied in SceneObjectGroup to the object that's being duplicated.
1921 public void AddTerseUpdateToAllAvatars() 1553 dupe.LastOwnerID = ObjectOwner;
1922 {
1923 List<ScenePresence> avatars = m_parentGroup.GetScenePresences();
1924 for (int i = 0; i < avatars.Count; i++)
1925 {
1926 avatars[i].QueuePartForUpdate(this);
1927 }
1928 }
1929 1554
1930 public void AddTerseUpdateToAvatar(ScenePresence presence) 1555 byte[] extraP = new byte[Shape.ExtraParams.Length];
1931 { 1556 Array.Copy(Shape.ExtraParams, extraP, extraP.Length);
1932 presence.QueuePartForUpdate(this); 1557 dupe.Shape.ExtraParams = extraP;
1933 } 1558 bool UsePhysics = ((dupe.ObjectFlags & (uint) LLObject.ObjectFlags.Physics) != 0);
1559 dupe.DoPhysicsPropertyUpdate(UsePhysics, true);
1934 1560
1935 /// <summary> 1561 return dupe;
1936 ///
1937 /// </summary>
1938 public void SendTerseUpdateToAllClients()
1939 {
1940 List<ScenePresence> avatars = m_parentGroup.GetScenePresences();
1941 for (int i = 0; i < avatars.Count; i++)
1942 {
1943 m_parentGroup.SendPartTerseUpdate(avatars[i].ControllingClient, this);
1944 }
1945 } 1562 }
1946 1563
1564 #endregion
1565
1947 /// <summary> 1566 /// <summary>
1948 /// Send a terse update to the client. 1567 /// Reset LLUUIDs for this part. This involves generate this part's own LLUUID and
1568 /// generating new LLUUIDs for all the items in the inventory.
1949 /// </summary> 1569 /// </summary>
1950 /// <param name="remoteClient"></param> 1570 /// <param name="linkNum">Link number for the part</param>
1951 public void SendTerseUpdate(IClientAPI remoteClient) 1571 public void ResetIDs(int linkNum)
1952 {
1953 m_parentGroup.SendPartTerseUpdate(remoteClient, this);
1954 }
1955
1956 public void SendTerseUpdateToClient(IClientAPI remoteClient)
1957 {
1958 LLVector3 lPos;
1959 lPos = OffsetPosition;
1960 LLQuaternion mRot = RotationOffset;
1961 if ((ObjectFlags & (uint) LLObject.ObjectFlags.Physics) == 0)
1962 {
1963 remoteClient.SendPrimTerseUpdate(m_regionHandle, (ushort) (m_parentGroup.GetTimeDilation() * ushort.MaxValue), LocalId, lPos, mRot, Shape.State,
1964 fromAssetID);
1965 }
1966 else
1967 {
1968 remoteClient.SendPrimTerseUpdate(m_regionHandle, (ushort) (m_parentGroup.GetTimeDilation() * ushort.MaxValue), LocalId, lPos, mRot, Velocity,
1969 RotationalVelocity);
1970 //System.Console.WriteLine("LID: " + LocalID + " RVel:" + RotationalVelocity.ToString() + " TD: " + ((ushort)(m_parentGroup.Scene.TimeDilation * 500000f)).ToString() + ":" + m_parentGroup.Scene.TimeDilation.ToString());
1971 }
1972 }
1973
1974 public void SendTerseUpdateToClient(IClientAPI remoteClient, LLVector3 lPos)
1975 { 1572 {
1976 LLQuaternion mRot = RotationOffset; 1573 UUID = LLUUID.Random();
1977 if (m_IsAttachment) 1574 LinkNum = linkNum;
1978 { 1575
1979 remoteClient.SendPrimTerseUpdate(m_regionHandle, (ushort) (m_parentGroup.GetTimeDilation() * ushort.MaxValue), LocalId, lPos, mRot, 1576 ResetInventoryIDs();
1980 (byte) ((m_attachmentPoint % 16) * 16 + (m_attachmentPoint / 16)), fromAssetID);
1981 }
1982 else
1983 {
1984 if ((ObjectFlags & (uint) LLObject.ObjectFlags.Physics) == 0)
1985 {
1986 remoteClient.SendPrimTerseUpdate(m_regionHandle, (ushort) (m_parentGroup.GetTimeDilation() * ushort.MaxValue), LocalId, lPos, mRot,
1987 Shape.State, fromAssetID);
1988 }
1989 else
1990 {
1991 remoteClient.SendPrimTerseUpdate(m_regionHandle, (ushort) (m_parentGroup.GetTimeDilation() * ushort.MaxValue), LocalId, lPos, mRot, Velocity,
1992 RotationalVelocity);
1993 //System.Console.WriteLine("LID: " + LocalID + "RVel:" + RotationalVelocity.ToString() + " TD: " + ((ushort)(m_parentGroup.Scene.TimeDilation * 500000f)).ToString() + ":" + m_parentGroup.Scene.TimeDilation.ToString());
1994 }
1995 }
1996 } 1577 }
1997 1578
1998 #endregion
1999
2000 #region Update Scheduling 1579 #region Update Scheduling
2001 1580
2002 /// <summary> 1581 /// <summary>
@@ -2017,9 +1596,9 @@ namespace OpenSim.Region.Environment.Scenes
2017 m_parentGroup.HasGroupChanged = true; 1596 m_parentGroup.HasGroupChanged = true;
2018 m_parentGroup.QueueForUpdateCheck(); 1597 m_parentGroup.QueueForUpdateCheck();
2019 } 1598 }
2020 1599
2021 int timeNow = Util.UnixTimeSinceEpoch(); 1600 int timeNow = Util.UnixTimeSinceEpoch();
2022 1601
2023 // If multiple updates are scheduled on the same second, we still need to perform all of them 1602 // If multiple updates are scheduled on the same second, we still need to perform all of them
2024 // So we'll force the issue by bumping up the timestamp so that later processing sees these need 1603 // So we'll force the issue by bumping up the timestamp so that later processing sees these need
2025 // to be performed. 1604 // to be performed.
@@ -2029,11 +1608,11 @@ namespace OpenSim.Region.Environment.Scenes
2029 } 1608 }
2030 else 1609 else
2031 { 1610 {
2032 TimeStampFull = (uint) timeNow; 1611 TimeStampFull = (uint)timeNow;
2033 } 1612 }
2034 1613
2035 m_updateFlag = 2; 1614 m_updateFlag = 2;
2036 1615
2037// m_log.DebugFormat( 1616// m_log.DebugFormat(
2038// "[SCENE OBJECT PART]: Scheduling full update for {0}, {1} at {2}", 1617// "[SCENE OBJECT PART]: Scheduling full update for {0}, {1} at {2}",
2039// UUID, Name, TimeStampFull); 1618// UUID, Name, TimeStampFull);
@@ -2156,13 +1735,15 @@ namespace OpenSim.Region.Environment.Scenes
2156 1735
2157 public void UpdatePrimFlags(ushort type, bool inUse, byte[] data) 1736 public void UpdatePrimFlags(ushort type, bool inUse, byte[] data)
2158 { 1737 {
1738
1739
2159 //m_log.Info("TSomething1:" + ((type & (ushort)ExtraParamType.Something1) == (ushort)ExtraParamType.Something1)); 1740 //m_log.Info("TSomething1:" + ((type & (ushort)ExtraParamType.Something1) == (ushort)ExtraParamType.Something1));
2160 //m_log.Info("TSomething2:" + ((type & (ushort)ExtraParamType.Something2) == (ushort)ExtraParamType.Something2)); 1741 //m_log.Info("TSomething2:" + ((type & (ushort)ExtraParamType.Something2) == (ushort)ExtraParamType.Something2));
2161 //m_log.Info("TSomething3:" + ((type & (ushort)ExtraParamType.Something3) == (ushort)ExtraParamType.Something3)); 1742 //m_log.Info("TSomething3:" + ((type & (ushort)ExtraParamType.Something3) == (ushort)ExtraParamType.Something3));
2162 //m_log.Info("TSomething4:" + ((type & (ushort)ExtraParamType.Something4) == (ushort)ExtraParamType.Something4)); 1743 //m_log.Info("TSomething4:" + ((type & (ushort)ExtraParamType.Something4) == (ushort)ExtraParamType.Something4));
2163 //m_log.Info("TSomething5:" + ((type & (ushort)ExtraParamType.Something5) == (ushort)ExtraParamType.Something5)); 1744 //m_log.Info("TSomething5:" + ((type & (ushort)ExtraParamType.Something5) == (ushort)ExtraParamType.Something5));
2164 //m_log.Info("TSomething6:" + ((type & (ushort)ExtraParamType.Something6) == (ushort)ExtraParamType.Something6)); 1745 //m_log.Info("TSomething6:" + ((type & (ushort)ExtraParamType.Something6) == (ushort)ExtraParamType.Something6));
2165 1746
2166 bool usePhysics = false; 1747 bool usePhysics = false;
2167 bool IsTemporary = false; 1748 bool IsTemporary = false;
2168 bool IsPhantom = false; 1749 bool IsPhantom = false;
@@ -2170,7 +1751,7 @@ namespace OpenSim.Region.Environment.Scenes
2170 bool wasUsingPhysics = ((ObjectFlags & (uint) LLObject.ObjectFlags.Physics) != 0); 1751 bool wasUsingPhysics = ((ObjectFlags & (uint) LLObject.ObjectFlags.Physics) != 0);
2171 //bool IsLocked = false; 1752 //bool IsLocked = false;
2172 int i = 0; 1753 int i = 0;
2173 1754
2174 1755
2175 try 1756 try
2176 { 1757 {
@@ -2254,7 +1835,6 @@ namespace OpenSim.Region.Environment.Scenes
2254 // System.Console.WriteLine("Update: PHY:" + UsePhysics.ToString() + ", T:" + IsTemporary.ToString() + ", PHA:" + IsPhantom.ToString() + " S:" + CastsShadows.ToString()); 1835 // System.Console.WriteLine("Update: PHY:" + UsePhysics.ToString() + ", T:" + IsTemporary.ToString() + ", PHA:" + IsPhantom.ToString() + " S:" + CastsShadows.ToString());
2255 ScheduleFullUpdate(); 1836 ScheduleFullUpdate();
2256 } 1837 }
2257
2258 public void ScriptSetPhysicsStatus(bool UsePhysics) 1838 public void ScriptSetPhysicsStatus(bool UsePhysics)
2259 { 1839 {
2260 if (m_parentGroup != null) 1840 if (m_parentGroup != null)
@@ -2262,7 +1842,6 @@ namespace OpenSim.Region.Environment.Scenes
2262 m_parentGroup.ScriptSetPhysicsStatus(UsePhysics); 1842 m_parentGroup.ScriptSetPhysicsStatus(UsePhysics);
2263 } 1843 }
2264 } 1844 }
2265
2266 public void ScriptSetPhantomStatus(bool Phantom) 1845 public void ScriptSetPhantomStatus(bool Phantom)
2267 { 1846 {
2268 if (m_parentGroup != null) 1847 if (m_parentGroup != null)
@@ -2270,7 +1849,6 @@ namespace OpenSim.Region.Environment.Scenes
2270 m_parentGroup.ScriptSetPhantomStatus(Phantom); 1849 m_parentGroup.ScriptSetPhantomStatus(Phantom);
2271 } 1850 }
2272 } 1851 }
2273
2274 public void DoPhysicsPropertyUpdate(bool UsePhysics, bool isNew) 1852 public void DoPhysicsPropertyUpdate(bool UsePhysics, bool isNew)
2275 { 1853 {
2276 if (PhysActor != null) 1854 if (PhysActor != null)
@@ -2319,6 +1897,7 @@ namespace OpenSim.Region.Environment.Scenes
2319 PhysActor.link(ParentGroup.RootPart.PhysActor); 1897 PhysActor.link(ParentGroup.RootPart.PhysActor);
2320 } 1898 }
2321 } 1899 }
1900
2322 } 1901 }
2323 } 1902 }
2324 } 1903 }
@@ -2332,13 +1911,13 @@ namespace OpenSim.Region.Environment.Scenes
2332 int i = 0; 1911 int i = 0;
2333 uint length = (uint) data.Length; 1912 uint length = (uint) data.Length;
2334 m_shape.ExtraParams[i++] = 1; 1913 m_shape.ExtraParams[i++] = 1;
2335 m_shape.ExtraParams[i++] = (byte) (type % 256); 1914 m_shape.ExtraParams[i++] = (byte) (type%256);
2336 m_shape.ExtraParams[i++] = (byte) ((type >> 8) % 256); 1915 m_shape.ExtraParams[i++] = (byte) ((type >> 8)%256);
2337 1916
2338 m_shape.ExtraParams[i++] = (byte) (length % 256); 1917 m_shape.ExtraParams[i++] = (byte) (length%256);
2339 m_shape.ExtraParams[i++] = (byte) ((length >> 8) % 256); 1918 m_shape.ExtraParams[i++] = (byte) ((length >> 8)%256);
2340 m_shape.ExtraParams[i++] = (byte) ((length >> 16) % 256); 1919 m_shape.ExtraParams[i++] = (byte) ((length >> 16)%256);
2341 m_shape.ExtraParams[i++] = (byte) ((length >> 24) % 256); 1920 m_shape.ExtraParams[i++] = (byte) ((length >> 24)%256);
2342 Array.Copy(data, 0, m_shape.ExtraParams, i, data.Length); 1921 Array.Copy(data, 0, m_shape.ExtraParams, i, data.Length);
2343 1922
2344 ScheduleFullUpdate(); 1923 ScheduleFullUpdate();
@@ -2416,14 +1995,14 @@ namespace OpenSim.Region.Environment.Scenes
2416 1995
2417 public byte ConvertScriptUintToByte(uint indata) 1996 public byte ConvertScriptUintToByte(uint indata)
2418 { 1997 {
2419 byte outdata = (byte) TextureAnimFlags.NONE; 1998 byte outdata = (byte)TextureAnimFlags.NONE;
2420 if ((indata & 1) != 0) outdata |= (byte) TextureAnimFlags.ANIM_ON; 1999 if ((indata & 1) != 0) outdata |= (byte)TextureAnimFlags.ANIM_ON;
2421 if ((indata & 2) != 0) outdata |= (byte) TextureAnimFlags.LOOP; 2000 if ((indata & 2) != 0) outdata |= (byte)TextureAnimFlags.LOOP;
2422 if ((indata & 4) != 0) outdata |= (byte) TextureAnimFlags.REVERSE; 2001 if ((indata & 4) != 0) outdata |= (byte)TextureAnimFlags.REVERSE;
2423 if ((indata & 8) != 0) outdata |= (byte) TextureAnimFlags.PING_PONG; 2002 if ((indata & 8) != 0) outdata |= (byte)TextureAnimFlags.PING_PONG;
2424 if ((indata & 16) != 0) outdata |= (byte) TextureAnimFlags.SMOOTH; 2003 if ((indata & 16) != 0) outdata |= (byte)TextureAnimFlags.SMOOTH;
2425 if ((indata & 32) != 0) outdata |= (byte) TextureAnimFlags.ROTATE; 2004 if ((indata & 32) != 0) outdata |= (byte)TextureAnimFlags.ROTATE;
2426 if ((indata & 64) != 0) outdata |= (byte) TextureAnimFlags.SCALE; 2005 if ((indata & 64) != 0) outdata |= (byte)TextureAnimFlags.SCALE;
2427 return outdata; 2006 return outdata;
2428 } 2007 }
2429 2008
@@ -2435,17 +2014,13 @@ namespace OpenSim.Region.Environment.Scenes
2435 // The flags don't like conversion from uint to byte, so we have to do 2014 // The flags don't like conversion from uint to byte, so we have to do
2436 // it the crappy way. See the above function :( 2015 // it the crappy way. See the above function :(
2437 2016
2438 data[pos] = ConvertScriptUintToByte(pTexAnim.Flags); 2017 data[pos] = ConvertScriptUintToByte(pTexAnim.Flags); pos++;
2439 pos++; 2018 data[pos] = (byte)pTexAnim.Face; pos++;
2440 data[pos] = (byte) pTexAnim.Face; 2019 data[pos] = (byte)pTexAnim.SizeX; pos++;
2441 pos++; 2020 data[pos] = (byte)pTexAnim.SizeY; pos++;
2442 data[pos] = (byte) pTexAnim.SizeX;
2443 pos++;
2444 data[pos] = (byte) pTexAnim.SizeY;
2445 pos++;
2446 2021
2447 Helpers.FloatToBytes(pTexAnim.Start).CopyTo(data, pos); 2022 Helpers.FloatToBytes(pTexAnim.Start).CopyTo(data, pos);
2448 Helpers.FloatToBytes(pTexAnim.Length).CopyTo(data, pos + 4); 2023 Helpers.FloatToBytes(pTexAnim.Length ).CopyTo(data, pos + 4);
2449 Helpers.FloatToBytes(pTexAnim.Rate).CopyTo(data, pos + 8); 2024 Helpers.FloatToBytes(pTexAnim.Rate).CopyTo(data, pos + 8);
2450 2025
2451 m_TextureAnimation = data; 2026 m_TextureAnimation = data;
@@ -2496,7 +2071,6 @@ namespace OpenSim.Region.Environment.Scenes
2496 #endregion 2071 #endregion
2497 2072
2498 #region Sound 2073 #region Sound
2499
2500 public void PreloadSound(string sound) 2074 public void PreloadSound(string sound)
2501 { 2075 {
2502 LLUUID ownerID = OwnerID; 2076 LLUUID ownerID = OwnerID;
@@ -2522,7 +2096,7 @@ namespace OpenSim.Region.Environment.Scenes
2522 foreach (ScenePresence p in avatarts) 2096 foreach (ScenePresence p in avatarts)
2523 { 2097 {
2524 // TODO: some filtering by distance of avatar 2098 // TODO: some filtering by distance of avatar
2525 2099
2526 p.ControllingClient.SendPreLoadSound(objectID, objectID, soundID); 2100 p.ControllingClient.SendPreLoadSound(objectID, objectID, soundID);
2527 } 2101 }
2528 } 2102 }
@@ -2537,7 +2111,7 @@ namespace OpenSim.Region.Environment.Scenes
2537 List<ScenePresence> avatarts = m_parentGroup.Scene.GetAvatars(); 2111 List<ScenePresence> avatarts = m_parentGroup.Scene.GetAvatars();
2538 foreach (ScenePresence p in avatarts) 2112 foreach (ScenePresence p in avatarts)
2539 { 2113 {
2540 p.ControllingClient.SendAttachedSoundGainChange(UUID, (float) volume); 2114 p.ControllingClient.SendAttachedSoundGainChange(UUID, (float)volume);
2541 } 2115 }
2542 } 2116 }
2543 2117
@@ -2563,7 +2137,7 @@ namespace OpenSim.Region.Environment.Scenes
2563 SceneObjectPart op = this; 2137 SceneObjectPart op = this;
2564 foreach (KeyValuePair<LLUUID, TaskInventoryItem> item in op.TaskInventory) 2138 foreach (KeyValuePair<LLUUID, TaskInventoryItem> item in op.TaskInventory)
2565 { 2139 {
2566 if (item.Value.Name == sound && item.Value.Type == (int) AssetType.Sound) 2140 if (item.Value.Name == sound && item.Value.Type == (int)AssetType.Sound)
2567 { 2141 {
2568 soundID = item.Value.ItemID; 2142 soundID = item.Value.ItemID;
2569 break; 2143 break;
@@ -2571,26 +2145,26 @@ namespace OpenSim.Region.Environment.Scenes
2571 } 2145 }
2572 } 2146 }
2573 2147
2574 if (soundID == LLUUID.Zero) 2148 if(soundID == LLUUID.Zero)
2575 return; 2149 return;
2576 2150
2577 List<ScenePresence> avatarts = m_parentGroup.Scene.GetAvatars(); 2151 List<ScenePresence> avatarts = m_parentGroup.Scene.GetAvatars();
2578 foreach (ScenePresence p in avatarts) 2152 foreach (ScenePresence p in avatarts)
2579 { 2153 {
2580 double dis = Util.GetDistanceTo(p.AbsolutePosition, position); 2154 double dis=Util.GetDistanceTo(p.AbsolutePosition, position);
2581 if (dis > 100.0) // Max audio distance 2155 if(dis > 100.0) // Max audio distance
2582 continue; 2156 continue;
2583 2157
2584 // Scale by distance 2158 // Scale by distance
2585 volume *= ((100.0 - dis) / 100.0); 2159 volume*=((100.0-dis)/100.0);
2586 2160
2587 if (triggered) 2161 if (triggered)
2588 { 2162 {
2589 p.ControllingClient.SendTriggeredSound(soundID, ownerID, objectID, parentID, regionHandle, position, (float) volume); 2163 p.ControllingClient.SendTriggeredSound(soundID, ownerID, objectID, parentID, regionHandle, position, (float)volume);
2590 } 2164 }
2591 else 2165 else
2592 { 2166 {
2593 p.ControllingClient.SendPlayAttachedSound(soundID, objectID, ownerID, (float) volume, flags); 2167 p.ControllingClient.SendPlayAttachedSound(soundID, objectID, ownerID, (float)volume, flags);
2594 } 2168 }
2595 } 2169 }
2596 } 2170 }
@@ -2607,57 +2181,513 @@ namespace OpenSim.Region.Environment.Scenes
2607 { 2181 {
2608 StoreUndoState(); 2182 StoreUndoState();
2609 m_shape.Scale = scale; 2183 m_shape.Scale = scale;
2610 2184
2611 ScheduleFullUpdate(); 2185 ScheduleFullUpdate();
2612 } 2186 }
2613 2187
2614 #endregion 2188 #endregion
2615 2189
2616 #region Copying 2190 public void UpdatePermissions(LLUUID AgentID, byte field, uint localID, uint mask, byte addRemTF)
2191 {
2192 bool set = addRemTF == 1;
2193
2194 // Are we the owner?
2195 if (AgentID == OwnerID)
2196 {
2197 switch (field)
2198 {
2199 case 2:
2200 OwnerMask = ApplyMask(OwnerMask, set, mask);
2201 break;
2202 case 4:
2203 GroupMask = ApplyMask(GroupMask, set, mask);
2204 break;
2205 case 8:
2206 EveryoneMask = ApplyMask(EveryoneMask, set, mask);
2207 break;
2208 case 16:
2209 NextOwnerMask = ApplyMask(NextOwnerMask, set, mask);
2210 break;
2211 }
2212 SendFullUpdateToAllClients();
2213
2214 SendObjectPropertiesToClient(AgentID);
2215
2216 }
2217 }
2218
2219 private void SendObjectPropertiesToClient(LLUUID AgentID)
2220 {
2221 List<ScenePresence> avatars = m_parentGroup.GetScenePresences();
2222 for (int i = 0; i < avatars.Count; i++)
2223 {
2224 // Ugly reference :(
2225 if (avatars[i].UUID == AgentID)
2226 {
2227 m_parentGroup.GetProperties(avatars[i].ControllingClient);
2228 }
2229 }
2230 }
2231
2232 private uint ApplyMask(uint val, bool set, uint mask)
2233 {
2234 if (set)
2235 {
2236 return val |= mask;
2237 }
2238 else
2239 {
2240 return val &= ~mask;
2241 }
2242 }
2617 2243
2244 #region Client Update Methods
2245
2618 /// <summary> 2246 /// <summary>
2619 /// Duplicates this part. 2247 /// Tell all scene presences that they should send updates for this part to their clients
2620 /// </summary> 2248 /// </summary>
2621 /// <returns></returns> 2249 public void AddFullUpdateToAllAvatars()
2622 public SceneObjectPart Copy(uint localID, LLUUID AgentID, LLUUID GroupID, int linkNum)
2623 { 2250 {
2624 SceneObjectPart dupe = (SceneObjectPart) MemberwiseClone(); 2251 List<ScenePresence> avatars = m_parentGroup.GetScenePresences();
2625 dupe.m_shape = m_shape.Copy(); 2252 for (int i = 0; i < avatars.Count; i++)
2626 dupe.m_regionHandle = m_regionHandle; 2253 {
2627 dupe.UUID = LLUUID.Random(); 2254 avatars[i].QueuePartForUpdate(this);
2628 dupe.LocalId = localID; 2255 }
2629 dupe.OwnerID = AgentID; 2256 }
2630 dupe.GroupID = GroupID;
2631 dupe.GroupPosition = new LLVector3(GroupPosition.X, GroupPosition.Y, GroupPosition.Z);
2632 dupe.OffsetPosition = new LLVector3(OffsetPosition.X, OffsetPosition.Y, OffsetPosition.Z);
2633 dupe.RotationOffset =
2634 new LLQuaternion(RotationOffset.X, RotationOffset.Y, RotationOffset.Z, RotationOffset.W);
2635 dupe.Velocity = new LLVector3(0, 0, 0);
2636 dupe.Acceleration = new LLVector3(0, 0, 0);
2637 dupe.AngularVelocity = new LLVector3(0, 0, 0);
2638 dupe.ObjectFlags = ObjectFlags;
2639 2257
2640 dupe.OwnershipCost = OwnershipCost; 2258 public void SendFullUpdateToAllClientsExcept(LLUUID agentID)
2641 dupe.ObjectSaleType = ObjectSaleType; 2259 {
2642 dupe.SalePrice = SalePrice; 2260 List<ScenePresence> avatars = m_parentGroup.GetScenePresences();
2643 dupe.Category = Category; 2261 for (int i = 0; i < avatars.Count; i++)
2262 {
2263 // Ugly reference :(
2264 if (avatars[i].UUID != agentID)
2265 {
2266 m_parentGroup.SendPartFullUpdate(avatars[i].ControllingClient, this,
2267 avatars[i].GenerateClientFlags(UUID));
2268 }
2269 }
2270 }
2271
2644 2272
2645 dupe.TaskInventory = (TaskInventoryDictionary) dupe.TaskInventory.Clone(); 2273 public void AddFullUpdateToAvatar(ScenePresence presence)
2274 {
2275 presence.QueuePartForUpdate(this);
2276 }
2646 2277
2647 dupe.ResetIDs(linkNum); 2278 /// <summary>
2279 ///
2280 /// </summary>
2281 public void SendFullUpdateToAllClients()
2282 {
2283 List<ScenePresence> avatars = m_parentGroup.GetScenePresences();
2284 for (int i = 0; i < avatars.Count; i++)
2285 {
2286 // Ugly reference :(
2287 m_parentGroup.SendPartFullUpdate(avatars[i].ControllingClient, this,
2288 avatars[i].GenerateClientFlags(UUID));
2289 }
2290 }
2648 2291
2649 // This may be wrong... it might have to be applied in SceneObjectGroup to the object that's being duplicated. 2292 /// <summary>
2650 dupe.LastOwnerID = ObjectOwner; 2293 ///
2294 /// </summary>
2295 /// <param name="remoteClient"></param>
2296 public void SendFullUpdate(IClientAPI remoteClient, uint clientFlags)
2297 {
2298 m_parentGroup.SendPartFullUpdate(remoteClient, this, clientFlags);
2299 }
2651 2300
2652 byte[] extraP = new byte[Shape.ExtraParams.Length]; 2301 /// <summary>
2653 Array.Copy(Shape.ExtraParams, extraP, extraP.Length); 2302 /// Sends a full update to the client
2654 dupe.Shape.ExtraParams = extraP; 2303 /// </summary>
2655 bool UsePhysics = ((dupe.ObjectFlags & (uint) LLObject.ObjectFlags.Physics) != 0); 2304 /// <param name="remoteClient"></param>
2656 dupe.DoPhysicsPropertyUpdate(UsePhysics, true); 2305 /// <param name="clientFlags"></param>
2306 public void SendFullUpdateToClient(IClientAPI remoteClient, uint clientflags)
2307 {
2308 LLVector3 lPos;
2309 lPos = OffsetPosition;
2310 SendFullUpdateToClient(remoteClient, lPos, clientflags);
2311 }
2312
2313 /// <summary>
2314 /// Sends a full update to the client
2315 /// </summary>
2316 /// <param name="remoteClient"></param>
2317 /// <param name="lPos"></param>
2318 /// <param name="clientFlags"></param>
2319 public void SendFullUpdateToClient(IClientAPI remoteClient, LLVector3 lPos, uint clientFlags)
2320 {
2321 LLQuaternion lRot;
2322 lRot = RotationOffset;
2323 clientFlags &= ~(uint) LLObject.ObjectFlags.CreateSelected;
2657 2324
2658 return dupe; 2325 if (remoteClient.AgentId == OwnerID)
2326 {
2327 if ((uint) (Flags & LLObject.ObjectFlags.CreateSelected) != 0)
2328 {
2329 clientFlags |= (uint) LLObject.ObjectFlags.CreateSelected;
2330 Flags &= ~LLObject.ObjectFlags.CreateSelected;
2331 }
2332 }
2333
2334
2335 byte[] color = new byte[] {m_color.R, m_color.G, m_color.B, m_color.A};
2336 remoteClient.SendPrimitiveToClient(m_regionHandle, (ushort)(m_parentGroup.GetTimeDilation() * (float)ushort.MaxValue), LocalId, m_shape, lPos, clientFlags, m_uuid,
2337 OwnerID,
2338 m_text, color, ParentID, m_particleSystem, lRot, m_clickAction, m_TextureAnimation, m_IsAttachment, m_attachmentPoint,fromAssetID);
2339 }
2340
2341 /// Terse updates
2342 public void AddTerseUpdateToAllAvatars()
2343 {
2344 List<ScenePresence> avatars = m_parentGroup.GetScenePresences();
2345 for (int i = 0; i < avatars.Count; i++)
2346 {
2347 avatars[i].QueuePartForUpdate(this);
2348 }
2349 }
2350
2351 public void AddTerseUpdateToAvatar(ScenePresence presence)
2352 {
2353 presence.QueuePartForUpdate(this);
2354 }
2355
2356 /// <summary>
2357 ///
2358 /// </summary>
2359 public void SendTerseUpdateToAllClients()
2360 {
2361 List<ScenePresence> avatars = m_parentGroup.GetScenePresences();
2362 for (int i = 0; i < avatars.Count; i++)
2363 {
2364 m_parentGroup.SendPartTerseUpdate(avatars[i].ControllingClient, this);
2365 }
2366 }
2367
2368 /// <summary>
2369 /// Send a terse update to the client.
2370 /// </summary>
2371 /// <param name="remoteClient"></param>
2372 public void SendTerseUpdate(IClientAPI remoteClient)
2373 {
2374 m_parentGroup.SendPartTerseUpdate(remoteClient, this);
2375 }
2376
2377 public void SendTerseUpdateToClient(IClientAPI remoteClient)
2378 {
2379 LLVector3 lPos;
2380 lPos = OffsetPosition;
2381 LLQuaternion mRot = RotationOffset;
2382 if ((ObjectFlags & (uint) LLObject.ObjectFlags.Physics) == 0)
2383 {
2384 remoteClient.SendPrimTerseUpdate(m_regionHandle, (ushort)(m_parentGroup.GetTimeDilation() * (float)ushort.MaxValue), LocalId, lPos, mRot, Shape.State, fromAssetID);
2385 }
2386 else
2387 {
2388 remoteClient.SendPrimTerseUpdate(m_regionHandle, (ushort)(m_parentGroup.GetTimeDilation() * (float)ushort.MaxValue), LocalId, lPos, mRot, Velocity,
2389 RotationalVelocity);
2390 //System.Console.WriteLine("LID: " + LocalID + " RVel:" + RotationalVelocity.ToString() + " TD: " + ((ushort)(m_parentGroup.Scene.TimeDilation * 500000f)).ToString() + ":" + m_parentGroup.Scene.TimeDilation.ToString());
2391 }
2392 }
2393
2394 public void SendTerseUpdateToClient(IClientAPI remoteClient, LLVector3 lPos)
2395 {
2396 LLQuaternion mRot = RotationOffset;
2397 if (m_IsAttachment)
2398 {
2399 remoteClient.SendPrimTerseUpdate(m_regionHandle, (ushort)(m_parentGroup.GetTimeDilation() * (float)ushort.MaxValue), LocalId, lPos, mRot, (byte)((m_attachmentPoint % 16) * 16 + (m_attachmentPoint / 16)),fromAssetID);
2400 }
2401 else
2402 {
2403 if ((ObjectFlags & (uint)LLObject.ObjectFlags.Physics) == 0)
2404 {
2405 remoteClient.SendPrimTerseUpdate(m_regionHandle, (ushort)(m_parentGroup.GetTimeDilation() * (float)ushort.MaxValue), LocalId, lPos, mRot, Shape.State, fromAssetID);
2406 }
2407 else
2408 {
2409 remoteClient.SendPrimTerseUpdate(m_regionHandle, (ushort)(m_parentGroup.GetTimeDilation() * (float)ushort.MaxValue), LocalId, lPos, mRot, Velocity,
2410 RotationalVelocity);
2411 //System.Console.WriteLine("LID: " + LocalID + "RVel:" + RotationalVelocity.ToString() + " TD: " + ((ushort)(m_parentGroup.Scene.TimeDilation * 500000f)).ToString() + ":" + m_parentGroup.Scene.TimeDilation.ToString());
2412 }
2413 }
2414 }
2415
2416 #endregion
2417
2418 public virtual void UpdateMovement()
2419 {
2420 }
2421
2422 #region Events
2423
2424 public void PhysicsRequestingTerseUpdate()
2425 {
2426 if (PhysActor != null)
2427 {
2428 LLVector3 newpos = new LLVector3(PhysActor.Position.GetBytes(), 0);
2429 if (newpos.X > 257f || newpos.X < -1f || newpos.Y > 257f || newpos.Y < -1f)
2430 {
2431 m_parentGroup.AbsolutePosition = newpos;
2432 return;
2433 }
2434
2435 }
2436 ScheduleTerseUpdate();
2437
2438 //SendTerseUpdateToAllClients();
2659 } 2439 }
2660 2440
2661 #endregion 2441 #endregion
2442
2443 public void PhysicsOutOfBounds(PhysicsVector pos)
2444 {
2445 m_log.Info("[PHYSICS]: Physical Object went out of bounds.");
2446 RemFlag(LLObject.ObjectFlags.Physics);
2447 DoPhysicsPropertyUpdate(false, true);
2448 //m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor);
2449 }
2450
2451 public virtual void OnGrab(LLVector3 offsetPos, IClientAPI remoteClient)
2452 {
2453 }
2454
2455
2456 public void SetText(string text)
2457 {
2458 Text = text;
2459 ScheduleFullUpdate();
2460 }
2461
2462 public void SetText(string text, Vector3 color, double alpha)
2463 {
2464 Color = Color.FromArgb(0xff - (int) (alpha*0xff),
2465 (int) (color.x*0xff),
2466 (int) (color.y*0xff),
2467 (int) (color.z*0xff));
2468 SetText( text );
2469 }
2470
2471 public int registerTargetWaypoint(LLVector3 target, float tolerance)
2472 {
2473 if (m_parentGroup != null)
2474 {
2475 return m_parentGroup.registerTargetWaypoint(target, tolerance);
2476 }
2477 return 0;
2478 }
2479 public void unregisterTargetWaypoint(int handle)
2480 {
2481 if (m_parentGroup != null)
2482 {
2483 m_parentGroup.unregisterTargetWaypoint(handle);
2484 }
2485 }
2486 protected SceneObjectPart(SerializationInfo info, StreamingContext context)
2487 {
2488 //System.Console.WriteLine("SceneObjectPart Deserialize BGN");
2489
2490 if (info == null)
2491 {
2492 throw new ArgumentNullException("info");
2493 }
2494
2495 /*
2496 m_queue = (Queue<SceneObjectPart>)info.GetValue("m_queue", typeof(Queue<SceneObjectPart>));
2497 m_ids = (List<LLUUID>)info.GetValue("m_ids", typeof(List<LLUUID>));
2498 */
2499
2500 //System.Console.WriteLine("SceneObjectPart Deserialize END");
2501 }
2502
2503 [SecurityPermission(SecurityAction.LinkDemand,
2504 Flags = SecurityPermissionFlag.SerializationFormatter)]
2505 public virtual void GetObjectData(
2506 SerializationInfo info, StreamingContext context)
2507 {
2508 if (info == null)
2509 {
2510 throw new ArgumentNullException("info");
2511 }
2512
2513 info.AddValue("m_inventoryFileName", m_inventoryFileName);
2514 info.AddValue("m_folderID", m_folderID.UUID);
2515 info.AddValue("PhysActor", PhysActor);
2516
2517 Dictionary<Guid, TaskInventoryItem> TaskInventory_work = new Dictionary<Guid, TaskInventoryItem>();
2518
2519 foreach (LLUUID id in TaskInventory.Keys)
2520 {
2521 TaskInventory_work.Add(id.UUID, TaskInventory[id]);
2522 }
2523
2524 info.AddValue("TaskInventory", TaskInventory_work);
2525
2526 info.AddValue("LastOwnerID", LastOwnerID.UUID);
2527 info.AddValue("OwnerID", OwnerID.UUID);
2528 info.AddValue("GroupID", GroupID.UUID);
2529
2530 info.AddValue("OwnershipCost", OwnershipCost);
2531 info.AddValue("ObjectSaleType", ObjectSaleType);
2532 info.AddValue("SalePrice", SalePrice);
2533 info.AddValue("Category", Category);
2534
2535 info.AddValue("CreationDate", CreationDate);
2536 info.AddValue("ParentID", ParentID);
2537
2538 info.AddValue("OwnerMask", OwnerMask);
2539 info.AddValue("NextOwnerMask", NextOwnerMask);
2540 info.AddValue("GroupMask", GroupMask);
2541 info.AddValue("EveryoneMask", EveryoneMask);
2542 info.AddValue("BaseMask", BaseMask);
2543
2544 info.AddValue("m_particleSystem", m_particleSystem);
2545
2546 info.AddValue("TimeStampFull", TimeStampFull);
2547 info.AddValue("TimeStampTerse", TimeStampTerse);
2548 info.AddValue("TimeStampLastActivity", TimeStampLastActivity);
2549
2550 info.AddValue("m_updateFlag", m_updateFlag);
2551 info.AddValue("CreatorID", CreatorID.UUID);
2552
2553 info.AddValue("m_inventorySerial", m_inventorySerial);
2554 info.AddValue("m_uuid", m_uuid.UUID);
2555 info.AddValue("m_localID", m_localId);
2556 info.AddValue("m_name", m_name);
2557 info.AddValue("m_flags", Flags);
2558 info.AddValue("m_material", m_material);
2559 info.AddValue("m_regionHandle", m_regionHandle);
2560
2561 info.AddValue("m_groupPosition.X", m_groupPosition.X);
2562 info.AddValue("m_groupPosition.Y", m_groupPosition.Y);
2563 info.AddValue("m_groupPosition.Z", m_groupPosition.Z);
2564
2565 info.AddValue("m_offsetPosition.X", m_offsetPosition.X);
2566 info.AddValue("m_offsetPosition.Y", m_offsetPosition.Y);
2567 info.AddValue("m_offsetPosition.Z", m_offsetPosition.Z);
2568
2569 info.AddValue("m_rotationOffset.W", m_rotationOffset.W);
2570 info.AddValue("m_rotationOffset.X", m_rotationOffset.X);
2571 info.AddValue("m_rotationOffset.Y", m_rotationOffset.Y);
2572 info.AddValue("m_rotationOffset.Z", m_rotationOffset.Z);
2573
2574 info.AddValue("m_velocity.X", m_velocity.X);
2575 info.AddValue("m_velocity.Y", m_velocity.Y);
2576 info.AddValue("m_velocity.Z", m_velocity.Z);
2577
2578 info.AddValue("m_rotationalvelocity.X", m_rotationalvelocity.X);
2579 info.AddValue("m_rotationalvelocity.Y", m_rotationalvelocity.Y);
2580 info.AddValue("m_rotationalvelocity.Z", m_rotationalvelocity.Z);
2581
2582 info.AddValue("m_angularVelocity.X", m_angularVelocity.X);
2583 info.AddValue("m_angularVelocity.Y", m_angularVelocity.Y);
2584 info.AddValue("m_angularVelocity.Z", m_angularVelocity.Z);
2585
2586 info.AddValue("m_acceleration.X", m_acceleration.X);
2587 info.AddValue("m_acceleration.Y", m_acceleration.Y);
2588 info.AddValue("m_acceleration.Z", m_acceleration.Z);
2589
2590 info.AddValue("m_description", m_description);
2591 info.AddValue("m_color", m_color);
2592 info.AddValue("m_text", m_text);
2593 info.AddValue("m_sitName", m_sitName);
2594 info.AddValue("m_touchName", m_touchName);
2595 info.AddValue("m_clickAction", m_clickAction);
2596 info.AddValue("m_shape", m_shape);
2597 info.AddValue("m_parentGroup", m_parentGroup);
2598 info.AddValue("PayPrice", PayPrice);
2599 }
2600
2601
2602 public void Undo()
2603 {
2604 if (m_undo.Count > 0)
2605 {
2606 UndoState goback = m_undo.Pop();
2607 if (goback != null)
2608 goback.PlaybackState(this);
2609 }
2610 }
2611
2612 public void SetScriptEvents(LLUUID scriptid, int events)
2613 {
2614 scriptEvents oldparts;
2615 lock (m_scriptEvents)
2616 {
2617 if (m_scriptEvents.ContainsKey(scriptid))
2618 {
2619 oldparts = m_scriptEvents[scriptid];
2620
2621 // remove values from aggregated script events
2622 m_scriptEvents[scriptid] = (scriptEvents) events;
2623 }
2624 else
2625 {
2626 m_scriptEvents.Add(scriptid, (scriptEvents) events);
2627 }
2628 }
2629 aggregateScriptEvents();
2630 }
2631
2632 public void RemoveScriptEvents(LLUUID scriptid)
2633 {
2634 lock (m_scriptEvents)
2635 {
2636 if (m_scriptEvents.ContainsKey(scriptid))
2637 {
2638 scriptEvents oldparts = scriptEvents.None;
2639 oldparts = (scriptEvents) m_scriptEvents[scriptid];
2640
2641 // remove values from aggregated script events
2642 m_aggregateScriptEvents &= ~oldparts;
2643 m_scriptEvents.Remove(scriptid);
2644 }
2645 }
2646 aggregateScriptEvents();
2647 }
2648
2649 public void aggregateScriptEvents()
2650 {
2651 // Aggregate script events
2652 lock (m_scriptEvents)
2653 {
2654 foreach (scriptEvents s in m_scriptEvents.Values)
2655 {
2656 m_aggregateScriptEvents |= s;
2657 }
2658 }
2659
2660 uint objectflagupdate = 0;
2661
2662 if (
2663 ((m_aggregateScriptEvents & scriptEvents.touch) != 0) ||
2664 ((m_aggregateScriptEvents & scriptEvents.touch_end) != 0) ||
2665 ((m_aggregateScriptEvents & scriptEvents.touch_start) != 0)
2666 )
2667 {
2668 objectflagupdate |= (uint) LLObject.ObjectFlags.Touch;
2669 }
2670
2671 if ((m_aggregateScriptEvents & scriptEvents.money) != 0)
2672 {
2673 objectflagupdate |= (uint) LLObject.ObjectFlags.Money;
2674 }
2675
2676 if (
2677 ((m_aggregateScriptEvents & scriptEvents.collision) != 0) ||
2678 ((m_aggregateScriptEvents & scriptEvents.collision_end) != 0) ||
2679 ((m_aggregateScriptEvents & scriptEvents.collision_start) != 0)
2680 )
2681 {
2682 // subscribe to physics updates.
2683 }
2684
2685 LocalFlags=(LLObject.ObjectFlags)objectflagupdate;
2686
2687 if(m_parentGroup != null && m_parentGroup.RootPart == this)
2688 m_parentGroup.aggregateScriptEvents();
2689 else
2690 ScheduleFullUpdate();
2691 }
2662 } 2692 }
2663} \ No newline at end of file 2693}
diff --git a/OpenSim/Region/Environment/Scenes/ScenePresence.cs b/OpenSim/Region/Environment/Scenes/ScenePresence.cs
index 4cdf7f1..74e9cdc 100644
--- a/OpenSim/Region/Environment/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Environment/Scenes/ScenePresence.cs
@@ -40,111 +40,117 @@ using OpenSim.Region.Physics.Manager;
40 40
41namespace OpenSim.Region.Environment.Scenes 41namespace OpenSim.Region.Environment.Scenes
42{ 42{
43 [Serializable] 43 [Serializable]
44 public class ScenePresence : EntityBase, ISerializable 44 public class ScenePresence : EntityBase, ISerializable
45 { 45 {
46// ~ScenePresence() 46// ~ScenePresence()
47// { 47// {
48// System.Console.WriteLine("[ScenePresence] Destructor called"); 48// System.Console.WriteLine("[ScenePresence] Destructor called");
49// } 49// }
50 50
51 #region Delegates
52
53 public delegate void SignificantClientMovement(IClientAPI remote_client);
54
55 #endregion
56
57 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 51 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
58 52
59 public static AvatarAnimations Animations = new AvatarAnimations(); 53 public static AvatarAnimations Animations = new AvatarAnimations();
60 public static byte[] DefaultTexture; 54 public static byte[] DefaultTexture;
61 private readonly Vector3[] Dir_Vectors = new Vector3[6];
62 private readonly uint m_AgentControlFlags = 0;
63 55
64 private readonly List<LLUUID> m_animations = new List<LLUUID>();
65 private readonly List<int> m_animationSeqs = new List<int>();
66 private readonly List<NewForce> m_forcesList = new List<NewForce>();
67 private readonly List<ulong> m_knownChildRegions = new List<ulong>();
68 private readonly List<LLUUID> m_knownPrimUUID = new List<LLUUID>();
69 private readonly UpdateQueue m_partsUpdateQueue = new UpdateQueue();
70 private readonly byte m_state = 0;
71 private readonly Dictionary<LLUUID, ScenePartUpdate> m_updateTimes = new Dictionary<LLUUID, ScenePartUpdate>();
72 protected ulong crossingFromRegion;
73 public LLUUID currentParcelUUID = LLUUID.Zero; 56 public LLUUID currentParcelUUID = LLUUID.Zero;
74 private SignificantClientMovement handlerSignificantClientMovement; //OnSignificantClientMovement; 57 private List<LLUUID> m_animations = new List<LLUUID>();
58 private List<int> m_animationSeqs = new List<int>();
59 public Vector3 lastKnownAllowedPosition = new Vector3();
60 public bool sentMessageAboutRestrictedParcelFlyingDown = false;
75 61
76 public bool IsRestrictedToRegion; 62 private bool m_updateflag = false;
63 private byte m_movementflag = 0;
64 private readonly List<NewForce> m_forcesList = new List<NewForce>();
65 private short m_updateCount = 0;
66 private uint m_requestedSitTargetID = 0;
67 private LLVector3 m_requestedSitOffset = new LLVector3();
68 private float m_sitAvatarHeight = 2.0f;
69 private float m_godlevel = 0;
70 private LLVector3 m_LastChildAgentUpdatePosition = new LLVector3();
71
72 private int m_perfMonMS = 0;
73
74 private bool m_setAlwaysRun = false;
75
76 private Quaternion m_bodyRot;
77
78 public bool IsRestrictedToRegion = false;
77 79
78 public string JID = string.Empty; 80 public string JID = string.Empty;
79 public Vector3 lastKnownAllowedPosition;
80 81
81 // Agent moves with a PID controller causing a force to be exerted. 82 // Agent moves with a PID controller causing a force to be exerted.
82 private LLVector3 lastPhysPos; 83 private bool m_newForce = false;
83 protected AvatarAppearance m_appearance; 84 private bool m_newCoarseLocations = true;
85 private bool m_gotAllObjectsInScene = false;
84 86
85 protected List<SceneObjectGroup> m_attachments = new List<SceneObjectGroup>(); 87 private LLVector3 m_lastVelocity = LLVector3.Zero;
88
89 // Default AV Height
86 private float m_avHeight = 127.0f; 90 private float m_avHeight = 127.0f;
87 private Quaternion m_bodyRot; 91
92 protected RegionInfo m_regionInfo;
93 protected ulong crossingFromRegion = 0;
94
95 private readonly Vector3[] Dir_Vectors = new Vector3[6];
96 private LLVector3 lastPhysPos = new LLVector3();
88 97
89 // Position of agent's camera in world (region cordinates) 98 // Position of agent's camera in world (region cordinates)
99 protected Vector3 m_CameraCenter = new Vector3(0, 0, 0);
90 100
91 // Use these three vectors to figure out what the agent is looking at 101 // Use these three vectors to figure out what the agent is looking at
92 // Convert it to a Matrix and/or Quaternion 102 // Convert it to a Matrix and/or Quaternion
93 protected Vector3 m_CameraAtAxis = new Vector3(0, 0, 0); 103 protected Vector3 m_CameraAtAxis = new Vector3(0, 0, 0);
94 protected Vector3 m_CameraCenter = new Vector3(0, 0, 0);
95 protected Vector3 m_CameraLeftAxis = new Vector3(0, 0, 0); 104 protected Vector3 m_CameraLeftAxis = new Vector3(0, 0, 0);
96 protected Vector3 m_CameraUpAxis = new Vector3(0, 0, 0); 105 protected Vector3 m_CameraUpAxis = new Vector3(0, 0, 0);
97 protected float m_DrawDistance; 106 private uint m_AgentControlFlags = (uint) 0;
98 private float m_godlevel; 107 private LLQuaternion m_headrotation = new LLQuaternion();
99 private bool m_gotAllObjectsInScene; 108 private byte m_state = (byte) 0;
100 private LLQuaternion m_headrotation;
101 private LLVector3 m_LastChildAgentUpdatePosition;
102 private LLVector3 m_lastVelocity = LLVector3.Zero;
103 private byte m_movementflag;
104 private bool m_newCoarseLocations = true;
105 private bool m_newForce;
106 private int m_perfMonMS;
107 protected RegionInfo m_regionInfo;
108 private LLVector3 m_requestedSitOffset;
109 private uint m_requestedSitTargetID;
110 private bool m_setAlwaysRun;
111 private float m_sitAvatarHeight = 2.0f;
112 private short m_updateCount;
113 private bool m_updateflag;
114 109
115 //Reuse the LLVector3 instead of creating a new one on the UpdateMovement method 110 //Reuse the LLVector3 instead of creating a new one on the UpdateMovement method
116 private LLVector3 movementvector; 111 private LLVector3 movementvector = new LLVector3();
117 112
118 /// <summary> 113 private List<LLUUID> m_knownPrimUUID = new List<LLUUID>();
119 /// Position at which a significant movement was made
120 /// </summary>
121 private LLVector3 posLastSignificantMove;
122 114
123 public bool sentMessageAboutRestrictedParcelFlyingDown; 115 // Agent's Draw distance.
116 protected float m_DrawDistance = 0f;
124 117
125 #region Properties 118 protected AvatarAppearance m_appearance;
126 119
127 private readonly string m_firstname; 120 protected List<SceneObjectGroup> m_attachments = new List<SceneObjectGroup>();
128 private readonly string m_lastname; 121
129 private readonly ulong m_regionHandle; 122 //neighbouring regions we have enabled a child agent in
130 protected bool m_allowMovement = true; 123 private readonly List<ulong> m_knownChildRegions = new List<ulong>();
124
125 private SignificantClientMovement handlerSignificantClientMovement = null; //OnSignificantClientMovement;
131 126
132 /// <summary> 127 /// <summary>
133 /// This works out to be the ClientView object associated with this avatar, or it's UDP connection manager 128 /// Implemented Control Flags
134 /// </summary> 129 /// </summary>
135 private IClientAPI m_controllingClient; 130 private enum Dir_ControlFlags
131 {
132 DIR_CONTROL_FLAG_FORWARD = AgentManager.ControlFlags.AGENT_CONTROL_AT_POS,
133 DIR_CONTROL_FLAG_BACK = AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG,
134 DIR_CONTROL_FLAG_LEFT = AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS,
135 DIR_CONTROL_FLAG_RIGHT = AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG,
136 DIR_CONTROL_FLAG_UP = AgentManager.ControlFlags.AGENT_CONTROL_UP_POS,
137 DIR_CONTROL_FLAG_DOWN = AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG,
138 DIR_CONTROL_FLAG_DOWN_NUDGE = AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG
139 }
136 140
137 /// <summary> 141 /// <summary>
138 /// If this is true, agent doesn't have a representation in this scene. 142 /// Position at which a significant movement was made
139 /// this is an agent 'looking into' this scene from a nearby scene(region)
140 ///
141 /// if False, this agent has a representation in this scene
142 /// </summary> 143 /// </summary>
143 private bool m_isChildAgent = true; 144 private LLVector3 posLastSignificantMove = new LLVector3();
144 145
145 private uint m_parentID; 146 public delegate void SignificantClientMovement(IClientAPI remote_client);
146 protected LLVector3 m_parentPosition; 147
147 protected PhysicsActor m_physicsActor; 148 public event SignificantClientMovement OnSignificantClientMovement;
149
150 private UpdateQueue m_partsUpdateQueue = new UpdateQueue();
151 private Dictionary<LLUUID, ScenePartUpdate> m_updateTimes = new Dictionary<LLUUID, ScenePartUpdate>();
152
153 #region Properties
148 154
149 /// <summary> 155 /// <summary>
150 /// Physical scene representation of this Avatar. 156 /// Physical scene representation of this Avatar.
@@ -161,6 +167,16 @@ namespace OpenSim.Region.Environment.Scenes
161 get { return m_movementflag; } 167 get { return m_movementflag; }
162 } 168 }
163 169
170 public bool KnownPrim(LLUUID primID)
171 {
172 if (m_knownPrimUUID.Contains(primID))
173 {
174 return true;
175 }
176 m_knownPrimUUID.Add(primID);
177 return false;
178 }
179
164 180
165 public bool Updated 181 public bool Updated
166 { 182 {
@@ -168,6 +184,8 @@ namespace OpenSim.Region.Environment.Scenes
168 get { return m_updateflag; } 184 get { return m_updateflag; }
169 } 185 }
170 186
187 private readonly ulong m_regionHandle;
188
171 public ulong RegionHandle 189 public ulong RegionHandle
172 { 190 {
173 get { return m_regionHandle; } 191 get { return m_regionHandle; }
@@ -178,11 +196,15 @@ namespace OpenSim.Region.Environment.Scenes
178 get { return m_CameraCenter; } 196 get { return m_CameraCenter; }
179 } 197 }
180 198
199 private readonly string m_firstname;
200
181 public string Firstname 201 public string Firstname
182 { 202 {
183 get { return m_firstname; } 203 get { return m_firstname; }
184 } 204 }
185 205
206 private readonly string m_lastname;
207
186 public string Lastname 208 public string Lastname
187 { 209 {
188 get { return m_lastname; } 210 get { return m_lastname; }
@@ -193,18 +215,29 @@ namespace OpenSim.Region.Environment.Scenes
193 get { return m_DrawDistance; } 215 get { return m_DrawDistance; }
194 } 216 }
195 217
218 protected bool m_allowMovement = true;
219
196 public bool AllowMovement 220 public bool AllowMovement
197 { 221 {
198 get { return m_allowMovement; } 222 get { return m_allowMovement; }
199 set { m_allowMovement = value; } 223 set { m_allowMovement = value; }
200 } 224 }
201 225
226 /// <summary>
227 /// This works out to be the ClientView object associated with this avatar, or it's UDP connection manager
228 /// </summary>
229 private IClientAPI m_controllingClient;
230
231 protected PhysicsActor m_physicsActor;
232
202 public IClientAPI ControllingClient 233 public IClientAPI ControllingClient
203 { 234 {
204 get { return m_controllingClient; } 235 get { return m_controllingClient; }
205 set { m_controllingClient = value; } 236 set { m_controllingClient = value; }
206 } 237 }
207 238
239 protected LLVector3 m_parentPosition = new LLVector3();
240
208 /// <summary> 241 /// <summary>
209 /// Absolute position of this avatar in 'region cordinates' 242 /// Absolute position of this avatar in 'region cordinates'
210 /// </summary> 243 /// </summary>
@@ -239,7 +272,7 @@ namespace OpenSim.Region.Environment.Scenes
239 } 272 }
240 273
241 m_pos = value; 274 m_pos = value;
242 m_parentPosition = new LLVector3(0, 0, 0); 275 m_parentPosition=new LLVector3(0, 0, 0);
243 } 276 }
244 } 277 }
245 278
@@ -280,12 +313,22 @@ namespace OpenSim.Region.Environment.Scenes
280 } 313 }
281 } 314 }
282 315
316 /// <summary>
317 /// If this is true, agent doesn't have a representation in this scene.
318 /// this is an agent 'looking into' this scene from a nearby scene(region)
319 ///
320 /// if False, this agent has a representation in this scene
321 /// </summary>
322 private bool m_isChildAgent = true;
323
283 public bool IsChildAgent 324 public bool IsChildAgent
284 { 325 {
285 get { return m_isChildAgent; } 326 get { return m_isChildAgent; }
286 set { m_isChildAgent = value; } 327 set { m_isChildAgent = value; }
287 } 328 }
288 329
330 private uint m_parentID = 0;
331
289 public uint ParentID 332 public uint ParentID
290 { 333 {
291 get { return m_parentID; } 334 get { return m_parentID; }
@@ -300,16 +343,6 @@ namespace OpenSim.Region.Environment.Scenes
300 get { return m_knownChildRegions; } 343 get { return m_knownChildRegions; }
301 } 344 }
302 345
303 public bool KnownPrim(LLUUID primID)
304 {
305 if (m_knownPrimUUID.Contains(primID))
306 {
307 return true;
308 }
309 m_knownPrimUUID.Add(primID);
310 return false;
311 }
312
313 #endregion 346 #endregion
314 347
315 #region Constructor(s) 348 #region Constructor(s)
@@ -387,360 +420,6 @@ namespace OpenSim.Region.Environment.Scenes
387 420
388 #endregion 421 #endregion
389 422
390 static ScenePresence()
391 {
392 LLObject.TextureEntry textu = AvatarAppearance.GetDefaultTextureEntry();
393 DefaultTexture = textu.ToBytes();
394 }
395
396 public ScenePresence()
397 {
398/* JB
399 if (Animations == null)
400 {
401 Animations = new AvatarAnimations();
402 Animations.LoadAnims();
403 }
404*/
405 if (DefaultTexture == null)
406 {
407 LLObject.TextureEntry textu = AvatarAppearance.GetDefaultTextureEntry();
408 DefaultTexture = textu.ToBytes();
409 }
410 }
411
412 protected ScenePresence(SerializationInfo info, StreamingContext context)
413 : base(info, context)
414 {
415 //System.Console.WriteLine("ScenePresence Deserialize BGN");
416
417 if (info == null)
418 {
419 throw new ArgumentNullException("info");
420 }
421/* JB
422 if (Animations == null)
423 {
424 Animations = new AvatarAnimations();
425 Animations.LoadAnims();
426 }
427*/
428 if (DefaultTexture == null)
429 {
430 LLObject.TextureEntry textu = AvatarAppearance.GetDefaultTextureEntry();
431 DefaultTexture = textu.ToBytes();
432 }
433
434 List<Guid> animations_work = (List<Guid>) info.GetValue("m_animations", typeof (List<Guid>));
435
436 foreach (Guid guid in animations_work)
437 {
438 m_animations.Add(new LLUUID(guid));
439 }
440
441 m_animationSeqs = (List<int>) info.GetValue("m_animationSeqs", typeof (List<int>));
442 m_updateflag = (bool) info.GetValue("m_updateflag", typeof (bool));
443 m_movementflag = (byte) info.GetValue("m_movementflag", typeof (byte));
444 m_forcesList = (List<NewForce>) info.GetValue("m_forcesList", typeof (List<NewForce>));
445 m_updateCount = (short) info.GetValue("m_updateCount", typeof (short));
446 m_requestedSitTargetID = (uint) info.GetValue("m_requestedSitTargetID", typeof (uint));
447
448 m_requestedSitOffset
449 = new LLVector3(
450 (float) info.GetValue("m_requestedSitOffset.X", typeof (float)),
451 (float) info.GetValue("m_requestedSitOffset.Y", typeof (float)),
452 (float) info.GetValue("m_requestedSitOffset.Z", typeof (float)));
453
454 m_sitAvatarHeight = (float) info.GetValue("m_sitAvatarHeight", typeof (float));
455 m_godlevel = (float) info.GetValue("m_godlevel", typeof (float));
456 m_setAlwaysRun = (bool) info.GetValue("m_setAlwaysRun", typeof (bool));
457
458 m_bodyRot
459 = new Quaternion(
460 (float) info.GetValue("m_bodyRot.w", typeof (float)),
461 (float) info.GetValue("m_bodyRot.x", typeof (float)),
462 (float) info.GetValue("m_bodyRot.y", typeof (float)),
463 (float) info.GetValue("m_bodyRot.z", typeof (float)));
464
465 IsRestrictedToRegion = (bool) info.GetValue("IsRestrictedToRegion", typeof (bool));
466 m_newForce = (bool) info.GetValue("m_newForce", typeof (bool));
467 //m_newAvatar = (bool)info.GetValue("m_newAvatar", typeof(bool));
468 m_newCoarseLocations = (bool) info.GetValue("m_newCoarseLocations", typeof (bool));
469 m_gotAllObjectsInScene = (bool) info.GetValue("m_gotAllObjectsInScene", typeof (bool));
470 m_avHeight = (float) info.GetValue("m_avHeight", typeof (float));
471 crossingFromRegion = (ulong) info.GetValue("crossingFromRegion", typeof (ulong));
472
473 List<float[]> Dir_Vectors_work = (List<float[]>) info.GetValue("Dir_Vectors", typeof (List<float[]>));
474 List<Vector3> Dir_Vectors_work2 = new List<Vector3>();
475
476 foreach (float[] f3 in Dir_Vectors_work)
477 {
478 Dir_Vectors_work2.Add(new Vector3(f3[0], f3[1], f3[2]));
479 }
480
481 Dir_Vectors = Dir_Vectors_work2.ToArray();
482
483 lastPhysPos
484 = new LLVector3(
485 (float) info.GetValue("lastPhysPos.X", typeof (float)),
486 (float) info.GetValue("lastPhysPos.Y", typeof (float)),
487 (float) info.GetValue("lastPhysPos.Z", typeof (float)));
488
489 m_CameraCenter
490 = new Vector3(
491 (float) info.GetValue("m_CameraCenter.X", typeof (float)),
492 (float) info.GetValue("m_CameraCenter.Y", typeof (float)),
493 (float) info.GetValue("m_CameraCenter.Z", typeof (float)));
494
495 m_CameraAtAxis
496 = new Vector3(
497 (float) info.GetValue("m_CameraAtAxis.X", typeof (float)),
498 (float) info.GetValue("m_CameraAtAxis.Y", typeof (float)),
499 (float) info.GetValue("m_CameraAtAxis.Z", typeof (float)));
500
501 m_CameraLeftAxis
502 = new Vector3(
503 (float) info.GetValue("m_CameraLeftAxis.X", typeof (float)),
504 (float) info.GetValue("m_CameraLeftAxis.Y", typeof (float)),
505 (float) info.GetValue("m_CameraLeftAxis.Z", typeof (float)));
506
507 m_CameraUpAxis
508 = new Vector3(
509 (float) info.GetValue("m_CameraUpAxis.X", typeof (float)),
510 (float) info.GetValue("m_CameraUpAxis.Y", typeof (float)),
511 (float) info.GetValue("m_CameraUpAxis.Z", typeof (float)));
512
513 m_DrawDistance = (float) info.GetValue("m_DrawDistance", typeof (float));
514 m_appearance = (AvatarAppearance) info.GetValue("m_appearance", typeof (AvatarAppearance));
515 m_knownChildRegions = (List<ulong>) info.GetValue("m_knownChildRegions", typeof (List<ulong>));
516
517 posLastSignificantMove
518 = new LLVector3(
519 (float) info.GetValue("posLastSignificantMove.X", typeof (float)),
520 (float) info.GetValue("posLastSignificantMove.Y", typeof (float)),
521 (float) info.GetValue("posLastSignificantMove.Z", typeof (float)));
522
523 // m_partsUpdateQueue = (UpdateQueue)info.GetValue("m_partsUpdateQueue", typeof(UpdateQueue));
524
525 /*
526 Dictionary<Guid, ScenePartUpdate> updateTimes_work
527 = (Dictionary<Guid, ScenePartUpdate>)info.GetValue("m_updateTimes", typeof(Dictionary<Guid, ScenePartUpdate>));
528
529 foreach (Guid id in updateTimes_work.Keys)
530 {
531 m_updateTimes.Add(new LLUUID(id), updateTimes_work[id]);
532 }
533 */
534 m_regionHandle = (ulong) info.GetValue("m_regionHandle", typeof (ulong));
535 m_firstname = (string) info.GetValue("m_firstname", typeof (string));
536 m_lastname = (string) info.GetValue("m_lastname", typeof (string));
537 m_allowMovement = (bool) info.GetValue("m_allowMovement", typeof (bool));
538 m_parentPosition = new LLVector3((float) info.GetValue("m_parentPosition.X", typeof (float)),
539 (float) info.GetValue("m_parentPosition.Y", typeof (float)),
540 (float) info.GetValue("m_parentPosition.Z", typeof (float)));
541
542 m_isChildAgent = (bool) info.GetValue("m_isChildAgent", typeof (bool));
543 m_parentID = (uint) info.GetValue("m_parentID", typeof (uint));
544
545// for OpenSim_v0.5
546 currentParcelUUID = new LLUUID((Guid) info.GetValue("currentParcelUUID", typeof (Guid)));
547
548 lastKnownAllowedPosition
549 = new Vector3(
550 (float) info.GetValue("lastKnownAllowedPosition.X", typeof (float)),
551 (float) info.GetValue("lastKnownAllowedPosition.Y", typeof (float)),
552 (float) info.GetValue("lastKnownAllowedPosition.Z", typeof (float)));
553
554 sentMessageAboutRestrictedParcelFlyingDown = (bool) info.GetValue("sentMessageAboutRestrictedParcelFlyingDown", typeof (bool));
555
556 m_LastChildAgentUpdatePosition
557 = new LLVector3(
558 (float) info.GetValue("m_LastChildAgentUpdatePosition.X", typeof (float)),
559 (float) info.GetValue("m_LastChildAgentUpdatePosition.Y", typeof (float)),
560 (float) info.GetValue("m_LastChildAgentUpdatePosition.Z", typeof (float)));
561
562 m_perfMonMS = (int) info.GetValue("m_perfMonMS", typeof (int));
563 m_AgentControlFlags = (uint) info.GetValue("m_AgentControlFlags", typeof (uint));
564
565 m_headrotation
566 = new LLQuaternion(
567 (float) info.GetValue("m_headrotation.W", typeof (float)),
568 (float) info.GetValue("m_headrotation.X", typeof (float)),
569 (float) info.GetValue("m_headrotation.Y", typeof (float)),
570 (float) info.GetValue("m_headrotation.Z", typeof (float)));
571
572 m_state = (byte) info.GetValue("m_state", typeof (byte));
573
574 List<Guid> knownPrimUUID_work = (List<Guid>) info.GetValue("m_knownPrimUUID", typeof (List<Guid>));
575
576 foreach (Guid id in knownPrimUUID_work)
577 {
578 m_knownPrimUUID.Add(new LLUUID(id));
579 }
580
581 //System.Console.WriteLine("ScenePresence Deserialize END");
582 }
583
584 #region ISerializable Members
585
586 [SecurityPermission(SecurityAction.LinkDemand,
587 Flags = SecurityPermissionFlag.SerializationFormatter)]
588 public override void GetObjectData(
589 SerializationInfo info, StreamingContext context)
590 {
591 if (info == null)
592 {
593 throw new ArgumentNullException("info");
594 }
595
596 base.GetObjectData(info, context);
597
598 List<Guid> animations_work = new List<Guid>();
599
600 foreach (LLUUID uuid in m_animations)
601 {
602 animations_work.Add(uuid.UUID);
603 }
604
605 info.AddValue("m_animations", animations_work);
606
607 info.AddValue("m_animationSeqs", m_animationSeqs);
608 info.AddValue("m_updateflag", m_updateflag);
609 info.AddValue("m_movementflag", m_movementflag);
610 info.AddValue("m_forcesList", m_forcesList);
611 info.AddValue("m_updateCount", m_updateCount);
612 info.AddValue("m_requestedSitTargetID", m_requestedSitTargetID);
613
614 // LLVector3
615 info.AddValue("m_requestedSitOffset.X", m_requestedSitOffset.X);
616 info.AddValue("m_requestedSitOffset.Y", m_requestedSitOffset.Y);
617 info.AddValue("m_requestedSitOffset.Z", m_requestedSitOffset.Z);
618
619 info.AddValue("m_sitAvatarHeight", m_sitAvatarHeight);
620 info.AddValue("m_godlevel", m_godlevel);
621 info.AddValue("m_setAlwaysRun", m_setAlwaysRun);
622
623 // Quaternion
624 info.AddValue("m_bodyRot.w", m_bodyRot.w);
625 info.AddValue("m_bodyRot.x", m_bodyRot.x);
626 info.AddValue("m_bodyRot.y", m_bodyRot.y);
627 info.AddValue("m_bodyRot.z", m_bodyRot.z);
628
629 info.AddValue("IsRestrictedToRegion", IsRestrictedToRegion);
630 info.AddValue("m_newForce", m_newForce);
631 //info.AddValue("m_newAvatar", m_newAvatar);
632 info.AddValue("m_newCoarseLocations", m_newCoarseLocations);
633 info.AddValue("m_gotAllObjectsInScene", m_gotAllObjectsInScene);
634 info.AddValue("m_avHeight", m_avHeight);
635
636 // info.AddValue("m_regionInfo", m_regionInfo);
637
638 info.AddValue("crossingFromRegion", crossingFromRegion);
639
640 List<float[]> Dir_Vectors_work = new List<float[]>();
641
642 foreach (Vector3 v3 in Dir_Vectors)
643 {
644 Dir_Vectors_work.Add(new[] {v3.x, v3.y, v3.z});
645 }
646
647 info.AddValue("Dir_Vectors", Dir_Vectors_work);
648
649 // LLVector3
650 info.AddValue("lastPhysPos.X", lastPhysPos.X);
651 info.AddValue("lastPhysPos.Y", lastPhysPos.Y);
652 info.AddValue("lastPhysPos.Z", lastPhysPos.Z);
653
654 // Vector3
655 info.AddValue("m_CameraCenter.X", m_CameraCenter.x);
656 info.AddValue("m_CameraCenter.Y", m_CameraCenter.y);
657 info.AddValue("m_CameraCenter.Z", m_CameraCenter.z);
658
659 // Vector3
660 info.AddValue("m_CameraAtAxis.X", m_CameraAtAxis.x);
661 info.AddValue("m_CameraAtAxis.Y", m_CameraAtAxis.y);
662 info.AddValue("m_CameraAtAxis.Z", m_CameraAtAxis.z);
663
664 // Vector3
665 info.AddValue("m_CameraLeftAxis.X", m_CameraLeftAxis.x);
666 info.AddValue("m_CameraLeftAxis.Y", m_CameraLeftAxis.y);
667 info.AddValue("m_CameraLeftAxis.Z", m_CameraLeftAxis.z);
668
669 // Vector3
670 info.AddValue("m_CameraUpAxis.X", m_CameraUpAxis.x);
671 info.AddValue("m_CameraUpAxis.Y", m_CameraUpAxis.y);
672 info.AddValue("m_CameraUpAxis.Z", m_CameraUpAxis.z);
673
674 info.AddValue("m_DrawDistance", m_DrawDistance);
675 info.AddValue("m_appearance", m_appearance);
676 info.AddValue("m_knownChildRegions", m_knownChildRegions);
677
678 // LLVector3
679 info.AddValue("posLastSignificantMove.X", posLastSignificantMove.X);
680 info.AddValue("posLastSignificantMove.Y", posLastSignificantMove.Y);
681 info.AddValue("posLastSignificantMove.Z", posLastSignificantMove.Z);
682
683 //info.AddValue("m_partsUpdateQueue", m_partsUpdateQueue);
684
685 /*
686 Dictionary<Guid, ScenePartUpdate> updateTimes_work = new Dictionary<Guid, ScenePartUpdate>();
687
688 foreach ( LLUUID id in m_updateTimes.Keys)
689 {
690 updateTimes_work.Add(id.UUID, m_updateTimes[id]);
691 }
692
693 info.AddValue("m_updateTimes", updateTimes_work);
694 */
695
696 info.AddValue("m_regionHandle", m_regionHandle);
697 info.AddValue("m_firstname", m_firstname);
698 info.AddValue("m_lastname", m_lastname);
699 info.AddValue("m_allowMovement", m_allowMovement);
700 //info.AddValue("m_physicsActor", m_physicsActor);
701 info.AddValue("m_parentPosition.X", m_parentPosition.X);
702 info.AddValue("m_parentPosition.Y", m_parentPosition.Y);
703 info.AddValue("m_parentPosition.Z", m_parentPosition.Z);
704 info.AddValue("m_isChildAgent", m_isChildAgent);
705 info.AddValue("m_parentID", m_parentID);
706
707// for OpenSim_v0.5
708 info.AddValue("currentParcelUUID", currentParcelUUID.UUID);
709
710 info.AddValue("lastKnownAllowedPosition.X", lastKnownAllowedPosition.x);
711 info.AddValue("lastKnownAllowedPosition.Y", lastKnownAllowedPosition.y);
712 info.AddValue("lastKnownAllowedPosition.Z", lastKnownAllowedPosition.z);
713
714 info.AddValue("sentMessageAboutRestrictedParcelFlyingDown", sentMessageAboutRestrictedParcelFlyingDown);
715
716 info.AddValue("m_LastChildAgentUpdatePosition.X", m_LastChildAgentUpdatePosition.X);
717 info.AddValue("m_LastChildAgentUpdatePosition.Y", m_LastChildAgentUpdatePosition.Y);
718 info.AddValue("m_LastChildAgentUpdatePosition.Z", m_LastChildAgentUpdatePosition.Z);
719
720 info.AddValue("m_perfMonMS", m_perfMonMS);
721 info.AddValue("m_AgentControlFlags", m_AgentControlFlags);
722
723 info.AddValue("m_headrotation.W", m_headrotation.W);
724 info.AddValue("m_headrotation.X", m_headrotation.X);
725 info.AddValue("m_headrotation.Y", m_headrotation.Y);
726 info.AddValue("m_headrotation.Z", m_headrotation.Z);
727
728 info.AddValue("m_state", m_state);
729
730 List<Guid> knownPrimUUID_work = new List<Guid>();
731
732 foreach (LLUUID id in m_knownPrimUUID)
733 {
734 knownPrimUUID_work.Add(id.UUID);
735 }
736
737 info.AddValue("m_knownPrimUUID", knownPrimUUID_work);
738 }
739
740 #endregion
741
742 public event SignificantClientMovement OnSignificantClientMovement;
743
744 /// <summary> 423 /// <summary>
745 /// Add the part to the queue of parts for which we need to send an update to the client 424 /// Add the part to the queue of parts for which we need to send an update to the client
746 /// </summary> 425 /// </summary>
@@ -778,12 +457,12 @@ namespace OpenSim.Region.Environment.Scenes
778 if (!m_gotAllObjectsInScene) 457 if (!m_gotAllObjectsInScene)
779 { 458 {
780 if (!m_isChildAgent || m_scene.m_seeIntoRegionFromNeighbor) 459 if (!m_isChildAgent || m_scene.m_seeIntoRegionFromNeighbor)
781 { 460 {
782 m_scene.SendAllSceneObjectsToClient(this); 461 m_scene.SendAllSceneObjectsToClient(this);
783 m_gotAllObjectsInScene = true; 462 m_gotAllObjectsInScene = true;
784 } 463 }
785 } 464 }
786 465
787 if (m_partsUpdateQueue.Count > 0) 466 if (m_partsUpdateQueue.Count > 0)
788 { 467 {
789 bool runUpdate = true; 468 bool runUpdate = true;
@@ -802,7 +481,7 @@ namespace OpenSim.Region.Environment.Scenes
802// m_log.DebugFormat( 481// m_log.DebugFormat(
803// "[SCENE PRESENCE]: Fully updating prim {0}, {1} - part timestamp {2}", 482// "[SCENE PRESENCE]: Fully updating prim {0}, {1} - part timestamp {2}",
804// part.Name, part.UUID, part.TimeStampFull); 483// part.Name, part.UUID, part.TimeStampFull);
805 484
806 part.SendFullUpdate(ControllingClient, GenerateClientFlags(part.UUID)); 485 part.SendFullUpdate(ControllingClient, GenerateClientFlags(part.UUID));
807 486
808 // We'll update to the part's timestamp rather than the current time to 487 // We'll update to the part's timestamp rather than the current time to
@@ -818,7 +497,7 @@ namespace OpenSim.Region.Environment.Scenes
818// m_log.DebugFormat( 497// m_log.DebugFormat(
819// "[SCENE PRESENCE]: Tersely updating prim {0}, {1} - part timestamp {2}", 498// "[SCENE PRESENCE]: Tersely updating prim {0}, {1} - part timestamp {2}",
820// part.Name, part.UUID, part.TimeStampTerse); 499// part.Name, part.UUID, part.TimeStampTerse);
821 500
822 part.SendTerseUpdate(ControllingClient); 501 part.SendTerseUpdate(ControllingClient);
823 502
824 update.LastTerseUpdateTime = part.TimeStampTerse; 503 update.LastTerseUpdateTime = part.TimeStampTerse;
@@ -851,235 +530,6 @@ namespace OpenSim.Region.Environment.Scenes
851 AddNewMovement(position, rotation); 530 AddNewMovement(position, rotation);
852 } 531 }
853 532
854 /// <summary>
855 /// This allows the Sim owner the abiility to kick users from their sim currently.
856 /// It tells the client that the agent has permission to do so.
857 /// </summary>
858 public void GrantGodlikePowers(LLUUID agentID, LLUUID sessionID, LLUUID token, bool godStatus)
859 {
860 GrantGodlikePowersPacket respondPacket = new GrantGodlikePowersPacket();
861 GrantGodlikePowersPacket.GrantDataBlock gdb = new GrantGodlikePowersPacket.GrantDataBlock();
862 GrantGodlikePowersPacket.AgentDataBlock adb = new GrantGodlikePowersPacket.AgentDataBlock();
863
864 adb.AgentID = agentID;
865 adb.SessionID = sessionID; // More security
866
867 if (godStatus)
868 {
869 gdb.GodLevel = 250;
870 m_godlevel = 250;
871 }
872 else
873 {
874 gdb.GodLevel = 0;
875 m_godlevel = 0;
876 }
877
878 gdb.Token = token;
879 //respondPacket.AgentData = (GrantGodlikePowersPacket.AgentDataBlock)ablock;
880 respondPacket.GrantData = gdb;
881 respondPacket.AgentData = adb;
882 ControllingClient.OutPacket(respondPacket, ThrottleOutPacketType.Task);
883 }
884
885 /// <summary>
886 /// This updates important decision making data about a child agent
887 /// The main purpose is to figure out what objects to send to a child agent that's in a neighboring region
888 /// </summary>
889 public void ChildAgentDataUpdate(ChildAgentDataUpdate cAgentData, uint tRegionX, uint tRegionY, uint rRegionX, uint rRegionY)
890 {
891 //
892 int shiftx = ((int) rRegionX - (int) tRegionX) * (int) Constants.RegionSize;
893 int shifty = ((int) rRegionY - (int) tRegionY) * (int) Constants.RegionSize;
894
895 m_DrawDistance = cAgentData.drawdistance;
896 m_pos = new LLVector3(cAgentData.Position.x + shiftx, cAgentData.Position.y + shifty, cAgentData.Position.z);
897
898 // It's hard to say here.. We can't really tell where the camera position is unless it's in world cordinates from the sending region
899 m_CameraCenter =
900 new Vector3(cAgentData.cameraPosition.x, cAgentData.cameraPosition.y, cAgentData.cameraPosition.z);
901
902
903 m_godlevel = cAgentData.godlevel;
904 SetHeight(cAgentData.AVHeight);
905
906 ControllingClient.SetChildAgentThrottle(cAgentData.throttles);
907
908
909 // Sends out the objects in the user's draw distance if m_sendTasksToChild is true.
910 if (m_scene.m_seeIntoRegionFromNeighbor)
911 m_scene.SendAllSceneObjectsToClient(this);
912 //cAgentData.AVHeight;
913 //cAgentData.regionHandle;
914 //m_velocity = cAgentData.Velocity;
915 }
916
917 /// <summary>
918 /// Handles part of the PID controller function for moving an avatar.
919 /// </summary>
920 public override void UpdateMovement()
921 {
922 m_newForce = false;
923 lock (m_forcesList)
924 {
925 if (m_forcesList.Count > 0)
926 {
927 for (int i = 0; i < m_forcesList.Count; i++)
928 {
929 NewForce force = m_forcesList[i];
930
931 m_updateflag = true;
932 try
933 {
934 movementvector.X = force.X;
935 movementvector.Y = force.Y;
936 movementvector.Z = force.Z;
937 Velocity = movementvector;
938 }
939 catch (NullReferenceException)
940 {
941 // Under extreme load, this returns a NullReference Exception that we can ignore.
942 // Ignoring this causes no movement to be sent to the physics engine...
943 // which when the scene is moving at 1 frame every 10 seconds, it doesn't really matter!
944 }
945 m_newForce = true;
946 }
947 for (int i = 0; i < m_forcesList.Count; i++)
948 {
949 m_forcesList.RemoveAt(0);
950 }
951 }
952 }
953 }
954
955 public override void SetText(string text, Vector3 color, double alpha)
956 {
957 throw new Exception("Can't set Text on avatar.");
958 }
959
960 /// <summary>
961 /// Adds a physical representation of the avatar to the Physics plugin
962 /// </summary>
963 public void AddToPhysicalScene()
964 {
965 PhysicsScene scene = m_scene.PhysicsScene;
966
967 PhysicsVector pVec =
968 new PhysicsVector(AbsolutePosition.X, AbsolutePosition.Y,
969 AbsolutePosition.Z);
970 if (m_avHeight == 127.0f)
971 {
972 m_physicsActor = scene.AddAvatar(Firstname + "." + Lastname, pVec, new PhysicsVector(0, 0, 1.56f));
973 }
974 else
975 {
976 m_physicsActor = scene.AddAvatar(Firstname + "." + Lastname, pVec, new PhysicsVector(0, 0, m_avHeight));
977 }
978 //m_physicsActor.OnRequestTerseUpdate += SendTerseUpdateToAllClients;
979 m_physicsActor.OnCollisionUpdate += PhysicsCollisionUpdate;
980 m_physicsActor.LocalID = LocalId;
981 }
982
983 // Event called by the physics plugin to tell the avatar about a collision.
984 private void PhysicsCollisionUpdate(EventArgs e)
985 {
986 bool isUserMoving = Velocity.X > 0 || Velocity.Y > 0;
987 UpdateMovementAnimations(isUserMoving);
988 }
989
990 internal void Close()
991 {
992 lock (m_attachments)
993 {
994 foreach (SceneObjectGroup grp in m_attachments)
995 {
996 // ControllingClient may be null at this point!
997 m_scene.m_innerScene.DetachSingleAttachmentToInv(grp.GetFromAssetID(), ControllingClient);
998 }
999 m_attachments.Clear();
1000 }
1001 lock (m_knownPrimUUID)
1002 {
1003 m_knownPrimUUID.Clear();
1004 }
1005 lock (m_knownChildRegions)
1006 {
1007 m_knownChildRegions.Clear();
1008 }
1009 lock (m_updateTimes)
1010 {
1011 m_updateTimes.Clear();
1012 }
1013 lock (m_partsUpdateQueue)
1014 {
1015 m_partsUpdateQueue.Clear();
1016 }
1017
1018 RemoveFromPhysicalScene();
1019 GC.Collect();
1020 }
1021
1022 public void AddAttachment(SceneObjectGroup gobj)
1023 {
1024 lock (m_attachments)
1025 {
1026 m_attachments.Add(gobj);
1027 }
1028 }
1029
1030 public void RemoveAttachment(SceneObjectGroup gobj)
1031 {
1032 lock (m_attachments)
1033 {
1034 if (m_attachments.Contains(gobj))
1035 {
1036 m_attachments.Remove(gobj);
1037 }
1038 }
1039 }
1040
1041 public void CrossAttachmentsIntoNewRegion(ulong regionHandle)
1042 {
1043 lock (m_attachments)
1044 {
1045 foreach (SceneObjectGroup gobj in m_attachments)
1046 {
1047 // If the prim group is null then something must have happened to it!
1048 if (gobj != null)
1049 {
1050 // Set the parent localID to 0 so it transfers over properly.
1051 gobj.RootPart.SetParentLocalId(0);
1052 gobj.RootPart.m_IsAttachment = false;
1053 gobj.AbsolutePosition = gobj.RootPart.m_attachedPos;
1054 gobj.RootPart.LastOwnerID = gobj.GetFromAssetID();
1055 m_scene.CrossPrimGroupIntoNewRegion(regionHandle, gobj);
1056 }
1057 }
1058 m_attachments.Clear();
1059 }
1060 }
1061
1062 public void initializeScenePresence(IClientAPI client, RegionInfo region, Scene scene)
1063 {
1064 m_controllingClient = client;
1065 m_regionInfo = region;
1066 m_scene = scene;
1067 RegisterToEvents();
1068
1069 /*
1070 AbsolutePosition = client.StartPos;
1071
1072 Animations = new AvatarAnimations();
1073 Animations.LoadAnims();
1074
1075 m_animations = new List<LLUUID>();
1076 m_animations.Add(Animations.AnimsLLUUID["STAND"]);
1077 m_animationSeqs.Add(m_controllingClient.NextAnimationSequenceNumber);
1078
1079 SetDirectionVectors();
1080 */
1081 }
1082
1083 #region Status Methods 533 #region Status Methods
1084 534
1085 /// <summary> 535 /// <summary>
@@ -1092,7 +542,7 @@ namespace OpenSim.Region.Environment.Scenes
1092// m_log.DebugFormat( 542// m_log.DebugFormat(
1093// "[SCENEPRESENCE]: Upgrading child agent {0}, {1} to a root agent in {2}", 543// "[SCENEPRESENCE]: Upgrading child agent {0}, {1} to a root agent in {2}",
1094// Name, UUID, m_scene.RegionInfo.RegionName); 544// Name, UUID, m_scene.RegionInfo.RegionName);
1095 545
1096 m_isChildAgent = false; 546 m_isChildAgent = false;
1097 547
1098 AbsolutePosition = pos; 548 AbsolutePosition = pos;
@@ -1108,7 +558,7 @@ namespace OpenSim.Region.Environment.Scenes
1108 //{ 558 //{
1109 m_scene.SendAllSceneObjectsToClient(this); 559 m_scene.SendAllSceneObjectsToClient(this);
1110 m_scene.LandChannel.sendLandUpdate(this, true); 560 m_scene.LandChannel.sendLandUpdate(this, true);
1111 561
1112 //m_gotAllObjectsInScene = true; 562 //m_gotAllObjectsInScene = true;
1113 //} 563 //}
1114 } 564 }
@@ -1122,9 +572,9 @@ namespace OpenSim.Region.Environment.Scenes
1122 /// </summary> 572 /// </summary>
1123 public void MakeChildAgent() 573 public void MakeChildAgent()
1124 { 574 {
1125 if (m_animations.Count > 0) 575 if(m_animations.Count > 0)
1126 { 576 {
1127 LLUUID movement = m_animations[0]; 577 LLUUID movement=m_animations[0];
1128 578
1129 m_animations.Clear(); 579 m_animations.Clear();
1130 m_animationSeqs.Clear(); 580 m_animationSeqs.Clear();
@@ -1134,7 +584,7 @@ namespace OpenSim.Region.Environment.Scenes
1134// m_log.DebugFormat( 584// m_log.DebugFormat(
1135// "[SCENEPRESENCE]: Downgrading child agent {0}, {1} to a root agent in {2}", 585// "[SCENEPRESENCE]: Downgrading child agent {0}, {1} to a root agent in {2}",
1136// Name, UUID, m_scene.RegionInfo.RegionName); 586// Name, UUID, m_scene.RegionInfo.RegionName);
1137 587
1138 Velocity = new LLVector3(0, 0, 0); 588 Velocity = new LLVector3(0, 0, 0);
1139 m_isChildAgent = true; 589 m_isChildAgent = true;
1140 m_scene.SwapRootAgentCount(true); 590 m_scene.SwapRootAgentCount(true);
@@ -1391,8 +841,9 @@ namespace OpenSim.Region.Environment.Scenes
1391 ((flags & (uint) AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG) != 0)); 841 ((flags & (uint) AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG) != 0));
1392 842
1393 // Are the collision requirements fulfilled? 843 // Are the collision requirements fulfilled?
1394 bool colliding = m_physicsActor.IsColliding; 844 bool colliding = (m_physicsActor.IsColliding == true);
1395 845
846
1396 847
1397 if (m_physicsActor.Flying && colliding && controlland) 848 if (m_physicsActor.Flying && colliding && controlland)
1398 { 849 {
@@ -1406,9 +857,9 @@ namespace OpenSim.Region.Environment.Scenes
1406 UpdateMovementAnimations(update_movementflag); 857 UpdateMovementAnimations(update_movementflag);
1407 } 858 }
1408 } 859 }
1409 860
1410 m_scene.EventManager.TriggerOnClientMovement(this); 861 m_scene.EventManager.TriggerOnClientMovement(this);
1411 862
1412 m_scene.AddAgentTime(System.Environment.TickCount - m_perfMonMS); 863 m_scene.AddAgentTime(System.Environment.TickCount - m_perfMonMS);
1413 } 864 }
1414 865
@@ -1435,9 +886,9 @@ namespace OpenSim.Region.Environment.Scenes
1435 AddToPhysicalScene(); 886 AddToPhysicalScene();
1436 } 887 }
1437 888
1438 m_pos += m_parentPosition + new LLVector3(0.0f, 0.0f, 2.0f * m_sitAvatarHeight); 889 m_pos += m_parentPosition + new LLVector3(0.0f, 0.0f, 2.0f*m_sitAvatarHeight);
1439 m_parentPosition = new LLVector3(); 890 m_parentPosition = new LLVector3();
1440 891
1441 m_parentID = 0; 892 m_parentID = 0;
1442 SendFullUpdateToAllClients(); 893 SendFullUpdateToAllClients();
1443 894
@@ -1540,7 +991,7 @@ namespace OpenSim.Region.Environment.Scenes
1540 } 991 }
1541 else 992 else
1542 { 993 {
1543 m_log.Warn("Sit requested on unknown object: " + targetID); 994 m_log.Warn("Sit requested on unknown object: " + targetID.ToString());
1544 } 995 }
1545 SendSitResponse(remoteClient, targetID, offset); 996 SendSitResponse(remoteClient, targetID, offset);
1546 } 997 }
@@ -1602,11 +1053,11 @@ namespace OpenSim.Region.Environment.Scenes
1602 1053
1603 public void AddAnimation(LLUUID animID) 1054 public void AddAnimation(LLUUID animID)
1604 { 1055 {
1605 if (m_isChildAgent) 1056 if(m_isChildAgent)
1606 return; 1057 return;
1607 1058
1608 // Don't let this animation become the movement animation 1059 // Don't let this animation become the movement animation
1609 if (m_animations.Count < 1) 1060 if(m_animations.Count < 1)
1610 SetMovementAnimation(Animations.AnimsLLUUID["STAND"]); 1061 SetMovementAnimation(Animations.AnimsLLUUID["STAND"]);
1611 1062
1612 if (!m_animations.Contains(animID)) 1063 if (!m_animations.Contains(animID))
@@ -1619,7 +1070,7 @@ namespace OpenSim.Region.Environment.Scenes
1619 1070
1620 public void RemoveAnimation(LLUUID animID) 1071 public void RemoveAnimation(LLUUID animID)
1621 { 1072 {
1622 if (m_isChildAgent) 1073 if(m_isChildAgent)
1623 return; 1074 return;
1624 1075
1625 if (m_animations.Contains(animID)) 1076 if (m_animations.Contains(animID))
@@ -1633,11 +1084,11 @@ namespace OpenSim.Region.Environment.Scenes
1633 // What a HACK!! Anim list really needs to be an object! 1084 // What a HACK!! Anim list really needs to be an object!
1634 int idx; 1085 int idx;
1635 1086
1636 for (idx = 0; idx < m_animations.Count; idx++) 1087 for(idx=0;idx < m_animations.Count;idx++)
1637 { 1088 {
1638 if (m_animations[idx] == animID) 1089 if(m_animations[idx] == animID)
1639 { 1090 {
1640 int seq = m_animationSeqs[idx]; 1091 int seq=m_animationSeqs[idx];
1641 1092
1642 m_animations.Remove(animID); 1093 m_animations.Remove(animID);
1643 m_animationSeqs.Remove(seq); 1094 m_animationSeqs.Remove(seq);
@@ -1666,7 +1117,7 @@ namespace OpenSim.Region.Environment.Scenes
1666 /// </summary> 1117 /// </summary>
1667 protected void SetMovementAnimation(LLUUID anim) 1118 protected void SetMovementAnimation(LLUUID anim)
1668 { 1119 {
1669 if (m_animations.Count < 1) 1120 if(m_animations.Count < 1)
1670 { 1121 {
1671 m_animations.Add(Animations.AnimsLLUUID["STAND"]); 1122 m_animations.Add(Animations.AnimsLLUUID["STAND"]);
1672 m_animationSeqs.Add(1); 1123 m_animationSeqs.Add(1);
@@ -1699,6 +1150,8 @@ namespace OpenSim.Region.Environment.Scenes
1699 /// </summary> 1150 /// </summary>
1700 protected void UpdateMovementAnimations(bool update_movementflag) 1151 protected void UpdateMovementAnimations(bool update_movementflag)
1701 { 1152 {
1153
1154
1702 if (update_movementflag) 1155 if (update_movementflag)
1703 { 1156 {
1704 // Are we moving? 1157 // Are we moving?
@@ -1731,8 +1184,7 @@ namespace OpenSim.Region.Environment.Scenes
1731 SetMovementAnimation(Animations.AnimsLLUUID["JUMP"]); 1184 SetMovementAnimation(Animations.AnimsLLUUID["JUMP"]);
1732 } 1185 }
1733 catch (KeyNotFoundException) 1186 catch (KeyNotFoundException)
1734 { 1187 { }
1735 }
1736 } 1188 }
1737 else if (m_setAlwaysRun) 1189 else if (m_setAlwaysRun)
1738 { 1190 {
@@ -1742,8 +1194,7 @@ namespace OpenSim.Region.Environment.Scenes
1742 SetMovementAnimation(Animations.AnimsLLUUID["RUN"]); 1194 SetMovementAnimation(Animations.AnimsLLUUID["RUN"]);
1743 } 1195 }
1744 catch (KeyNotFoundException) 1196 catch (KeyNotFoundException)
1745 { 1197 { }
1746 }
1747 } 1198 }
1748 else 1199 else
1749 { 1200 {
@@ -1753,8 +1204,8 @@ namespace OpenSim.Region.Environment.Scenes
1753 SetMovementAnimation(Animations.AnimsLLUUID["WALK"]); 1204 SetMovementAnimation(Animations.AnimsLLUUID["WALK"]);
1754 } 1205 }
1755 catch (KeyNotFoundException) 1206 catch (KeyNotFoundException)
1756 { 1207 { }
1757 } 1208
1758 } 1209 }
1759 } 1210 }
1760 else 1211 else
@@ -1788,14 +1239,15 @@ namespace OpenSim.Region.Environment.Scenes
1788 // We're not moving.. and we're not doing anything.. so play the stand animation 1239 // We're not moving.. and we're not doing anything.. so play the stand animation
1789 try 1240 try
1790 { 1241 {
1242
1791 SetMovementAnimation(Animations.AnimsLLUUID["STAND"]); 1243 SetMovementAnimation(Animations.AnimsLLUUID["STAND"]);
1792 } 1244 }
1793 catch (KeyNotFoundException) 1245 catch (KeyNotFoundException)
1794 { 1246 { }
1795 }
1796 } 1247 }
1797 } 1248 }
1798 } 1249 }
1250
1799 } 1251 }
1800 1252
1801 /// <summary> 1253 /// <summary>
@@ -1810,13 +1262,13 @@ namespace OpenSim.Region.Environment.Scenes
1810 } 1262 }
1811 1263
1812 m_perfMonMS = System.Environment.TickCount; 1264 m_perfMonMS = System.Environment.TickCount;
1813 1265
1814 m_rotation = rotation; 1266 m_rotation = rotation;
1815 NewForce newVelocity = new NewForce(); 1267 NewForce newVelocity = new NewForce();
1816 Vector3 direc = rotation * vec; 1268 Vector3 direc = rotation*vec;
1817 direc.Normalize(); 1269 direc.Normalize();
1818 1270
1819 direc *= 0.03f * 128f; 1271 direc *= 0.03f*128f;
1820 if (m_physicsActor.Flying) 1272 if (m_physicsActor.Flying)
1821 { 1273 {
1822 direc *= 4; 1274 direc *= 4;
@@ -1848,8 +1300,7 @@ namespace OpenSim.Region.Environment.Scenes
1848 SetMovementAnimation(Animations.AnimsLLUUID["JUMP"]); 1300 SetMovementAnimation(Animations.AnimsLLUUID["JUMP"]);
1849 } 1301 }
1850 catch (KeyNotFoundException) 1302 catch (KeyNotFoundException)
1851 { 1303 { }
1852 }
1853 } 1304 }
1854 } 1305 }
1855 } 1306 }
@@ -1895,18 +1346,23 @@ namespace OpenSim.Region.Environment.Scenes
1895 m_updateCount = 0; 1346 m_updateCount = 0;
1896 } 1347 }
1897 } 1348 }
1898 else if ((Util.GetDistanceTo(lastPhysPos, AbsolutePosition) > 0.02) || (Util.GetDistanceTo(m_lastVelocity, m_velocity) > 0.02)) 1349 else if ((Util.GetDistanceTo(lastPhysPos, AbsolutePosition) > 0.02) || (Util.GetDistanceTo(m_lastVelocity, m_velocity) > 0.02)) // physics-related movement
1899 // physics-related movement
1900 { 1350 {
1351
1352
1901 // Send Terse Update to all clients updates lastPhysPos and m_lastVelocity 1353 // Send Terse Update to all clients updates lastPhysPos and m_lastVelocity
1902 // doing the above assures us that we know what we sent the clients last 1354 // doing the above assures us that we know what we sent the clients last
1903 SendTerseUpdateToAllClients(); 1355 SendTerseUpdateToAllClients();
1904 m_updateCount = 0; 1356 m_updateCount = 0;
1357
1358
1359
1905 } 1360 }
1906 1361
1907 // followed suggestion from mic bowman. reversed the two lines below. 1362 // followed suggestion from mic bowman. reversed the two lines below.
1908 CheckForBorderCrossing(); 1363 CheckForBorderCrossing();
1909 CheckForSignificantMovement(); // sends update to the modules. 1364 CheckForSignificantMovement(); // sends update to the modules.
1365
1910 } 1366 }
1911 } 1367 }
1912 1368
@@ -1925,7 +1381,7 @@ namespace OpenSim.Region.Environment.Scenes
1925 LLVector3 pos = m_pos; 1381 LLVector3 pos = m_pos;
1926 LLVector3 vel = Velocity; 1382 LLVector3 vel = Velocity;
1927 LLQuaternion rot = new LLQuaternion(m_bodyRot.x, m_bodyRot.y, m_bodyRot.z, m_bodyRot.w); 1383 LLQuaternion rot = new LLQuaternion(m_bodyRot.x, m_bodyRot.y, m_bodyRot.z, m_bodyRot.w);
1928 remoteClient.SendAvatarTerseUpdate(m_regionHandle, (ushort) (m_scene.TimeDilation * ushort.MaxValue), LocalId, new LLVector3(pos.X, pos.Y, pos.Z), 1384 remoteClient.SendAvatarTerseUpdate(m_regionHandle, (ushort)(m_scene.TimeDilation * (float)ushort.MaxValue), LocalId, new LLVector3(pos.X, pos.Y, pos.Z),
1929 new LLVector3(vel.X, vel.Y, vel.Z), rot); 1385 new LLVector3(vel.X, vel.Y, vel.Z), rot);
1930 1386
1931 m_scene.AddAgentTime(System.Environment.TickCount - m_perfMonMS); 1387 m_scene.AddAgentTime(System.Environment.TickCount - m_perfMonMS);
@@ -1945,6 +1401,7 @@ namespace OpenSim.Region.Environment.Scenes
1945 lastPhysPos = AbsolutePosition; 1401 lastPhysPos = AbsolutePosition;
1946 1402
1947 m_scene.AddAgentTime(System.Environment.TickCount - m_perfMonMS); 1403 m_scene.AddAgentTime(System.Environment.TickCount - m_perfMonMS);
1404
1948 } 1405 }
1949 1406
1950 public void SendCoarseLocations() 1407 public void SendCoarseLocations()
@@ -2040,15 +1497,15 @@ namespace OpenSim.Region.Environment.Scenes
2040 /// </summary> 1497 /// </summary>
2041 public void SendAppearanceToAllOtherAgents() 1498 public void SendAppearanceToAllOtherAgents()
2042 { 1499 {
2043 m_perfMonMS = System.Environment.TickCount; 1500 m_perfMonMS=System.Environment.TickCount;
2044 1501
2045 m_scene.ForEachScenePresence(delegate(ScenePresence scenePresence) 1502 m_scene.ForEachScenePresence(delegate(ScenePresence scenePresence)
1503 {
1504 if (scenePresence.UUID != UUID)
2046 { 1505 {
2047 if (scenePresence.UUID != UUID) 1506 m_appearance.SendAppearanceToOtherAgent(scenePresence);
2048 { 1507 }
2049 m_appearance.SendAppearanceToOtherAgent(scenePresence); 1508 });
2050 }
2051 });
2052 m_scene.AddAgentTime(System.Environment.TickCount - m_perfMonMS); 1509 m_scene.AddAgentTime(System.Environment.TickCount - m_perfMonMS);
2053 } 1510 }
2054 1511
@@ -2077,7 +1534,7 @@ namespace OpenSim.Region.Environment.Scenes
2077 /// <param name="seqs"></param> 1534 /// <param name="seqs"></param>
2078 public void SendAnimPack(LLUUID[] animations, int[] seqs) 1535 public void SendAnimPack(LLUUID[] animations, int[] seqs)
2079 { 1536 {
2080 if (m_isChildAgent) 1537 if(m_isChildAgent)
2081 return; 1538 return;
2082 1539
2083 m_scene.Broadcast( 1540 m_scene.Broadcast(
@@ -2113,10 +1570,10 @@ namespace OpenSim.Region.Environment.Scenes
2113 } 1570 }
2114 1571
2115 // Minimum Draw distance is 64 meters, the Radius of the draw distance sphere is 32m 1572 // Minimum Draw distance is 64 meters, the Radius of the draw distance sphere is 32m
2116 if (Util.GetDistanceTo(AbsolutePosition, m_LastChildAgentUpdatePosition) > 32) 1573 if (Util.GetDistanceTo(AbsolutePosition,m_LastChildAgentUpdatePosition) > 32)
2117 { 1574 {
2118 ChildAgentDataUpdate cadu = new ChildAgentDataUpdate(); 1575 ChildAgentDataUpdate cadu = new ChildAgentDataUpdate();
2119 cadu.ActiveGroupID = LLUUID.Zero.UUID; 1576 cadu.ActiveGroupID=LLUUID.Zero.UUID;
2120 cadu.AgentID = UUID.UUID; 1577 cadu.AgentID = UUID.UUID;
2121 cadu.alwaysrun = m_setAlwaysRun; 1578 cadu.alwaysrun = m_setAlwaysRun;
2122 cadu.AVHeight = m_avHeight; 1579 cadu.AVHeight = m_avHeight;
@@ -2128,8 +1585,8 @@ namespace OpenSim.Region.Environment.Scenes
2128 cadu.Position = new sLLVector3(AbsolutePosition); 1585 cadu.Position = new sLLVector3(AbsolutePosition);
2129 cadu.regionHandle = m_scene.RegionInfo.RegionHandle; 1586 cadu.regionHandle = m_scene.RegionInfo.RegionHandle;
2130 cadu.throttles = ControllingClient.GetThrottlesPacked(1f); 1587 cadu.throttles = ControllingClient.GetThrottlesPacked(1f);
2131 cadu.Velocity = new sLLVector3(Velocity); 1588 cadu.Velocity = new sLLVector3(Velocity);
2132 m_scene.SendOutChildAgentUpdates(cadu, this); 1589 m_scene.SendOutChildAgentUpdates(cadu,this);
2133 m_LastChildAgentUpdatePosition.X = AbsolutePosition.X; 1590 m_LastChildAgentUpdatePosition.X = AbsolutePosition.X;
2134 m_LastChildAgentUpdatePosition.Y = AbsolutePosition.Y; 1591 m_LastChildAgentUpdatePosition.Y = AbsolutePosition.Y;
2135 m_LastChildAgentUpdatePosition.Z = AbsolutePosition.Z; 1592 m_LastChildAgentUpdatePosition.Z = AbsolutePosition.Z;
@@ -2149,9 +1606,9 @@ namespace OpenSim.Region.Environment.Scenes
2149 LLVector3 vel = Velocity; 1606 LLVector3 vel = Velocity;
2150 1607
2151 float timeStep = 0.1f; 1608 float timeStep = 0.1f;
2152 pos2.X = pos2.X + (vel.X * timeStep); 1609 pos2.X = pos2.X + (vel.X*timeStep);
2153 pos2.Y = pos2.Y + (vel.Y * timeStep); 1610 pos2.Y = pos2.Y + (vel.Y*timeStep);
2154 pos2.Z = pos2.Z + (vel.Z * timeStep); 1611 pos2.Z = pos2.Z + (vel.Z*timeStep);
2155 1612
2156 if ((pos2.X < 0) || (pos2.X > Constants.RegionSize)) 1613 if ((pos2.X < 0) || (pos2.X > Constants.RegionSize))
2157 { 1614 {
@@ -2206,10 +1663,10 @@ namespace OpenSim.Region.Environment.Scenes
2206 } 1663 }
2207 1664
2208 LLVector3 vel = m_velocity; 1665 LLVector3 vel = m_velocity;
2209 ulong neighbourHandle = Helpers.UIntsToLong((neighbourx * Constants.RegionSize), (neighboury * Constants.RegionSize)); 1666 ulong neighbourHandle = Helpers.UIntsToLong((uint)(neighbourx * Constants.RegionSize), (uint)(neighboury * Constants.RegionSize));
2210 SimpleRegionInfo neighbourRegion = m_scene.RequestNeighbouringRegionInfo(neighbourHandle); 1667 SimpleRegionInfo neighbourRegion = m_scene.RequestNeighbouringRegionInfo(neighbourHandle);
2211 if (neighbourRegion != null) 1668 if (neighbourRegion != null)
2212 { 1669 {
2213 // When the neighbour is informed of the border crossing, it will set up CAPS handlers for the avatar 1670 // When the neighbour is informed of the border crossing, it will set up CAPS handlers for the avatar
2214 // This means we need to remove the current caps handler here and possibly compensate later, 1671 // This means we need to remove the current caps handler here and possibly compensate later,
2215 // in case both scenes are being hosted on the same region server. Messy 1672 // in case both scenes are being hosted on the same region server. Messy
@@ -2219,17 +1676,17 @@ namespace OpenSim.Region.Environment.Scenes
2219 m_scene.InformNeighbourOfCrossing(neighbourHandle, m_controllingClient.AgentId, newpos, 1676 m_scene.InformNeighbourOfCrossing(neighbourHandle, m_controllingClient.AgentId, newpos,
2220 m_physicsActor.Flying); 1677 m_physicsActor.Flying);
2221 if (res) 1678 if (res)
2222 { 1679 {
2223 AgentCircuitData circuitdata = m_controllingClient.RequestClientInfo(); 1680 AgentCircuitData circuitdata = m_controllingClient.RequestClientInfo();
2224 1681
2225 // TODO Should construct this behind a method 1682 // TODO Should construct this behind a method
2226 string capsPath = 1683 string capsPath =
2227 "http://" + neighbourRegion.ExternalHostName + ":" + neighbourRegion.HttpPort 1684 "http://" + neighbourRegion.ExternalHostName + ":" + neighbourRegion.HttpPort
2228 + "/CAPS/" + circuitdata.CapsPath + "0000/"; 1685 + "/CAPS/" + circuitdata.CapsPath + "0000/";
2229 1686
2230 m_log.DebugFormat( 1687 m_log.DebugFormat(
2231 "[CAPS]: Sending new CAPS seed url {0} to client {1}", capsPath, m_uuid); 1688 "[CAPS]: Sending new CAPS seed url {0} to client {1}", capsPath, m_uuid);
2232 1689
2233 m_controllingClient.CrossRegion(neighbourHandle, newpos, vel, neighbourRegion.ExternalEndPoint, 1690 m_controllingClient.CrossRegion(neighbourHandle, newpos, vel, neighbourRegion.ExternalEndPoint,
2234 capsPath); 1691 capsPath);
2235 MakeChildAgent(); 1692 MakeChildAgent();
@@ -2246,40 +1703,128 @@ namespace OpenSim.Region.Environment.Scenes
2246 1703
2247 #endregion 1704 #endregion
2248 1705
2249 #region Nested type: Dir_ControlFlags 1706 /// <summary>
1707 /// This allows the Sim owner the abiility to kick users from their sim currently.
1708 /// It tells the client that the agent has permission to do so.
1709 /// </summary>
1710 public void GrantGodlikePowers(LLUUID agentID, LLUUID sessionID, LLUUID token, bool godStatus)
1711 {
1712 GrantGodlikePowersPacket respondPacket = new GrantGodlikePowersPacket();
1713 GrantGodlikePowersPacket.GrantDataBlock gdb = new GrantGodlikePowersPacket.GrantDataBlock();
1714 GrantGodlikePowersPacket.AgentDataBlock adb = new GrantGodlikePowersPacket.AgentDataBlock();
1715
1716 adb.AgentID = agentID;
1717 adb.SessionID = sessionID; // More security
1718
1719 if (godStatus)
1720 {
1721 gdb.GodLevel = (byte)250;
1722 m_godlevel = 250;
1723 }
1724 else
1725 {
1726 gdb.GodLevel = (byte)0;
1727 m_godlevel = 0;
1728 }
1729
1730 gdb.Token = token;
1731 //respondPacket.AgentData = (GrantGodlikePowersPacket.AgentDataBlock)ablock;
1732 respondPacket.GrantData = gdb;
1733 respondPacket.AgentData = adb;
1734 ControllingClient.OutPacket(respondPacket, ThrottleOutPacketType.Task);
1735 }
2250 1736
2251 /// <summary> 1737 /// <summary>
2252 /// Implemented Control Flags 1738 /// This updates important decision making data about a child agent
1739 /// The main purpose is to figure out what objects to send to a child agent that's in a neighboring region
2253 /// </summary> 1740 /// </summary>
2254 private enum Dir_ControlFlags 1741 public void ChildAgentDataUpdate(ChildAgentDataUpdate cAgentData, uint tRegionX, uint tRegionY, uint rRegionX, uint rRegionY)
2255 { 1742 {
2256 DIR_CONTROL_FLAG_FORWARD = AgentManager.ControlFlags.AGENT_CONTROL_AT_POS, 1743 //
2257 DIR_CONTROL_FLAG_BACK = AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG, 1744 int shiftx = ((int)rRegionX - (int)tRegionX) * (int)Constants.RegionSize;
2258 DIR_CONTROL_FLAG_LEFT = AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS, 1745 int shifty = ((int)rRegionY - (int)tRegionY) * (int)Constants.RegionSize;
2259 DIR_CONTROL_FLAG_RIGHT = AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG, 1746
2260 DIR_CONTROL_FLAG_UP = AgentManager.ControlFlags.AGENT_CONTROL_UP_POS, 1747 m_DrawDistance = cAgentData.drawdistance;
2261 DIR_CONTROL_FLAG_DOWN = AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG, 1748 m_pos = new LLVector3(cAgentData.Position.x + shiftx, cAgentData.Position.y + shifty, cAgentData.Position.z);
2262 DIR_CONTROL_FLAG_DOWN_NUDGE = AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG 1749
1750 // It's hard to say here.. We can't really tell where the camera position is unless it's in world cordinates from the sending region
1751 m_CameraCenter =
1752 new Vector3(cAgentData.cameraPosition.x, cAgentData.cameraPosition.y, cAgentData.cameraPosition.z);
1753
1754
1755 m_godlevel = cAgentData.godlevel;
1756 SetHeight(cAgentData.AVHeight);
1757
1758 ControllingClient.SetChildAgentThrottle(cAgentData.throttles);
1759
1760
1761
1762 // Sends out the objects in the user's draw distance if m_sendTasksToChild is true.
1763 if (m_scene.m_seeIntoRegionFromNeighbor)
1764 m_scene.SendAllSceneObjectsToClient(this);
1765 //cAgentData.AVHeight;
1766 //cAgentData.regionHandle;
1767 //m_velocity = cAgentData.Velocity;
2263 } 1768 }
2264 1769
2265 #endregion 1770 /// <summary>
1771 /// Handles part of the PID controller function for moving an avatar.
1772 /// </summary>
1773 public override void UpdateMovement()
1774 {
1775 m_newForce = false;
1776 lock (m_forcesList)
1777 {
1778 if (m_forcesList.Count > 0)
1779 {
1780 for (int i = 0; i < m_forcesList.Count; i++)
1781 {
1782 NewForce force = m_forcesList[i];
1783
1784 m_updateflag = true;
1785 try
1786 {
1787 movementvector.X = force.X;
1788 movementvector.Y = force.Y;
1789 movementvector.Z = force.Z;
1790 Velocity = movementvector;
1791 }
1792 catch (NullReferenceException)
1793 {
1794 // Under extreme load, this returns a NullReference Exception that we can ignore.
1795 // Ignoring this causes no movement to be sent to the physics engine...
1796 // which when the scene is moving at 1 frame every 10 seconds, it doesn't really matter!
1797 }
1798 m_newForce = true;
1799 }
1800 for (int i = 0; i < m_forcesList.Count; i++)
1801 {
1802 m_forcesList.RemoveAt(0);
1803 }
1804 }
1805 }
1806 }
2266 1807
2267 #region Nested type: NewForce 1808 static ScenePresence()
1809 {
1810 LLObject.TextureEntry textu = AvatarAppearance.GetDefaultTextureEntry();
1811 DefaultTexture = textu.ToBytes();
1812 }
2268 1813
2269 [Serializable] 1814 [Serializable]
2270 public class NewForce 1815 public class NewForce
2271 { 1816 {
2272 public float X; 1817 public float X;
2273 public float Y; 1818 public float Y;
2274 public float Z; 1819 public float Z;
2275 }
2276 1820
2277 #endregion 1821 public NewForce()
2278 1822 {
2279 #region Nested type: ScenePartUpdate 1823 }
1824 }
2280 1825
2281 [Serializable] 1826 [Serializable]
2282 public class ScenePartUpdate : ISerializable 1827 public class ScenePartUpdate : ISerializable
2283 { 1828 {
2284 public LLUUID FullID; 1829 public LLUUID FullID;
2285 public uint LastFullUpdateTime; 1830 public uint LastFullUpdateTime;
@@ -2301,17 +1846,15 @@ namespace OpenSim.Region.Environment.Scenes
2301 throw new ArgumentNullException("info"); 1846 throw new ArgumentNullException("info");
2302 } 1847 }
2303 1848
2304 FullID = new LLUUID((Guid) info.GetValue("FullID", typeof (Guid))); 1849 FullID = new LLUUID((Guid)info.GetValue("FullID", typeof(Guid)));
2305 LastFullUpdateTime = (uint) info.GetValue("LastFullUpdateTime", typeof (uint)); 1850 LastFullUpdateTime = (uint)info.GetValue("LastFullUpdateTime", typeof(uint));
2306 LastTerseUpdateTime = (uint) info.GetValue("LastTerseUpdateTime", typeof (uint)); 1851 LastTerseUpdateTime = (uint)info.GetValue("LastTerseUpdateTime", typeof(uint));
2307 1852
2308 //System.Console.WriteLine("ScenePartUpdate Deserialize END"); 1853 //System.Console.WriteLine("ScenePartUpdate Deserialize END");
2309 } 1854 }
2310 1855
2311 #region ISerializable Members
2312
2313 [SecurityPermission(SecurityAction.LinkDemand, 1856 [SecurityPermission(SecurityAction.LinkDemand,
2314 Flags = SecurityPermissionFlag.SerializationFormatter)] 1857 Flags = SecurityPermissionFlag.SerializationFormatter)]
2315 public virtual void GetObjectData( 1858 public virtual void GetObjectData(
2316 SerializationInfo info, StreamingContext context) 1859 SerializationInfo info, StreamingContext context)
2317 { 1860 {
@@ -2324,10 +1867,473 @@ namespace OpenSim.Region.Environment.Scenes
2324 info.AddValue("LastFullUpdateTime", LastFullUpdateTime); 1867 info.AddValue("LastFullUpdateTime", LastFullUpdateTime);
2325 info.AddValue("LastTerseUpdateTime", LastTerseUpdateTime); 1868 info.AddValue("LastTerseUpdateTime", LastTerseUpdateTime);
2326 } 1869 }
1870 }
2327 1871
2328 #endregion 1872 public override void SetText(string text, Vector3 color, double alpha)
1873 {
1874 throw new Exception("Can't set Text on avatar.");
2329 } 1875 }
2330 1876
2331 #endregion 1877 /// <summary>
1878 /// Adds a physical representation of the avatar to the Physics plugin
1879 /// </summary>
1880 public void AddToPhysicalScene()
1881 {
1882 PhysicsScene scene = m_scene.PhysicsScene;
1883
1884 PhysicsVector pVec =
1885 new PhysicsVector(AbsolutePosition.X, AbsolutePosition.Y,
1886 AbsolutePosition.Z);
1887 if (m_avHeight == 127.0f)
1888 {
1889 m_physicsActor = scene.AddAvatar(Firstname + "." + Lastname, pVec, new PhysicsVector(0, 0, 1.56f));
1890 }
1891 else
1892 {
1893 m_physicsActor = scene.AddAvatar(Firstname + "." + Lastname, pVec, new PhysicsVector(0, 0, m_avHeight));
1894 }
1895 //m_physicsActor.OnRequestTerseUpdate += SendTerseUpdateToAllClients;
1896 m_physicsActor.OnCollisionUpdate += PhysicsCollisionUpdate;
1897 m_physicsActor.LocalID = LocalId;
1898 }
1899
1900 // Event called by the physics plugin to tell the avatar about a collision.
1901 private void PhysicsCollisionUpdate(EventArgs e)
1902 {
1903 bool isUserMoving = Velocity.X > 0 || Velocity.Y > 0;
1904 UpdateMovementAnimations(isUserMoving);
1905 }
1906
1907 internal void Close()
1908 {
1909 lock (m_attachments)
1910 {
1911 foreach (SceneObjectGroup grp in m_attachments)
1912 {
1913 // ControllingClient may be null at this point!
1914 m_scene.m_innerScene.DetachSingleAttachmentToInv(grp.GetFromAssetID(), ControllingClient);
1915 }
1916 m_attachments.Clear();
1917 }
1918 lock (m_knownPrimUUID)
1919 {
1920 m_knownPrimUUID.Clear();
1921 }
1922 lock (m_knownChildRegions)
1923 {
1924 m_knownChildRegions.Clear();
1925 }
1926 lock (m_updateTimes)
1927 {
1928 m_updateTimes.Clear();
1929 }
1930 lock (m_partsUpdateQueue)
1931 {
1932 m_partsUpdateQueue.Clear();
1933 }
1934
1935 RemoveFromPhysicalScene();
1936 GC.Collect();
1937 }
1938
1939 public ScenePresence()
1940 {
1941/* JB
1942 if (Animations == null)
1943 {
1944 Animations = new AvatarAnimations();
1945 Animations.LoadAnims();
1946 }
1947*/
1948 if (DefaultTexture == null)
1949 {
1950 LLObject.TextureEntry textu = AvatarAppearance.GetDefaultTextureEntry();
1951 DefaultTexture = textu.ToBytes();
1952 }
1953 }
1954 public void AddAttachment(SceneObjectGroup gobj)
1955 {
1956 lock (m_attachments)
1957 {
1958 m_attachments.Add(gobj);
1959 }
1960 }
1961 public void RemoveAttachment(SceneObjectGroup gobj)
1962 {
1963 lock (m_attachments)
1964 {
1965 if (m_attachments.Contains(gobj))
1966 {
1967 m_attachments.Remove(gobj);
1968 }
1969 }
1970 }
1971 public void CrossAttachmentsIntoNewRegion(ulong regionHandle)
1972 {
1973 lock (m_attachments)
1974 {
1975 foreach (SceneObjectGroup gobj in m_attachments)
1976 {
1977 // If the prim group is null then something must have happened to it!
1978 if (gobj != null)
1979 {
1980 // Set the parent localID to 0 so it transfers over properly.
1981 gobj.RootPart.SetParentLocalId(0);
1982 gobj.RootPart.m_IsAttachment = false;
1983 gobj.AbsolutePosition = gobj.RootPart.m_attachedPos;
1984 gobj.RootPart.LastOwnerID = gobj.GetFromAssetID();
1985 m_scene.CrossPrimGroupIntoNewRegion(regionHandle, gobj);
1986 }
1987 }
1988 m_attachments.Clear();
1989 }
1990
1991 }
1992 public void initializeScenePresence(IClientAPI client, RegionInfo region, Scene scene)
1993 {
1994 m_controllingClient = client;
1995 m_regionInfo = region;
1996 m_scene = scene;
1997 RegisterToEvents();
1998
1999 /*
2000 AbsolutePosition = client.StartPos;
2001
2002 Animations = new AvatarAnimations();
2003 Animations.LoadAnims();
2004
2005 m_animations = new List<LLUUID>();
2006 m_animations.Add(Animations.AnimsLLUUID["STAND"]);
2007 m_animationSeqs.Add(m_controllingClient.NextAnimationSequenceNumber);
2008
2009 SetDirectionVectors();
2010 */
2011 }
2012
2013 protected ScenePresence(SerializationInfo info, StreamingContext context)
2014 : base (info, context)
2015 {
2016 //System.Console.WriteLine("ScenePresence Deserialize BGN");
2017
2018 if (info == null)
2019 {
2020 throw new ArgumentNullException("info");
2021 }
2022/* JB
2023 if (Animations == null)
2024 {
2025 Animations = new AvatarAnimations();
2026 Animations.LoadAnims();
2027 }
2028*/
2029 if (DefaultTexture == null)
2030 {
2031 LLObject.TextureEntry textu = AvatarAppearance.GetDefaultTextureEntry();
2032 DefaultTexture = textu.ToBytes();
2033 }
2034
2035 List<Guid> animations_work = (List<Guid>)info.GetValue("m_animations", typeof(List<Guid>));
2036
2037 foreach (Guid guid in animations_work)
2038 {
2039 m_animations.Add(new LLUUID(guid));
2040 }
2041
2042 m_animationSeqs = (List<int>)info.GetValue("m_animationSeqs", typeof(List<int>));
2043 m_updateflag = (bool)info.GetValue("m_updateflag", typeof(bool));
2044 m_movementflag = (byte)info.GetValue("m_movementflag", typeof(byte));
2045 m_forcesList = (List<NewForce>)info.GetValue("m_forcesList", typeof(List<NewForce>));
2046 m_updateCount = (short)info.GetValue("m_updateCount", typeof(short));
2047 m_requestedSitTargetID = (uint)info.GetValue("m_requestedSitTargetID", typeof(uint));
2048
2049 m_requestedSitOffset
2050 = new LLVector3(
2051 (float)info.GetValue("m_requestedSitOffset.X", typeof(float)),
2052 (float)info.GetValue("m_requestedSitOffset.Y", typeof(float)),
2053 (float)info.GetValue("m_requestedSitOffset.Z", typeof(float)));
2054
2055 m_sitAvatarHeight = (float)info.GetValue("m_sitAvatarHeight", typeof(float));
2056 m_godlevel = (float)info.GetValue("m_godlevel", typeof(float));
2057 m_setAlwaysRun = (bool)info.GetValue("m_setAlwaysRun", typeof(bool));
2058
2059 m_bodyRot
2060 = new Quaternion(
2061 (float)info.GetValue("m_bodyRot.w", typeof(float)),
2062 (float)info.GetValue("m_bodyRot.x", typeof(float)),
2063 (float)info.GetValue("m_bodyRot.y", typeof(float)),
2064 (float)info.GetValue("m_bodyRot.z", typeof(float)));
2065
2066 IsRestrictedToRegion = (bool)info.GetValue("IsRestrictedToRegion", typeof(bool));
2067 m_newForce = (bool)info.GetValue("m_newForce", typeof(bool));
2068 //m_newAvatar = (bool)info.GetValue("m_newAvatar", typeof(bool));
2069 m_newCoarseLocations = (bool)info.GetValue("m_newCoarseLocations", typeof(bool));
2070 m_gotAllObjectsInScene = (bool)info.GetValue("m_gotAllObjectsInScene", typeof(bool));
2071 m_avHeight = (float)info.GetValue("m_avHeight", typeof(float));
2072 crossingFromRegion = (ulong)info.GetValue("crossingFromRegion", typeof(ulong));
2073
2074 List<float[]> Dir_Vectors_work = (List<float[]>)info.GetValue("Dir_Vectors", typeof(List<float[]>));
2075 List<Vector3> Dir_Vectors_work2 = new List<Vector3>();
2076
2077 foreach (float[] f3 in Dir_Vectors_work)
2078 {
2079 Dir_Vectors_work2.Add(new Vector3(f3[0], f3[1], f3[2]));
2080 }
2081
2082 Dir_Vectors = Dir_Vectors_work2.ToArray();
2083
2084 lastPhysPos
2085 = new LLVector3(
2086 (float)info.GetValue("lastPhysPos.X", typeof(float)),
2087 (float)info.GetValue("lastPhysPos.Y", typeof(float)),
2088 (float)info.GetValue("lastPhysPos.Z", typeof(float)));
2089
2090 m_CameraCenter
2091 = new Vector3(
2092 (float)info.GetValue("m_CameraCenter.X", typeof(float)),
2093 (float)info.GetValue("m_CameraCenter.Y", typeof(float)),
2094 (float)info.GetValue("m_CameraCenter.Z", typeof(float)));
2095
2096 m_CameraAtAxis
2097 = new Vector3(
2098 (float)info.GetValue("m_CameraAtAxis.X", typeof(float)),
2099 (float)info.GetValue("m_CameraAtAxis.Y", typeof(float)),
2100 (float)info.GetValue("m_CameraAtAxis.Z", typeof(float)));
2101
2102 m_CameraLeftAxis
2103 = new Vector3(
2104 (float)info.GetValue("m_CameraLeftAxis.X", typeof(float)),
2105 (float)info.GetValue("m_CameraLeftAxis.Y", typeof(float)),
2106 (float)info.GetValue("m_CameraLeftAxis.Z", typeof(float)));
2107
2108 m_CameraUpAxis
2109 = new Vector3(
2110 (float)info.GetValue("m_CameraUpAxis.X", typeof(float)),
2111 (float)info.GetValue("m_CameraUpAxis.Y", typeof(float)),
2112 (float)info.GetValue("m_CameraUpAxis.Z", typeof(float)));
2113
2114 m_DrawDistance = (float)info.GetValue("m_DrawDistance", typeof(float));
2115 m_appearance = (AvatarAppearance)info.GetValue("m_appearance", typeof(AvatarAppearance));
2116 m_knownChildRegions = (List<ulong>)info.GetValue("m_knownChildRegions", typeof(List<ulong>));
2117
2118 posLastSignificantMove
2119 = new LLVector3(
2120 (float)info.GetValue("posLastSignificantMove.X", typeof(float)),
2121 (float)info.GetValue("posLastSignificantMove.Y", typeof(float)),
2122 (float)info.GetValue("posLastSignificantMove.Z", typeof(float)));
2123
2124 // m_partsUpdateQueue = (UpdateQueue)info.GetValue("m_partsUpdateQueue", typeof(UpdateQueue));
2125
2126 /*
2127 Dictionary<Guid, ScenePartUpdate> updateTimes_work
2128 = (Dictionary<Guid, ScenePartUpdate>)info.GetValue("m_updateTimes", typeof(Dictionary<Guid, ScenePartUpdate>));
2129
2130 foreach (Guid id in updateTimes_work.Keys)
2131 {
2132 m_updateTimes.Add(new LLUUID(id), updateTimes_work[id]);
2133 }
2134 */
2135 m_regionHandle = (ulong)info.GetValue("m_regionHandle", typeof(ulong));
2136 m_firstname = (string)info.GetValue("m_firstname", typeof(string));
2137 m_lastname = (string)info.GetValue("m_lastname", typeof(string));
2138 m_allowMovement = (bool)info.GetValue("m_allowMovement", typeof(bool));
2139 m_parentPosition = new LLVector3((float)info.GetValue("m_parentPosition.X", typeof(float)),
2140 (float)info.GetValue("m_parentPosition.Y", typeof(float)),
2141 (float)info.GetValue("m_parentPosition.Z", typeof(float)));
2142
2143 m_isChildAgent = (bool)info.GetValue("m_isChildAgent", typeof(bool));
2144 m_parentID = (uint)info.GetValue("m_parentID", typeof(uint));
2145
2146// for OpenSim_v0.5
2147 currentParcelUUID = new LLUUID((Guid)info.GetValue("currentParcelUUID", typeof(Guid)));
2148
2149 lastKnownAllowedPosition
2150 = new Vector3(
2151 (float)info.GetValue("lastKnownAllowedPosition.X", typeof(float)),
2152 (float)info.GetValue("lastKnownAllowedPosition.Y", typeof(float)),
2153 (float)info.GetValue("lastKnownAllowedPosition.Z", typeof(float)));
2154
2155 sentMessageAboutRestrictedParcelFlyingDown = (bool)info.GetValue("sentMessageAboutRestrictedParcelFlyingDown", typeof(bool));
2156
2157 m_LastChildAgentUpdatePosition
2158 = new LLVector3(
2159 (float)info.GetValue("m_LastChildAgentUpdatePosition.X", typeof(float)),
2160 (float)info.GetValue("m_LastChildAgentUpdatePosition.Y", typeof(float)),
2161 (float)info.GetValue("m_LastChildAgentUpdatePosition.Z", typeof(float)));
2162
2163 m_perfMonMS = (int)info.GetValue("m_perfMonMS", typeof(int));
2164 m_AgentControlFlags = (uint)info.GetValue("m_AgentControlFlags", typeof(uint));
2165
2166 m_headrotation
2167 = new LLQuaternion(
2168 (float)info.GetValue("m_headrotation.W", typeof(float)),
2169 (float)info.GetValue("m_headrotation.X", typeof(float)),
2170 (float)info.GetValue("m_headrotation.Y", typeof(float)),
2171 (float)info.GetValue("m_headrotation.Z", typeof(float)));
2172
2173 m_state = (byte)info.GetValue("m_state", typeof(byte));
2174
2175 List<Guid> knownPrimUUID_work = (List<Guid>)info.GetValue("m_knownPrimUUID", typeof(List<Guid>));
2176
2177 foreach (Guid id in knownPrimUUID_work)
2178 {
2179 m_knownPrimUUID.Add(new LLUUID(id));
2180 }
2181
2182 //System.Console.WriteLine("ScenePresence Deserialize END");
2183 }
2184
2185 [SecurityPermission(SecurityAction.LinkDemand,
2186 Flags = SecurityPermissionFlag.SerializationFormatter)]
2187 public override void GetObjectData(
2188 SerializationInfo info, StreamingContext context)
2189 {
2190 if (info == null)
2191 {
2192 throw new ArgumentNullException("info");
2193 }
2194
2195 base.GetObjectData(info, context);
2196
2197 List<Guid> animations_work = new List<Guid>();
2198
2199 foreach (LLUUID uuid in m_animations)
2200 {
2201 animations_work.Add(uuid.UUID);
2202 }
2203
2204 info.AddValue("m_animations", animations_work);
2205
2206 info.AddValue("m_animationSeqs", m_animationSeqs);
2207 info.AddValue("m_updateflag", m_updateflag);
2208 info.AddValue("m_movementflag", m_movementflag);
2209 info.AddValue("m_forcesList", m_forcesList);
2210 info.AddValue("m_updateCount", m_updateCount);
2211 info.AddValue("m_requestedSitTargetID", m_requestedSitTargetID);
2212
2213 // LLVector3
2214 info.AddValue("m_requestedSitOffset.X", m_requestedSitOffset.X);
2215 info.AddValue("m_requestedSitOffset.Y", m_requestedSitOffset.Y);
2216 info.AddValue("m_requestedSitOffset.Z", m_requestedSitOffset.Z);
2217
2218 info.AddValue("m_sitAvatarHeight", m_sitAvatarHeight);
2219 info.AddValue("m_godlevel", m_godlevel);
2220 info.AddValue("m_setAlwaysRun", m_setAlwaysRun);
2221
2222 // Quaternion
2223 info.AddValue("m_bodyRot.w", m_bodyRot.w);
2224 info.AddValue("m_bodyRot.x", m_bodyRot.x);
2225 info.AddValue("m_bodyRot.y", m_bodyRot.y);
2226 info.AddValue("m_bodyRot.z", m_bodyRot.z);
2227
2228 info.AddValue("IsRestrictedToRegion", IsRestrictedToRegion);
2229 info.AddValue("m_newForce", m_newForce);
2230 //info.AddValue("m_newAvatar", m_newAvatar);
2231 info.AddValue("m_newCoarseLocations", m_newCoarseLocations);
2232 info.AddValue("m_gotAllObjectsInScene", m_gotAllObjectsInScene);
2233 info.AddValue("m_avHeight", m_avHeight);
2234
2235 // info.AddValue("m_regionInfo", m_regionInfo);
2236
2237 info.AddValue("crossingFromRegion", crossingFromRegion);
2238
2239 List<float[]> Dir_Vectors_work = new List<float[]>();
2240
2241 foreach (Vector3 v3 in Dir_Vectors)
2242 {
2243 Dir_Vectors_work.Add(new float[] { v3.x, v3.y, v3.z });
2244 }
2245
2246 info.AddValue("Dir_Vectors", Dir_Vectors_work);
2247
2248 // LLVector3
2249 info.AddValue("lastPhysPos.X", lastPhysPos.X);
2250 info.AddValue("lastPhysPos.Y", lastPhysPos.Y);
2251 info.AddValue("lastPhysPos.Z", lastPhysPos.Z);
2252
2253 // Vector3
2254 info.AddValue("m_CameraCenter.X", m_CameraCenter.x);
2255 info.AddValue("m_CameraCenter.Y", m_CameraCenter.y);
2256 info.AddValue("m_CameraCenter.Z", m_CameraCenter.z);
2257
2258 // Vector3
2259 info.AddValue("m_CameraAtAxis.X", m_CameraAtAxis.x);
2260 info.AddValue("m_CameraAtAxis.Y", m_CameraAtAxis.y);
2261 info.AddValue("m_CameraAtAxis.Z", m_CameraAtAxis.z);
2262
2263 // Vector3
2264 info.AddValue("m_CameraLeftAxis.X", m_CameraLeftAxis.x);
2265 info.AddValue("m_CameraLeftAxis.Y", m_CameraLeftAxis.y);
2266 info.AddValue("m_CameraLeftAxis.Z", m_CameraLeftAxis.z);
2267
2268 // Vector3
2269 info.AddValue("m_CameraUpAxis.X", m_CameraUpAxis.x);
2270 info.AddValue("m_CameraUpAxis.Y", m_CameraUpAxis.y);
2271 info.AddValue("m_CameraUpAxis.Z", m_CameraUpAxis.z);
2272
2273 info.AddValue("m_DrawDistance", m_DrawDistance);
2274 info.AddValue("m_appearance", m_appearance);
2275 info.AddValue("m_knownChildRegions", m_knownChildRegions);
2276
2277 // LLVector3
2278 info.AddValue("posLastSignificantMove.X", posLastSignificantMove.X);
2279 info.AddValue("posLastSignificantMove.Y", posLastSignificantMove.Y);
2280 info.AddValue("posLastSignificantMove.Z", posLastSignificantMove.Z);
2281
2282 //info.AddValue("m_partsUpdateQueue", m_partsUpdateQueue);
2283
2284 /*
2285 Dictionary<Guid, ScenePartUpdate> updateTimes_work = new Dictionary<Guid, ScenePartUpdate>();
2286
2287 foreach ( LLUUID id in m_updateTimes.Keys)
2288 {
2289 updateTimes_work.Add(id.UUID, m_updateTimes[id]);
2290 }
2291
2292 info.AddValue("m_updateTimes", updateTimes_work);
2293 */
2294
2295 info.AddValue("m_regionHandle", m_regionHandle);
2296 info.AddValue("m_firstname", m_firstname);
2297 info.AddValue("m_lastname", m_lastname);
2298 info.AddValue("m_allowMovement", m_allowMovement);
2299 //info.AddValue("m_physicsActor", m_physicsActor);
2300 info.AddValue("m_parentPosition.X", m_parentPosition.X);
2301 info.AddValue("m_parentPosition.Y", m_parentPosition.Y);
2302 info.AddValue("m_parentPosition.Z", m_parentPosition.Z);
2303 info.AddValue("m_isChildAgent", m_isChildAgent);
2304 info.AddValue("m_parentID", m_parentID);
2305
2306// for OpenSim_v0.5
2307 info.AddValue("currentParcelUUID", currentParcelUUID.UUID);
2308
2309 info.AddValue("lastKnownAllowedPosition.X", lastKnownAllowedPosition.x);
2310 info.AddValue("lastKnownAllowedPosition.Y", lastKnownAllowedPosition.y);
2311 info.AddValue("lastKnownAllowedPosition.Z", lastKnownAllowedPosition.z);
2312
2313 info.AddValue("sentMessageAboutRestrictedParcelFlyingDown", sentMessageAboutRestrictedParcelFlyingDown);
2314
2315 info.AddValue("m_LastChildAgentUpdatePosition.X", m_LastChildAgentUpdatePosition.X);
2316 info.AddValue("m_LastChildAgentUpdatePosition.Y", m_LastChildAgentUpdatePosition.Y);
2317 info.AddValue("m_LastChildAgentUpdatePosition.Z", m_LastChildAgentUpdatePosition.Z);
2318
2319 info.AddValue("m_perfMonMS", m_perfMonMS);
2320 info.AddValue("m_AgentControlFlags", m_AgentControlFlags);
2321
2322 info.AddValue("m_headrotation.W", m_headrotation.W);
2323 info.AddValue("m_headrotation.X", m_headrotation.X);
2324 info.AddValue("m_headrotation.Y", m_headrotation.Y);
2325 info.AddValue("m_headrotation.Z", m_headrotation.Z);
2326
2327 info.AddValue("m_state", m_state);
2328
2329 List<Guid> knownPrimUUID_work = new List<Guid>();
2330
2331 foreach (LLUUID id in m_knownPrimUUID)
2332 {
2333 knownPrimUUID_work.Add(id.UUID);
2334 }
2335
2336 info.AddValue("m_knownPrimUUID", knownPrimUUID_work);
2337 }
2332 } 2338 }
2333} \ No newline at end of file 2339}
diff --git a/OpenSim/Region/Environment/Scenes/SceneXmlLoader.cs b/OpenSim/Region/Environment/Scenes/SceneXmlLoader.cs
index 386d87b..8390f64 100644
--- a/OpenSim/Region/Environment/Scenes/SceneXmlLoader.cs
+++ b/OpenSim/Region/Environment/Scenes/SceneXmlLoader.cs
@@ -39,8 +39,8 @@ namespace OpenSim.Region.Environment.Scenes
39 public class SceneXmlLoader // can move to a module? 39 public class SceneXmlLoader // can move to a module?
40 { 40 {
41 protected InnerScene m_innerScene; 41 protected InnerScene m_innerScene;
42 protected Scene m_parentScene;
43 protected RegionInfo m_regInfo; 42 protected RegionInfo m_regInfo;
43 protected Scene m_parentScene;
44 44
45 public SceneXmlLoader(Scene parentScene, InnerScene innerScene, RegionInfo regionInfo) 45 public SceneXmlLoader(Scene parentScene, InnerScene innerScene, RegionInfo regionInfo)
46 { 46 {
@@ -136,13 +136,14 @@ namespace OpenSim.Region.Environment.Scenes
136 returnstring += grp.ToXmlString2(); 136 returnstring += grp.ToXmlString2();
137 returnstring += "</scene>\n"; 137 returnstring += "</scene>\n";
138 return returnstring; 138 return returnstring;
139
139 } 140 }
140 141
141 public void LoadGroupFromXml2String(string xmlString) 142 public void LoadGroupFromXml2String(string xmlString)
142 { 143 {
143 XmlDocument doc = new XmlDocument(); 144 XmlDocument doc = new XmlDocument();
144 XmlNode rootNode; 145 XmlNode rootNode;
145 146
146 XmlTextReader reader = new XmlTextReader(new StringReader(xmlString)); 147 XmlTextReader reader = new XmlTextReader(new StringReader(xmlString));
147 reader.WhitespaceHandling = WhitespaceHandling.None; 148 reader.WhitespaceHandling = WhitespaceHandling.None;
148 doc.Load(reader); 149 doc.Load(reader);
@@ -152,6 +153,7 @@ namespace OpenSim.Region.Environment.Scenes
152 { 153 {
153 CreatePrimFromXml(aPrimNode.OuterXml); 154 CreatePrimFromXml(aPrimNode.OuterXml);
154 } 155 }
156
155 } 157 }
156 158
157 public void LoadPrimsFromXml2(string fileName) 159 public void LoadPrimsFromXml2(string fileName)
@@ -204,7 +206,7 @@ namespace OpenSim.Region.Environment.Scenes
204 rootPart.PhysActor.LocalID = rootPart.LocalId; 206 rootPart.PhysActor.LocalID = rootPart.LocalId;
205 rootPart.DoPhysicsPropertyUpdate(UsePhysics, true); 207 rootPart.DoPhysicsPropertyUpdate(UsePhysics, true);
206 } 208 }
207 rootPart.Velocity = receivedVelocity; 209 rootPart.Velocity = receivedVelocity;
208 } 210 }
209 211
210 obj.ScheduleGroupForFullUpdate(); 212 obj.ScheduleGroupForFullUpdate();
@@ -232,4 +234,4 @@ namespace OpenSim.Region.Environment.Scenes
232 file.Close(); 234 file.Close();
233 } 235 }
234 } 236 }
235} \ No newline at end of file 237}
diff --git a/OpenSim/Region/Environment/Scenes/Scripting/IScriptHost.cs b/OpenSim/Region/Environment/Scenes/Scripting/IScriptHost.cs
index ccb2aa7..dbe2516 100644
--- a/OpenSim/Region/Environment/Scenes/Scripting/IScriptHost.cs
+++ b/OpenSim/Region/Environment/Scenes/Scripting/IScriptHost.cs
@@ -44,4 +44,4 @@ namespace OpenSim.Region.Environment.Scenes.Scripting
44 string TouchName { get; set; } 44 string TouchName { get; set; }
45 void SetText(string text, Vector3 color, double alpha); 45 void SetText(string text, Vector3 color, double alpha);
46 } 46 }
47} \ No newline at end of file 47}
diff --git a/OpenSim/Region/Environment/Scenes/Scripting/NullScriptHost.cs b/OpenSim/Region/Environment/Scenes/Scripting/NullScriptHost.cs
index a37ce53..4b1b56a 100644
--- a/OpenSim/Region/Environment/Scenes/Scripting/NullScriptHost.cs
+++ b/OpenSim/Region/Environment/Scenes/Scripting/NullScriptHost.cs
@@ -33,9 +33,7 @@ namespace OpenSim.Region.Environment.Scenes.Scripting
33{ 33{
34 public class NullScriptHost : IScriptHost 34 public class NullScriptHost : IScriptHost
35 { 35 {
36 private readonly LLVector3 m_pos = new LLVector3(128, 128, 30); 36 private LLVector3 m_pos = new LLVector3(128, 128, 30);
37
38 #region IScriptHost Members
39 37
40 public string Name 38 public string Name
41 { 39 {
@@ -85,7 +83,5 @@ namespace OpenSim.Region.Environment.Scenes.Scripting
85 { 83 {
86 Console.WriteLine("Tried to SetText [{0}] on NullScriptHost", text); 84 Console.WriteLine("Tried to SetText [{0}] on NullScriptHost", text);
87 } 85 }
88
89 #endregion
90 } 86 }
91} \ No newline at end of file 87}
diff --git a/OpenSim/Region/Environment/Scenes/Scripting/ScriptEngineInterface.cs b/OpenSim/Region/Environment/Scenes/Scripting/ScriptEngineInterface.cs
index cb0e1e8..b1ee519 100644
--- a/OpenSim/Region/Environment/Scenes/Scripting/ScriptEngineInterface.cs
+++ b/OpenSim/Region/Environment/Scenes/Scripting/ScriptEngineInterface.cs
@@ -35,4 +35,4 @@ namespace OpenSim.Region.Environment.Scenes.Scripting
35 void Shutdown(); 35 void Shutdown();
36// void StartScript(string ScriptID, IScriptHost ObjectID); 36// void StartScript(string ScriptID, IScriptHost ObjectID);
37 } 37 }
38} \ No newline at end of file 38}
diff --git a/OpenSim/Region/Environment/Scenes/Scripting/ScriptEngineLoader.cs b/OpenSim/Region/Environment/Scenes/Scripting/ScriptEngineLoader.cs
index 0048e6b..6216e2c 100644
--- a/OpenSim/Region/Environment/Scenes/Scripting/ScriptEngineLoader.cs
+++ b/OpenSim/Region/Environment/Scenes/Scripting/ScriptEngineLoader.cs
@@ -51,7 +51,7 @@ namespace OpenSim.Region.Environment.Scenes.Scripting
51 { 51 {
52 m_log.Error("[ScriptEngine]: " + 52 m_log.Error("[ScriptEngine]: " +
53 "Error loading assembly \"" + EngineName + "\": " + e.Message + ", " + 53 "Error loading assembly \"" + EngineName + "\": " + e.Message + ", " +
54 e.StackTrace); 54 e.StackTrace.ToString());
55 } 55 }
56 return ret; 56 return ret;
57 } 57 }
@@ -116,4 +116,4 @@ namespace OpenSim.Region.Environment.Scenes.Scripting
116 return ret; 116 return ret;
117 } 117 }
118 } 118 }
119} \ No newline at end of file 119}
diff --git a/OpenSim/Region/Environment/Scenes/SimStatsReporter.cs b/OpenSim/Region/Environment/Scenes/SimStatsReporter.cs
index 1f02f23..a53bfcd 100644
--- a/OpenSim/Region/Environment/Scenes/SimStatsReporter.cs
+++ b/OpenSim/Region/Environment/Scenes/SimStatsReporter.cs
@@ -34,68 +34,105 @@ namespace OpenSim.Region.Environment.Scenes
34{ 34{
35 public class SimStatsReporter 35 public class SimStatsReporter
36 { 36 {
37 #region Delegates
38
39 public delegate void SendStatResult(SimStatsPacket pack); 37 public delegate void SendStatResult(SimStatsPacket pack);
40 38
41 #endregion 39 public event SendStatResult OnSendStatsResult;
42 40
43 private readonly Timer m_report = new Timer(); 41 private SendStatResult handlerSendStatResult = null;
44 private readonly SimStatsPacket.RegionBlock rb = new SimStatsPacket.RegionBlock();
45 private readonly RegionInfo ReportingRegion;
46 private readonly SimStatsPacket.StatBlock[] sb = new SimStatsPacket.StatBlock[21];
47 private readonly SimStatsPacket statpack = (SimStatsPacket) PacketPool.Instance.GetPacket(PacketType.SimStats);
48
49 private SendStatResult handlerSendStatResult;
50 private int m_activePrim;
51 private int m_activeScripts;
52 private int m_agentMS;
53
54 private int m_agentUpdates;
55 private int m_childAgents;
56 private int m_fps;
57
58 private int m_frameMS;
59 private int m_imageMS;
60 private int m_inPacketsPerSecond;
61 private int m_netMS;
62 private int m_numPrim;
63 private int m_otherMS;
64 private int m_outPacketsPerSecond;
65 private int m_pendingDownloads;
66 private int m_pendingUploads;
67 private float m_pfps;
68 private int m_physicsMS;
69 private int m_rootAgents;
70 private int m_scriptLinesPerSecond;
71 private float m_timeDilation;
72 private int m_unAckedBytes;
73 42
74 private int objectCapacity = 45000; 43 private enum Stats : uint
75 private float statsUpdateFactor; 44 {
45 TimeDilation = 0,
46 SimFPS = 1,
47 PhysicsFPS = 2,
48 AgentUpdates = 3,
49 FrameMS = 4,
50 NetMS = 5,
51 OtherMS = 6,
52 PhysicsMS = 7,
53 AgentMS = 8,
54 ImageMS = 9,
55 ScriptMS = 10,
56 TotalPrim = 11,
57 ActivePrim = 12,
58 Agents = 13,
59 ChildAgents = 14,
60 ActiveScripts = 15,
61 ScriptLinesPerSecond = 16,
62 InPacketsPerSecond = 17,
63 OutPacketsPerSecond = 18,
64 PendingDownloads = 19,
65 PendingUploads = 20,
66 UnAckedBytes = 24,
67
68 // Havok4 related... May or may not be in upcoming LLclients
69 // (kelly added them sometime late in January 2008)
70 NumRCCSLODReduced = 25,
71 NumRCCSFixed = 26
72 }
73
74 // Sending a stats update every 3 seconds
76 private int statsUpdatesEveryMS = 3000; 75 private int statsUpdatesEveryMS = 3000;
76 private float statsUpdateFactor = 0;
77 private float m_timeDilation = 0;
78 private int m_fps = 0;
79 private float m_pfps = 0;
80 private int m_agentUpdates = 0;
81
82 private int m_frameMS = 0;
83 private int m_netMS = 0;
84 private int m_agentMS = 0;
85 private int m_physicsMS = 0;
86 private int m_imageMS = 0;
87 private int m_otherMS = 0;
88
89//Ckrinke: (3-21-08) Comment out to remove a compiler warning. Bring back into play when needed.
90//Ckrinke private int m_scriptMS = 0;
91
92 private int m_rootAgents = 0;
93 private int m_childAgents = 0;
94 private int m_numPrim = 0;
95 private int m_inPacketsPerSecond = 0;
96 private int m_outPacketsPerSecond = 0;
97 private int m_activePrim = 0;
98 private int m_unAckedBytes = 0;
99 private int m_pendingDownloads = 0;
100 private int m_pendingUploads = 0;
101 private int m_activeScripts = 0;
102 private int m_scriptLinesPerSecond = 0;
103
104 private int objectCapacity = 45000;
105
106
107 SimStatsPacket.StatBlock[] sb = new SimStatsPacket.StatBlock[21];
108 SimStatsPacket.RegionBlock rb = new SimStatsPacket.RegionBlock();
109 SimStatsPacket statpack = (SimStatsPacket)PacketPool.Instance.GetPacket(PacketType.SimStats);
110
111
112 private RegionInfo ReportingRegion;
113
114 private Timer m_report = new Timer();
77 115
78 116
79 public SimStatsReporter(RegionInfo regionData) 117 public SimStatsReporter(RegionInfo regionData)
80 { 118 {
81 statsUpdateFactor = (statsUpdatesEveryMS / 1000); 119
120 statsUpdateFactor = (float)(statsUpdatesEveryMS / 1000);
82 ReportingRegion = regionData; 121 ReportingRegion = regionData;
83 for (int i = 0; i < 21; i++) 122 for (int i = 0; i<21;i++)
84 { 123 {
85 sb[i] = new SimStatsPacket.StatBlock(); 124 sb[i] = new SimStatsPacket.StatBlock();
86 } 125 }
87 m_report.AutoReset = true; 126 m_report.AutoReset = true;
88 m_report.Interval = statsUpdatesEveryMS; 127 m_report.Interval = statsUpdatesEveryMS;
89 m_report.Elapsed += statsHeartBeat; 128 m_report.Elapsed += new ElapsedEventHandler(statsHeartBeat);
90 m_report.Enabled = true; 129 m_report.Enabled = true;
91 } 130 }
92 131
93 public event SendStatResult OnSendStatsResult;
94
95 public void SetUpdateMS(int ms) 132 public void SetUpdateMS(int ms)
96 { 133 {
97 statsUpdatesEveryMS = ms; 134 statsUpdatesEveryMS = ms;
98 statsUpdateFactor = (statsUpdatesEveryMS / 1000); 135 statsUpdateFactor = (float)(statsUpdatesEveryMS / 1000);
99 m_report.Interval = statsUpdatesEveryMS; 136 m_report.Interval = statsUpdatesEveryMS;
100 } 137 }
101 138
@@ -106,8 +143,8 @@ namespace OpenSim.Region.Environment.Scenes
106 lock (m_report) 143 lock (m_report)
107 { 144 {
108 // Packet is already initialized and ready for data insert 145 // Packet is already initialized and ready for data insert
109 146
110 147
111 statpack.Region = rb; 148 statpack.Region = rb;
112 statpack.Region.RegionX = ReportingRegion.RegionLocX; 149 statpack.Region.RegionX = ReportingRegion.RegionLocX;
113 statpack.Region.RegionY = ReportingRegion.RegionLocY; 150 statpack.Region.RegionY = ReportingRegion.RegionLocY;
@@ -117,102 +154,102 @@ namespace OpenSim.Region.Environment.Scenes
117 } 154 }
118 catch (Exception) 155 catch (Exception)
119 { 156 {
120 statpack.Region.RegionFlags = 0; 157 statpack.Region.RegionFlags = (uint) 0;
121 } 158 }
122 statpack.Region.ObjectCapacity = (uint) objectCapacity; 159 statpack.Region.ObjectCapacity = (uint) objectCapacity;
123 160
124 #region various statistic googly moogly 161#region various statistic googly moogly
125 162
126 // Our FPS is actually 10fps, so multiplying by 5 to get the amount that people expect there 163 // Our FPS is actually 10fps, so multiplying by 5 to get the amount that people expect there
127 // 0-50 is pretty close to 0-45 164 // 0-50 is pretty close to 0-45
128 float simfps = ((m_fps * 5)); 165 float simfps = (int) ((m_fps * 5));
129 166
130 //if (simfps > 45) 167 //if (simfps > 45)
131 //simfps = simfps - (simfps - 45); 168 //simfps = simfps - (simfps - 45);
132 //if (simfps < 0) 169 //if (simfps < 0)
133 //simfps = 0; 170 //simfps = 0;
134 171
135 // 172 //
136 float physfps = ((m_pfps / 1000)); 173 float physfps = ((m_pfps / 1000));
137 174
138 //if (physfps > 600) 175 //if (physfps > 600)
139 //physfps = physfps - (physfps - 600); 176 //physfps = physfps - (physfps - 600);
140 177
141 if (physfps < 0) 178 if (physfps < 0)
142 physfps = 0; 179 physfps = 0;
143 180
144 #endregion 181#endregion
145 182
146 //Our time dilation is 0.91 when we're running a full speed, 183 //Our time dilation is 0.91 when we're running a full speed,
147 // therefore to make sure we get an appropriate range, 184 // therefore to make sure we get an appropriate range,
148 // we have to factor in our error. (0.10f * statsUpdateFactor) 185 // we have to factor in our error. (0.10f * statsUpdateFactor)
149 // multiplies the fix for the error times the amount of times it'll occur a second 186 // multiplies the fix for the error times the amount of times it'll occur a second
150 // / 10 divides the value by the number of times the sim heartbeat runs (10fps) 187 // / 10 divides the value by the number of times the sim heartbeat runs (10fps)
151 // Then we divide the whole amount by the amount of seconds pass in between stats updates. 188 // Then we divide the whole amount by the amount of seconds pass in between stats updates.
152 189
153 sb[0].StatID = (uint) Stats.TimeDilation; 190 sb[0].StatID = (uint) Stats.TimeDilation;
154 sb[0].StatValue = m_timeDilation; //((((m_timeDilation + (0.10f * statsUpdateFactor)) /10) / statsUpdateFactor)); 191 sb[0].StatValue = m_timeDilation ; //((((m_timeDilation + (0.10f * statsUpdateFactor)) /10) / statsUpdateFactor));
155 192
156 sb[1].StatID = (uint) Stats.SimFPS; 193 sb[1].StatID = (uint) Stats.SimFPS;
157 sb[1].StatValue = simfps / statsUpdateFactor; 194 sb[1].StatValue = simfps/statsUpdateFactor;
158 195
159 sb[2].StatID = (uint) Stats.PhysicsFPS; 196 sb[2].StatID = (uint) Stats.PhysicsFPS;
160 sb[2].StatValue = physfps / statsUpdateFactor; 197 sb[2].StatValue = physfps / statsUpdateFactor;
161 198
162 sb[3].StatID = (uint) Stats.AgentUpdates; 199 sb[3].StatID = (uint) Stats.AgentUpdates;
163 sb[3].StatValue = (m_agentUpdates / statsUpdateFactor); 200 sb[3].StatValue = (m_agentUpdates / statsUpdateFactor);
164 201
165 sb[4].StatID = (uint) Stats.Agents; 202 sb[4].StatID = (uint) Stats.Agents;
166 sb[4].StatValue = m_rootAgents; 203 sb[4].StatValue = m_rootAgents;
167 204
168 sb[5].StatID = (uint) Stats.ChildAgents; 205 sb[5].StatID = (uint) Stats.ChildAgents;
169 sb[5].StatValue = m_childAgents; 206 sb[5].StatValue = m_childAgents;
170 207
171 sb[6].StatID = (uint) Stats.TotalPrim; 208 sb[6].StatID = (uint) Stats.TotalPrim;
172 sb[6].StatValue = m_numPrim; 209 sb[6].StatValue = m_numPrim;
173 210
174 sb[7].StatID = (uint) Stats.ActivePrim; 211 sb[7].StatID = (uint) Stats.ActivePrim;
175 sb[7].StatValue = m_activePrim; 212 sb[7].StatValue = m_activePrim;
176 213
177 sb[8].StatID = (uint) Stats.FrameMS; 214 sb[8].StatID = (uint)Stats.FrameMS;
178 sb[8].StatValue = m_frameMS / statsUpdateFactor; 215 sb[8].StatValue = m_frameMS / statsUpdateFactor;
179 216
180 sb[9].StatID = (uint) Stats.NetMS; 217 sb[9].StatID = (uint)Stats.NetMS;
181 sb[9].StatValue = m_netMS / statsUpdateFactor; 218 sb[9].StatValue = m_netMS / statsUpdateFactor;
182 219
183 sb[10].StatID = (uint) Stats.PhysicsMS; 220 sb[10].StatID = (uint)Stats.PhysicsMS;
184 sb[10].StatValue = m_physicsMS / statsUpdateFactor; 221 sb[10].StatValue = m_physicsMS / statsUpdateFactor;
185 222
186 sb[11].StatID = (uint) Stats.ImageMS; 223 sb[11].StatID = (uint)Stats.ImageMS ;
187 sb[11].StatValue = m_imageMS / statsUpdateFactor; 224 sb[11].StatValue = m_imageMS / statsUpdateFactor;
188 225
189 sb[12].StatID = (uint) Stats.OtherMS; 226 sb[12].StatID = (uint)Stats.OtherMS;
190 sb[12].StatValue = m_otherMS / statsUpdateFactor; 227 sb[12].StatValue = m_otherMS / statsUpdateFactor;
191 228
192 sb[13].StatID = (uint) Stats.InPacketsPerSecond; 229 sb[13].StatID = (uint)Stats.InPacketsPerSecond;
193 sb[13].StatValue = (m_inPacketsPerSecond); 230 sb[13].StatValue = (m_inPacketsPerSecond);
194 231
195 sb[14].StatID = (uint) Stats.OutPacketsPerSecond; 232 sb[14].StatID = (uint)Stats.OutPacketsPerSecond;
196 sb[14].StatValue = (m_outPacketsPerSecond / statsUpdateFactor); 233 sb[14].StatValue = (m_outPacketsPerSecond / statsUpdateFactor);
197 234
198 sb[15].StatID = (uint) Stats.UnAckedBytes; 235 sb[15].StatID = (uint)Stats.UnAckedBytes;
199 sb[15].StatValue = m_unAckedBytes; 236 sb[15].StatValue = m_unAckedBytes;
200 237
201 sb[16].StatID = (uint) Stats.AgentMS; 238 sb[16].StatID = (uint)Stats.AgentMS;
202 sb[16].StatValue = m_agentMS / statsUpdateFactor; 239 sb[16].StatValue = m_agentMS / statsUpdateFactor;
203 240
204 sb[17].StatID = (uint) Stats.PendingDownloads; 241 sb[17].StatID = (uint)Stats.PendingDownloads;
205 sb[17].StatValue = m_pendingDownloads; 242 sb[17].StatValue = m_pendingDownloads;
206 243
207 sb[18].StatID = (uint) Stats.PendingUploads; 244 sb[18].StatID = (uint)Stats.PendingUploads;
208 sb[18].StatValue = m_pendingUploads; 245 sb[18].StatValue = m_pendingUploads;
209 246
210 sb[19].StatID = (uint) Stats.ActiveScripts; 247 sb[19].StatID = (uint)Stats.ActiveScripts;
211 sb[19].StatValue = m_activeScripts; 248 sb[19].StatValue = m_activeScripts;
212 249
213 sb[20].StatID = (uint) Stats.ScriptLinesPerSecond; 250 sb[20].StatID = (uint)Stats.ScriptLinesPerSecond;
214 sb[20].StatValue = m_scriptLinesPerSecond / statsUpdateFactor; 251 sb[20].StatValue = m_scriptLinesPerSecond / statsUpdateFactor;
215 252
216 statpack.Stat = sb; 253 statpack.Stat = sb;
217 254
218 handlerSendStatResult = OnSendStatsResult; 255 handlerSendStatResult = OnSendStatsResult;
@@ -223,7 +260,7 @@ namespace OpenSim.Region.Environment.Scenes
223 resetvalues(); 260 resetvalues();
224 } 261 }
225 } 262 }
226 263
227 private void resetvalues() 264 private void resetvalues()
228 { 265 {
229 m_timeDilation = 0; 266 m_timeDilation = 0;
@@ -247,7 +284,6 @@ namespace OpenSim.Region.Environment.Scenes
247 } 284 }
248 285
249 # region methods called from Scene 286 # region methods called from Scene
250
251 // The majority of these functions are additive 287 // The majority of these functions are additive
252 // so that you can easily change the amount of 288 // so that you can easily change the amount of
253 // seconds in between sim stats updates 289 // seconds in between sim stats updates
@@ -256,10 +292,10 @@ namespace OpenSim.Region.Environment.Scenes
256 { 292 {
257 //float tdsetting = td; 293 //float tdsetting = td;
258 //if (tdsetting > 1.0f) 294 //if (tdsetting > 1.0f)
259 //tdsetting = (tdsetting - (tdsetting - 0.91f)); 295 //tdsetting = (tdsetting - (tdsetting - 0.91f));
260 296
261 //if (tdsetting < 0) 297 //if (tdsetting < 0)
262 //tdsetting = 0.0f; 298 //tdsetting = 0.0f;
263 m_timeDilation = td; 299 m_timeDilation = td;
264 } 300 }
265 301
@@ -317,35 +353,30 @@ namespace OpenSim.Region.Environment.Scenes
317 { 353 {
318 m_frameMS += ms; 354 m_frameMS += ms;
319 } 355 }
320
321 public void addNetMS(int ms) 356 public void addNetMS(int ms)
322 { 357 {
323 m_netMS += ms; 358 m_netMS += ms;
324 } 359 }
325
326 public void addAgentMS(int ms) 360 public void addAgentMS(int ms)
327 { 361 {
328 m_agentMS += ms; 362 m_agentMS += ms;
329 } 363 }
330
331 public void addPhysicsMS(int ms) 364 public void addPhysicsMS(int ms)
332 { 365 {
333 m_physicsMS += ms; 366 m_physicsMS += ms;
334 } 367 }
335
336 public void addImageMS(int ms) 368 public void addImageMS(int ms)
337 { 369 {
338 m_imageMS += ms; 370 m_imageMS += ms;
339 } 371 }
340
341 public void addOtherMS(int ms) 372 public void addOtherMS(int ms)
342 { 373 {
343 m_otherMS += ms; 374 m_otherMS += ms;
344 } 375 }
345 376
346// private static readonly log4net.ILog m_log 377// private static readonly log4net.ILog m_log
347// = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 378// = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
348 379
349 public void addPendingDownload(int count) 380 public void addPendingDownload(int count)
350 { 381 {
351 m_pendingDownloads += count; 382 m_pendingDownloads += count;
@@ -368,40 +399,5 @@ namespace OpenSim.Region.Environment.Scenes
368 } 399 }
369 400
370 #endregion 401 #endregion
371
372 #region Nested type: Stats
373
374 private enum Stats : uint
375 {
376 TimeDilation = 0,
377 SimFPS = 1,
378 PhysicsFPS = 2,
379 AgentUpdates = 3,
380 FrameMS = 4,
381 NetMS = 5,
382 OtherMS = 6,
383 PhysicsMS = 7,
384 AgentMS = 8,
385 ImageMS = 9,
386 ScriptMS = 10,
387 TotalPrim = 11,
388 ActivePrim = 12,
389 Agents = 13,
390 ChildAgents = 14,
391 ActiveScripts = 15,
392 ScriptLinesPerSecond = 16,
393 InPacketsPerSecond = 17,
394 OutPacketsPerSecond = 18,
395 PendingDownloads = 19,
396 PendingUploads = 20,
397 UnAckedBytes = 24,
398
399 // Havok4 related... May or may not be in upcoming LLclients
400 // (kelly added them sometime late in January 2008)
401 NumRCCSLODReduced = 25,
402 NumRCCSFixed = 26
403 }
404
405 #endregion
406 } 402 }
407} \ No newline at end of file 403}
diff --git a/OpenSim/Region/Environment/Scenes/UndoState.cs b/OpenSim/Region/Environment/Scenes/UndoState.cs
index f16bb34..daabd8d 100644
--- a/OpenSim/Region/Environment/Scenes/UndoState.cs
+++ b/OpenSim/Region/Environment/Scenes/UndoState.cs
@@ -32,8 +32,8 @@ namespace OpenSim.Region.Environment.Scenes
32 public class UndoState 32 public class UndoState
33 { 33 {
34 public LLVector3 Position = LLVector3.Zero; 34 public LLVector3 Position = LLVector3.Zero;
35 public LLQuaternion Rotation = LLQuaternion.Identity;
36 public LLVector3 Scale = LLVector3.Zero; 35 public LLVector3 Scale = LLVector3.Zero;
36 public LLQuaternion Rotation = LLQuaternion.Identity;
37 37
38 public UndoState(LLVector3 pos, LLQuaternion rot, LLVector3 scale) 38 public UndoState(LLVector3 pos, LLQuaternion rot, LLVector3 scale)
39 { 39 {
@@ -41,7 +41,7 @@ namespace OpenSim.Region.Environment.Scenes
41 Rotation = rot; 41 Rotation = rot;
42 Scale = scale; 42 Scale = scale;
43 } 43 }
44 44
45 public UndoState(SceneObjectPart part) 45 public UndoState(SceneObjectPart part)
46 { 46 {
47 if (part != null) 47 if (part != null)
@@ -50,20 +50,18 @@ namespace OpenSim.Region.Environment.Scenes
50 { 50 {
51 Position = part.AbsolutePosition; 51 Position = part.AbsolutePosition;
52 Rotation = part.RotationOffset; 52 Rotation = part.RotationOffset;
53
53 } 54 }
54 else 55 else
55 { 56 {
56 Position = part.GroupPosition; 57 Position = part.GroupPosition;
57 Rotation = part.RotationOffset; 58 Rotation = part.RotationOffset;
58 Scale = part.Shape.Scale; 59 Scale = part.Shape.Scale;
60
59 } 61 }
60 } 62 }
61 } 63 }
62 64
63 public UndoState()
64 {
65 }
66
67 public bool Compare(SceneObjectPart part) 65 public bool Compare(SceneObjectPart part)
68 { 66 {
69 if (part != null) 67 if (part != null)
@@ -81,6 +79,7 @@ namespace OpenSim.Region.Environment.Scenes
81 return true; 79 return true;
82 else 80 else
83 return false; 81 return false;
82
84 } 83 }
85 } 84 }
86 return false; 85 return false;
@@ -91,7 +90,7 @@ namespace OpenSim.Region.Environment.Scenes
91 if (part != null) 90 if (part != null)
92 { 91 {
93 part.m_undoing = true; 92 part.m_undoing = true;
94 93
95 if (part.ParentID == 0) 94 if (part.ParentID == 0)
96 { 95 {
97 part.ParentGroup.AbsolutePosition = Position; 96 part.ParentGroup.AbsolutePosition = Position;
@@ -106,7 +105,12 @@ namespace OpenSim.Region.Environment.Scenes
106 part.ScheduleTerseUpdate(); 105 part.ScheduleTerseUpdate();
107 } 106 }
108 part.m_undoing = false; 107 part.m_undoing = false;
108
109 } 109 }
110 } 110 }
111
112 public UndoState()
113 {
114 }
111 } 115 }
112} \ No newline at end of file 116}