aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Environment/Scenes
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Environment/Scenes')
-rw-r--r--OpenSim/Region/Environment/Scenes/Entity.cs193
-rw-r--r--OpenSim/Region/Environment/Scenes/IScenePresenceBody.cs19
-rw-r--r--OpenSim/Region/Environment/Scenes/Primitive.cs582
-rw-r--r--OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs305
-rw-r--r--OpenSim/Region/Environment/Scenes/Scene.cs784
-rw-r--r--OpenSim/Region/Environment/Scenes/SceneBase.cs200
-rw-r--r--OpenSim/Region/Environment/Scenes/SceneEvents.cs52
-rw-r--r--OpenSim/Region/Environment/Scenes/SceneObject.cs128
-rw-r--r--OpenSim/Region/Environment/Scenes/ScenePresence.Animations.cs76
-rw-r--r--OpenSim/Region/Environment/Scenes/ScenePresence.Body.cs90
-rw-r--r--OpenSim/Region/Environment/Scenes/ScenePresence.cs549
-rw-r--r--OpenSim/Region/Environment/Scenes/scripting/Engines/CSharpScriptEngine.cs104
-rw-r--r--OpenSim/Region/Environment/Scenes/scripting/Engines/JScriptEngine.cs104
-rw-r--r--OpenSim/Region/Environment/Scenes/scripting/Script.cs71
-rw-r--r--OpenSim/Region/Environment/Scenes/scripting/ScriptInfo.cs58
-rw-r--r--OpenSim/Region/Environment/Scenes/scripting/ScriptManager.cs96
16 files changed, 3411 insertions, 0 deletions
diff --git a/OpenSim/Region/Environment/Scenes/Entity.cs b/OpenSim/Region/Environment/Scenes/Entity.cs
new file mode 100644
index 0000000..db5070d
--- /dev/null
+++ b/OpenSim/Region/Environment/Scenes/Entity.cs
@@ -0,0 +1,193 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System;
29using System.Collections.Generic;
30using System.Text;
31using Axiom.MathLib;
32using OpenSim.Physics.Manager;
33using libsecondlife;
34
35namespace OpenSim.Region.Environment.Scenes
36{
37 public abstract class Entity
38 {
39 public libsecondlife.LLUUID uuid;
40 public Quaternion rotation;
41 protected List<Entity> children;
42
43 protected PhysicsActor _physActor;
44 protected Scene m_world;
45 protected string m_name;
46
47 /// <summary>
48 ///
49 /// </summary>
50 public virtual string Name
51 {
52 get { return m_name; }
53 }
54
55 protected LLVector3 m_pos;
56 /// <summary>
57 ///
58 /// </summary>
59 public virtual LLVector3 Pos
60 {
61 get
62 {
63 if (this._physActor != null)
64 {
65 m_pos.X = _physActor.Position.X;
66 m_pos.Y = _physActor.Position.Y;
67 m_pos.Z = _physActor.Position.Z;
68 }
69
70 return m_pos;
71 }
72 set
73 {
74 if (this._physActor != null)
75 {
76 try
77 {
78 lock (this.m_world.SyncRoot)
79 {
80
81 this._physActor.Position = new PhysicsVector(value.X, value.Y, value.Z);
82 }
83 }
84 catch (Exception e)
85 {
86 Console.WriteLine(e.Message);
87 }
88 }
89
90 m_pos = value;
91 }
92 }
93
94 public LLVector3 velocity;
95
96 /// <summary>
97 ///
98 /// </summary>
99 public virtual LLVector3 Velocity
100 {
101 get
102 {
103 if (this._physActor != null)
104 {
105 velocity.X = _physActor.Velocity.X;
106 velocity.Y = _physActor.Velocity.Y;
107 velocity.Z = _physActor.Velocity.Z;
108 }
109
110 return velocity;
111 }
112 set
113 {
114 if (this._physActor != null)
115 {
116 try
117 {
118 lock (this.m_world.SyncRoot)
119 {
120
121 this._physActor.Velocity = new PhysicsVector(value.X, value.Y, value.Z);
122 }
123 }
124 catch (Exception e)
125 {
126 Console.WriteLine(e.Message);
127 }
128 }
129
130 velocity = value;
131 }
132 }
133
134 protected uint m_localId;
135
136 public uint LocalId
137 {
138 get { return m_localId; }
139 }
140
141 /// <summary>
142 /// Creates a new Entity (should not occur on it's own)
143 /// </summary>
144 public Entity()
145 {
146 uuid = new libsecondlife.LLUUID();
147
148 m_pos = new LLVector3();
149 velocity = new LLVector3();
150 rotation = new Quaternion();
151 m_name = "(basic entity)";
152 children = new List<Entity>();
153 }
154
155 /// <summary>
156 ///
157 /// </summary>
158 public virtual void updateMovement()
159 {
160 foreach (Entity child in children)
161 {
162 child.updateMovement();
163 }
164 }
165
166 /// <summary>
167 /// Performs any updates that need to be done at each frame. This function is overridable from it's children.
168 /// </summary>
169 public virtual void update() {
170 // Do any per-frame updates needed that are applicable to every type of entity
171 foreach (Entity child in children)
172 {
173 child.update();
174 }
175 }
176
177 /// <summary>
178 /// Called at a set interval to inform entities that they should back themsleves up to the DB
179 /// </summary>
180 public virtual void BackUp()
181 {
182
183 }
184
185 /// <summary>
186 /// Infoms the entity that the land (heightmap) has changed
187 /// </summary>
188 public virtual void LandRenegerated()
189 {
190
191 }
192 }
193}
diff --git a/OpenSim/Region/Environment/Scenes/IScenePresenceBody.cs b/OpenSim/Region/Environment/Scenes/IScenePresenceBody.cs
new file mode 100644
index 0000000..36023d0
--- /dev/null
+++ b/OpenSim/Region/Environment/Scenes/IScenePresenceBody.cs
@@ -0,0 +1,19 @@
1using System;
2using System.Collections.Generic;
3using System.Text;
4using libsecondlife;
5using libsecondlife.Packets;
6using OpenSim.Physics.Manager;
7using OpenSim.Framework.Interfaces;
8using OpenSim.Framework.Types;
9
10namespace OpenSim.Region.Environment.Scenes
11{
12 public interface IScenePresenceBody
13 {
14 void processMovement(IClientAPI remoteClient, uint flags, LLQuaternion bodyRotation);
15 void SetAppearance(byte[] texture, AgentSetAppearancePacket.VisualParamBlock[] visualParam);
16 void SendOurAppearance(IClientAPI OurClient);
17 void SendAppearanceToOtherAgent(ScenePresence avatarInfo);
18 }
19}
diff --git a/OpenSim/Region/Environment/Scenes/Primitive.cs b/OpenSim/Region/Environment/Scenes/Primitive.cs
new file mode 100644
index 0000000..0f649b2
--- /dev/null
+++ b/OpenSim/Region/Environment/Scenes/Primitive.cs
@@ -0,0 +1,582 @@
1
2/*
3* Copyright (c) Contributors, http://www.openmetaverse.org/
4* See CONTRIBUTORS.TXT for a full list of copyright holders.
5*
6* Redistribution and use in source and binary forms, with or without
7* modification, are permitted provided that the following conditions are met:
8* * Redistributions of source code must retain the above copyright
9* notice, this list of conditions and the following disclaimer.
10* * Redistributions in binary form must reproduce the above copyright
11* notice, this list of conditions and the following disclaimer in the
12* documentation and/or other materials provided with the distribution.
13* * Neither the name of the OpenSim Project nor the
14* names of its contributors may be used to endorse or promote products
15* derived from this software without specific prior written permission.
16*
17* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
18* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
21* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
26* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27*
28*/
29using System;
30using System.Collections.Generic;
31using System.Text;
32using libsecondlife;
33using libsecondlife.Packets;
34using OpenSim.Framework.Interfaces;
35using OpenSim.Physics.Manager;
36using OpenSim.Framework.Types;
37using OpenSim.Framework.Inventory;
38
39namespace OpenSim.Region.Environment.Scenes
40{
41 public class Primitive : Entity
42 {
43 internal PrimData primData;
44 private LLVector3 positionLastFrame = new LLVector3(0, 0, 0);
45 // private Dictionary<uint, IClientAPI> m_clientThreads;
46 private ulong m_regionHandle;
47 private const uint FULL_MASK_PERMISSIONS = 2147483647;
48 private bool physicsEnabled = false;
49 private byte updateFlag = 0;
50 private uint flags = 32 + 65536 + 131072 + 256 + 4 + 8 + 2048 + 524288 + 268435456 + 128;
51
52 private Dictionary<LLUUID, InventoryItem> inventoryItems;
53
54 #region Properties
55
56 public LLVector3 Scale
57 {
58 set
59 {
60 this.primData.Scale = value;
61 //this.dirtyFlag = true;
62 }
63 get
64 {
65 return this.primData.Scale;
66 }
67 }
68
69 public PhysicsActor PhysActor
70 {
71 set
72 {
73 this._physActor = value;
74 }
75 }
76
77 public override LLVector3 Pos
78 {
79 get
80 {
81 return base.Pos;
82 }
83 set
84 {
85 base.Pos = value;
86 }
87 }
88 #endregion
89
90 /// <summary>
91 ///
92 /// </summary>
93 /// <param name="clientThreads"></param>
94 /// <param name="regionHandle"></param>
95 /// <param name="world"></param>
96 public Primitive( ulong regionHandle, Scene world)
97 {
98 // m_clientThreads = clientThreads;
99 m_regionHandle = regionHandle;
100 m_world = world;
101 inventoryItems = new Dictionary<LLUUID, InventoryItem>();
102 }
103
104 /// <summary>
105 ///
106 /// </summary>
107 /// <param name="regionHandle"></param>
108 /// <param name="world"></param>
109 /// <param name="addPacket"></param>
110 /// <param name="ownerID"></param>
111 /// <param name="localID"></param>
112 public Primitive(ulong regionHandle, Scene world, ObjectAddPacket addPacket, LLUUID ownerID, uint localID)
113 {
114 // m_clientThreads = clientThreads;
115 m_regionHandle = regionHandle;
116 m_world = world;
117 inventoryItems = new Dictionary<LLUUID, InventoryItem>();
118 this.CreateFromPacket(addPacket, ownerID, localID);
119 }
120
121 /// <summary>
122 ///
123 /// </summary>
124 /// <param name="clientThreads"></param>
125 /// <param name="regionHandle"></param>
126 /// <param name="world"></param>
127 /// <param name="owner"></param>
128 /// <param name="fullID"></param>
129 /// <param name="localID"></param>
130 public Primitive( ulong regionHandle, Scene world, LLUUID owner, LLUUID fullID, uint localID)
131 {
132 // m_clientThreads = clientThreads;
133 m_regionHandle = regionHandle;
134 m_world = world;
135 inventoryItems = new Dictionary<LLUUID, InventoryItem>();
136 this.primData = new PrimData();
137 this.primData.CreationDate = (Int32)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds;
138 this.primData.OwnerID = owner;
139 this.primData.FullID = this.uuid = fullID;
140 this.primData.LocalID = m_localId = localID;
141 }
142
143 /// <summary>
144 /// Constructor to create a default cube
145 /// </summary>
146 /// <param name="clientThreads"></param>
147 /// <param name="regionHandle"></param>
148 /// <param name="world"></param>
149 /// <param name="owner"></param>
150 /// <param name="localID"></param>
151 /// <param name="position"></param>
152 public Primitive( ulong regionHandle, Scene world, LLUUID owner, uint localID, LLVector3 position)
153 {
154 //m_clientThreads = clientThreads;
155 m_regionHandle = regionHandle;
156 m_world = world;
157 inventoryItems = new Dictionary<LLUUID, InventoryItem>();
158 this.primData = PrimData.DefaultCube();
159 this.primData.OwnerID = owner;
160 this.primData.LocalID = m_localId = localID;
161 this.Pos = this.primData.Position = position;
162
163 this.updateFlag = 1;
164 }
165
166 /// <summary>
167 ///
168 /// </summary>
169 /// <returns></returns>
170 public byte[] GetByteArray()
171 {
172 byte[] result = null;
173 List<byte[]> dataArrays = new List<byte[]>();
174 dataArrays.Add(primData.ToBytes());
175 foreach (Entity child in children)
176 {
177 if (child is OpenSim.Region.Environment.Scenes.Primitive)
178 {
179 dataArrays.Add(((OpenSim.Region.Environment.Scenes.Primitive)child).GetByteArray());
180 }
181 }
182 byte[] primstart = Helpers.StringToField("<Prim>");
183 byte[] primend = Helpers.StringToField("</Prim>");
184 int totalLength = primstart.Length + primend.Length;
185 for (int i = 0; i < dataArrays.Count; i++)
186 {
187 totalLength += dataArrays[i].Length;
188 }
189
190 result = new byte[totalLength];
191 int arraypos = 0;
192 Array.Copy(primstart, 0, result, 0, primstart.Length);
193 arraypos += primstart.Length;
194 for (int i = 0; i < dataArrays.Count; i++)
195 {
196 Array.Copy(dataArrays[i], 0, result, arraypos, dataArrays[i].Length);
197 arraypos += dataArrays[i].Length;
198 }
199 Array.Copy(primend, 0, result, arraypos, primend.Length);
200
201 return result;
202 }
203
204 #region Overridden Methods
205
206 /// <summary>
207 ///
208 /// </summary>
209 public override void update()
210 {
211 if (this.updateFlag == 1) // is a new prim just been created/reloaded
212 {
213 this.SendFullUpdateToAllClients();
214 this.updateFlag = 0;
215 }
216 if (this.updateFlag == 2) //some change has been made so update the clients
217 {
218 this.SendTerseUpdateToALLClients();
219 this.updateFlag = 0;
220 }
221 }
222
223 /// <summary>
224 ///
225 /// </summary>
226 public override void BackUp()
227 {
228
229 }
230
231 #endregion
232
233 #region Packet handlers
234
235 /// <summary>
236 ///
237 /// </summary>
238 /// <param name="pos"></param>
239 public void UpdatePosition(LLVector3 pos)
240 {
241 this.Pos = new LLVector3(pos.X, pos.Y, pos.Z);
242 this.updateFlag = 2;
243 }
244
245 /// <summary>
246 ///
247 /// </summary>
248 /// <param name="addPacket"></param>
249 public void UpdateShape(ObjectShapePacket.ObjectDataBlock updatePacket)
250 {
251 this.primData.PathBegin = updatePacket.PathBegin;
252 this.primData.PathEnd = updatePacket.PathEnd;
253 this.primData.PathScaleX = updatePacket.PathScaleX;
254 this.primData.PathScaleY = updatePacket.PathScaleY;
255 this.primData.PathShearX = updatePacket.PathShearX;
256 this.primData.PathShearY = updatePacket.PathShearY;
257 this.primData.PathSkew = updatePacket.PathSkew;
258 this.primData.ProfileBegin = updatePacket.ProfileBegin;
259 this.primData.ProfileEnd = updatePacket.ProfileEnd;
260 this.primData.PathCurve = updatePacket.PathCurve;
261 this.primData.ProfileCurve = updatePacket.ProfileCurve;
262 this.primData.ProfileHollow = updatePacket.ProfileHollow;
263 this.primData.PathRadiusOffset = updatePacket.PathRadiusOffset;
264 this.primData.PathRevolutions = updatePacket.PathRevolutions;
265 this.primData.PathTaperX = updatePacket.PathTaperX;
266 this.primData.PathTaperY = updatePacket.PathTaperY;
267 this.primData.PathTwist = updatePacket.PathTwist;
268 this.primData.PathTwistBegin = updatePacket.PathTwistBegin;
269 }
270
271 /// <summary>
272 ///
273 /// </summary>
274 /// <param name="tex"></param>
275 public void UpdateTexture(byte[] tex)
276 {
277 this.primData.TextureEntry = tex;
278 }
279
280 /// <summary>
281 ///
282 /// </summary>
283 /// <param name="pack"></param>
284 public void UpdateObjectFlags(ObjectFlagUpdatePacket pack)
285 {
286
287 }
288
289 /// <summary>
290 ///
291 /// </summary>
292 /// <param name="prim"></param>
293 public void AssignToParent(Primitive prim)
294 {
295
296 }
297
298 #endregion
299
300 # region Inventory Methods
301 /// <summary>
302 ///
303 /// </summary>
304 /// <param name="item"></param>
305 /// <returns></returns>
306 public bool AddToInventory(InventoryItem item)
307 {
308 return false;
309 }
310
311 /// <summary>
312 ///
313 /// </summary>
314 /// <param name="itemID"></param>
315 /// <returns></returns>
316 public InventoryItem RemoveFromInventory(LLUUID itemID)
317 {
318 return null;
319 }
320
321 /// <summary>
322 ///
323 /// </summary>
324 /// <param name="simClient"></param>
325 /// <param name="packet"></param>
326 public void RequestInventoryInfo(IClientAPI simClient, RequestTaskInventoryPacket packet)
327 {
328
329 }
330
331 /// <summary>
332 ///
333 /// </summary>
334 /// <param name="simClient"></param>
335 /// <param name="xferID"></param>
336 public void RequestXferInventory(IClientAPI simClient, ulong xferID)
337 {
338 //will only currently work if the total size of the inventory data array is under about 1000 bytes
339 SendXferPacketPacket send = new SendXferPacketPacket();
340
341 send.XferID.ID = xferID;
342 send.XferID.Packet = 1 + 2147483648;
343 send.DataPacket.Data = this.ConvertInventoryToBytes();
344
345 simClient.OutPacket(send);
346 }
347
348 /// <summary>
349 ///
350 /// </summary>
351 /// <returns></returns>
352 public byte[] ConvertInventoryToBytes()
353 {
354 System.Text.Encoding enc = System.Text.Encoding.ASCII;
355 byte[] result = new byte[0];
356 List<byte[]> inventoryData = new List<byte[]>();
357 int totallength = 0;
358 foreach (InventoryItem invItem in inventoryItems.Values)
359 {
360 byte[] data = enc.GetBytes(invItem.ExportString());
361 inventoryData.Add(data);
362 totallength += data.Length;
363 }
364 //TODO: copy arrays into the single result array
365
366 return result;
367 }
368
369 /// <summary>
370 ///
371 /// </summary>
372 /// <param name="data"></param>
373 public void CreateInventoryFromBytes(byte[] data)
374 {
375
376 }
377
378 #endregion
379
380 #region Update viewers Methods
381
382 /// <summary>
383 ///
384 /// </summary>
385 /// <param name="remoteClient"></param>
386 public void SendFullUpdateForAllChildren(IClientAPI remoteClient)
387 {
388 this.SendFullUpdateToClient(remoteClient);
389 for (int i = 0; i < this.children.Count; i++)
390 {
391 if (this.children[i] is Primitive)
392 {
393 ((Primitive)this.children[i]).SendFullUpdateForAllChildren(remoteClient);
394 }
395 }
396 }
397
398 /// <summary>
399 ///
400 /// </summary>
401 /// <param name="remoteClient"></param>
402 public void SendFullUpdateToClient(IClientAPI remoteClient)
403 {
404 LLVector3 lPos;
405 if (this._physActor != null && this.physicsEnabled)
406 {
407 PhysicsVector pPos = this._physActor.Position;
408 lPos = new LLVector3(pPos.X, pPos.Y, pPos.Z);
409 }
410 else
411 {
412 lPos = this.Pos;
413 }
414
415 remoteClient.SendPrimitiveToClient(this.m_regionHandle, 64096, this.LocalId, this.primData, lPos, new LLUUID("00000000-0000-0000-9999-000000000005"), this.flags);
416 }
417
418 /// <summary>
419 ///
420 /// </summary>
421 public void SendFullUpdateToAllClients()
422 {
423 List<ScenePresence> avatars = this.m_world.RequestAvatarList();
424 for (int i = 0; i < avatars.Count; i++)
425 {
426 this.SendFullUpdateToClient(avatars[i].ControllingClient);
427 }
428 }
429
430 /// <summary>
431 ///
432 /// </summary>
433 /// <param name="RemoteClient"></param>
434 public void SendTerseUpdateToClient(IClientAPI RemoteClient)
435 {
436 LLVector3 lPos;
437 Axiom.MathLib.Quaternion lRot;
438 if (this._physActor != null && this.physicsEnabled) //is this needed ? doesn't the property fields do this for us?
439 {
440 PhysicsVector pPos = this._physActor.Position;
441 lPos = new LLVector3(pPos.X, pPos.Y, pPos.Z);
442 lRot = this._physActor.Orientation;
443 }
444 else
445 {
446 lPos = this.Pos;
447 lRot = this.rotation;
448 }
449 LLQuaternion mRot = new LLQuaternion(lRot.x, lRot.y, lRot.z, lRot.w);
450 RemoteClient.SendPrimTerseUpdate(this.m_regionHandle, 64096, this.LocalId, lPos, mRot);
451 }
452
453 /// <summary>
454 ///
455 /// </summary>
456 public void SendTerseUpdateToALLClients()
457 {
458 List<ScenePresence> avatars = this.m_world.RequestAvatarList();
459 for (int i = 0; i < avatars.Count; i++)
460 {
461 this.SendTerseUpdateToClient(avatars[i].ControllingClient);
462 }
463 }
464
465 #endregion
466
467 #region Create Methods
468
469 /// <summary>
470 ///
471 /// </summary>
472 /// <param name="addPacket"></param>
473 /// <param name="ownerID"></param>
474 /// <param name="localID"></param>
475 public void CreateFromPacket(ObjectAddPacket addPacket, LLUUID ownerID, uint localID)
476 {
477 PrimData PData = new PrimData();
478 this.primData = PData;
479 this.primData.CreationDate = (Int32)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds;
480
481 PData.OwnerID = ownerID;
482 PData.PCode = addPacket.ObjectData.PCode;
483 PData.PathBegin = addPacket.ObjectData.PathBegin;
484 PData.PathEnd = addPacket.ObjectData.PathEnd;
485 PData.PathScaleX = addPacket.ObjectData.PathScaleX;
486 PData.PathScaleY = addPacket.ObjectData.PathScaleY;
487 PData.PathShearX = addPacket.ObjectData.PathShearX;
488 PData.PathShearY = addPacket.ObjectData.PathShearY;
489 PData.PathSkew = addPacket.ObjectData.PathSkew;
490 PData.ProfileBegin = addPacket.ObjectData.ProfileBegin;
491 PData.ProfileEnd = addPacket.ObjectData.ProfileEnd;
492 PData.Scale = addPacket.ObjectData.Scale;
493 PData.PathCurve = addPacket.ObjectData.PathCurve;
494 PData.ProfileCurve = addPacket.ObjectData.ProfileCurve;
495 PData.ParentID = 0;
496 PData.ProfileHollow = addPacket.ObjectData.ProfileHollow;
497 PData.PathRadiusOffset = addPacket.ObjectData.PathRadiusOffset;
498 PData.PathRevolutions = addPacket.ObjectData.PathRevolutions;
499 PData.PathTaperX = addPacket.ObjectData.PathTaperX;
500 PData.PathTaperY = addPacket.ObjectData.PathTaperY;
501 PData.PathTwist = addPacket.ObjectData.PathTwist;
502 PData.PathTwistBegin = addPacket.ObjectData.PathTwistBegin;
503 LLVector3 pos1 = addPacket.ObjectData.RayEnd;
504 this.primData.FullID = this.uuid = LLUUID.Random();
505 this.primData.LocalID = m_localId = (uint)(localID);
506 this.primData.Position = this.Pos = pos1;
507
508 this.updateFlag = 1;
509 }
510
511 /// <summary>
512 ///
513 /// </summary>
514 /// <param name="data"></param>
515 public void CreateFromBytes(byte[] data)
516 {
517
518 }
519
520 /// <summary>
521 ///
522 /// </summary>
523 /// <param name="primData"></param>
524 public void CreateFromPrimData(PrimData primData)
525 {
526 this.CreateFromPrimData(primData, primData.Position, primData.LocalID, false);
527 }
528
529 /// <summary>
530 ///
531 /// </summary>
532 /// <param name="primData"></param>
533 /// <param name="posi"></param>
534 /// <param name="localID"></param>
535 /// <param name="newprim"></param>
536 public void CreateFromPrimData(PrimData primData, LLVector3 posi, uint localID, bool newprim)
537 {
538
539 }
540
541 public void GrapMovement(LLVector3 offset, LLVector3 pos, IClientAPI remoteClient)
542 {
543 // Console.WriteLine("moving prim to new location " + pos.X + " , " + pos.Y + " , " + pos.Z);
544 this.Pos = pos;
545 this.SendTerseUpdateToALLClients();
546 }
547
548 public void GetProperites(IClientAPI client)
549 {
550 //needs changing
551 ObjectPropertiesPacket proper = new ObjectPropertiesPacket();
552 proper.ObjectData = new ObjectPropertiesPacket.ObjectDataBlock[1];
553 proper.ObjectData[0] = new ObjectPropertiesPacket.ObjectDataBlock();
554 proper.ObjectData[0].ItemID = LLUUID.Zero;
555 proper.ObjectData[0].CreationDate = (ulong)primData.CreationDate;
556 proper.ObjectData[0].CreatorID = primData.OwnerID;
557 proper.ObjectData[0].FolderID = LLUUID.Zero;
558 proper.ObjectData[0].FromTaskID = LLUUID.Zero;
559 proper.ObjectData[0].GroupID = LLUUID.Zero;
560 proper.ObjectData[0].InventorySerial = 0;
561 proper.ObjectData[0].LastOwnerID = LLUUID.Zero;
562 proper.ObjectData[0].ObjectID = this.uuid;
563 proper.ObjectData[0].OwnerID = primData.OwnerID;
564 proper.ObjectData[0].TouchName = new byte[0];
565 proper.ObjectData[0].TextureID = new byte[0];
566 proper.ObjectData[0].SitName = new byte[0];
567 proper.ObjectData[0].Name = new byte[0];
568 proper.ObjectData[0].Description = new byte[0];
569 proper.ObjectData[0].OwnerMask = primData.OwnerMask;
570 proper.ObjectData[0].NextOwnerMask = primData.NextOwnerMask;
571 proper.ObjectData[0].GroupMask = primData.GroupMask;
572 proper.ObjectData[0].EveryoneMask = primData.EveryoneMask;
573 proper.ObjectData[0].BaseMask = primData.BaseMask;
574
575 client.OutPacket(proper);
576
577 }
578
579 #endregion
580
581 }
582}
diff --git a/OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs b/OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs
new file mode 100644
index 0000000..1d55c4d
--- /dev/null
+++ b/OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs
@@ -0,0 +1,305 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System;
29using System.Collections.Generic;
30using System.Text;
31using libsecondlife;
32using libsecondlife.Packets;
33using OpenSim.Physics.Manager;
34using OpenSim.Framework.Interfaces;
35using OpenSim.Framework.Types;
36using OpenSim.Framework.Inventory;
37using OpenSim.Framework.Utilities;
38
39namespace OpenSim.Region.Environment.Scenes
40{
41 public partial class Scene
42 {
43 /// <summary>
44 /// Modifies terrain using the specified information
45 /// </summary>
46 /// <param name="height">The height at which the user started modifying the terrain</param>
47 /// <param name="seconds">The number of seconds the modify button was pressed</param>
48 /// <param name="brushsize">The size of the brush used</param>
49 /// <param name="action">The action to be performed</param>
50 /// <param name="north">Distance from the north border where the cursor is located</param>
51 /// <param name="west">Distance from the west border where the cursor is located</param>
52 public void ModifyTerrain(float height, float seconds, byte brushsize, byte action, float north, float west)
53 {
54 // Shiny.
55 double size = (double)(1 << brushsize);
56
57 switch (action)
58 {
59 case 0:
60 // flatten terrain
61 Terrain.flatten(north, west, size, (double)seconds / 100.0);
62 RegenerateTerrain(true, (int)north, (int)west);
63 break;
64 case 1:
65 // raise terrain
66 Terrain.raise(north, west, size, (double)seconds / 100.0);
67 RegenerateTerrain(true, (int)north, (int)west);
68 break;
69 case 2:
70 //lower terrain
71 Terrain.lower(north, west, size, (double)seconds / 100.0);
72 RegenerateTerrain(true, (int)north, (int)west);
73 break;
74 case 3:
75 // smooth terrain
76 Terrain.smooth(north, west, size, (double)seconds / 100.0);
77 RegenerateTerrain(true, (int)north, (int)west);
78 break;
79 case 4:
80 // noise
81 Terrain.noise(north, west, size, (double)seconds / 100.0);
82 RegenerateTerrain(true, (int)north, (int)west);
83 break;
84 case 5:
85 // revert
86 Terrain.revert(north, west, size, (double)seconds / 100.0);
87 RegenerateTerrain(true, (int)north, (int)west);
88 break;
89
90 // CLIENT EXTENSIONS GO HERE
91 case 128:
92 // erode-thermal
93 break;
94 case 129:
95 // erode-aerobic
96 break;
97 case 130:
98 // erode-hydraulic
99 break;
100 }
101 return;
102 }
103
104 /// <summary>
105 ///
106 /// </summary>
107 /// <param name="message"></param>
108 /// <param name="type"></param>
109 /// <param name="fromPos"></param>
110 /// <param name="fromName"></param>
111 /// <param name="fromAgentID"></param>
112 public void SimChat(byte[] message, byte type, LLVector3 fromPos, string fromName, LLUUID fromAgentID)
113 {
114 Console.WriteLine("Chat message");
115 ScenePresence avatar = null;
116 foreach (IClientAPI client in m_clientThreads.Values)
117 {
118 int dis = -1000;
119 if (this.Avatars.ContainsKey(client.AgentId))
120 {
121
122 avatar = this.Avatars[client.AgentId];
123 // int dis = Util.fast_distance2d((int)(client.ClientAvatar.Pos.X - simClient.ClientAvatar.Pos.X), (int)(client.ClientAvatar.Pos.Y - simClient.ClientAvatar.Pos.Y));
124 dis= (int)avatar.Pos.GetDistanceTo(fromPos);
125 Console.WriteLine("found avatar at " +dis);
126
127 }
128
129 switch (type)
130 {
131 case 0: // Whisper
132 if ((dis < 10) && (dis > -10))
133 {
134 //should change so the message is sent through the avatar rather than direct to the ClientView
135 client.SendChatMessage(message, type, fromPos, fromName, fromAgentID);
136 }
137 break;
138 case 1: // Say
139 if ((dis < 30) && (dis > -30))
140 {
141 Console.WriteLine("sending chat");
142 client.SendChatMessage(message, type, fromPos, fromName, fromAgentID);
143 }
144 break;
145 case 2: // Shout
146 if ((dis < 100) && (dis > -100))
147 {
148 client.SendChatMessage(message, type, fromPos, fromName, fromAgentID);
149 }
150 break;
151
152 case 0xff: // Broadcast
153 client.SendChatMessage(message, type, fromPos, fromName, fromAgentID);
154 break;
155 }
156
157 }
158 }
159
160 /// <summary>
161 ///
162 /// </summary>
163 /// <param name="primAsset"></param>
164 /// <param name="pos"></param>
165 public void RezObject(AssetBase primAsset, LLVector3 pos)
166 {
167
168 }
169
170 /// <summary>
171 ///
172 /// </summary>
173 /// <param name="packet"></param>
174 /// <param name="simClient"></param>
175 public void DeRezObject(Packet packet, IClientAPI simClient)
176 {
177
178 }
179
180 /// <summary>
181 ///
182 /// </summary>
183 /// <param name="remoteClient"></param>
184 public void SendAvatarsToClient(IClientAPI remoteClient)
185 {
186
187 }
188
189 /// <summary>
190 ///
191 /// </summary>
192 /// <param name="parentPrim"></param>
193 /// <param name="childPrims"></param>
194 public void LinkObjects(uint parentPrim, List<uint> childPrims)
195 {
196
197
198 }
199
200 /// <summary>
201 ///
202 /// </summary>
203 /// <param name="primLocalID"></param>
204 /// <param name="shapeBlock"></param>
205 public void UpdatePrimShape(uint primLocalID, ObjectShapePacket.ObjectDataBlock shapeBlock)
206 {
207
208 }
209
210 /// <summary>
211 ///
212 /// </summary>
213 /// <param name="primLocalID"></param>
214 /// <param name="remoteClient"></param>
215 public void SelectPrim(uint primLocalID, IClientAPI remoteClient)
216 {
217 foreach (Entity ent in Entities.Values)
218 {
219 if (ent.LocalId == primLocalID)
220 {
221 ((OpenSim.Region.Environment.Scenes.Primitive)ent).GetProperites(remoteClient);
222 break;
223 }
224 }
225 }
226
227 public void MoveObject(LLUUID objectID, LLVector3 offset, LLVector3 pos, IClientAPI remoteClient)
228 {
229 if (this.Entities.ContainsKey(objectID))
230 {
231 ((Primitive)this.Entities[objectID]).GrapMovement(offset, pos, remoteClient);
232 }
233 }
234
235 /// <summary>
236 ///
237 /// </summary>
238 /// <param name="localID"></param>
239 /// <param name="packet"></param>
240 /// <param name="remoteClient"></param>
241 public void UpdatePrimFlags(uint localID, Packet packet, IClientAPI remoteClient)
242 {
243
244 }
245
246 /// <summary>
247 ///
248 /// </summary>
249 /// <param name="localID"></param>
250 /// <param name="texture"></param>
251 /// <param name="remoteClient"></param>
252 public void UpdatePrimTexture(uint localID, byte[] texture, IClientAPI remoteClient)
253 {
254
255 }
256
257 /// <summary>
258 ///
259 /// </summary>
260 /// <param name="localID"></param>
261 /// <param name="pos"></param>
262 /// <param name="remoteClient"></param>
263 public void UpdatePrimPosition(uint localID, LLVector3 pos, IClientAPI remoteClient)
264 {
265 foreach (Entity ent in Entities.Values)
266 {
267 if (ent.LocalId == localID)
268 {
269 ((OpenSim.Region.Environment.Scenes.Primitive)ent).UpdatePosition(pos);
270 break;
271 }
272 }
273 }
274
275 /// <summary>
276 ///
277 /// </summary>
278 /// <param name="localID"></param>
279 /// <param name="rot"></param>
280 /// <param name="remoteClient"></param>
281 public void UpdatePrimRotation(uint localID, LLQuaternion rot, IClientAPI remoteClient)
282 {
283
284 }
285
286 /// <summary>
287 ///
288 /// </summary>
289 /// <param name="localID"></param>
290 /// <param name="scale"></param>
291 /// <param name="remoteClient"></param>
292 public void UpdatePrimScale(uint localID, LLVector3 scale, IClientAPI remoteClient)
293 {
294 }
295
296 /// <summary>
297 /// Sends prims to a client
298 /// </summary>
299 /// <param name="RemoteClient">Client to send to</param>
300 public void GetInitialPrims(IClientAPI RemoteClient)
301 {
302
303 }
304 }
305}
diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs
new file mode 100644
index 0000000..8c912d0
--- /dev/null
+++ b/OpenSim/Region/Environment/Scenes/Scene.cs
@@ -0,0 +1,784 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System;
29using libsecondlife;
30using libsecondlife.Packets;
31using System.Collections.Generic;
32using System.Text;
33using System.Reflection;
34using System.IO;
35using System.Threading;
36using System.Timers;
37using OpenSim.Physics.Manager;
38using OpenSim.Framework.Interfaces;
39using OpenSim.Framework.Types;
40using OpenSim.Framework.Inventory;
41using OpenSim.Framework;
42using OpenSim.Region.Terrain;
43using OpenSim.Framework.Communications;
44using OpenSim.Region.Caches;
45using OpenSim.Region.Environment;
46using OpenSim.Framework.Servers;
47using OpenSim.Region.Enviorment.Scripting;
48using OpenSim.Region.Capabilities;
49using Caps = OpenSim.Region.Capabilities.Caps;
50
51namespace OpenSim.Region.Environment.Scenes
52{
53 public delegate bool FilterAvatarList(ScenePresence avatar);
54
55 public partial class Scene : SceneBase, ILocalStorageReceiver
56 {
57 protected System.Timers.Timer m_heartbeatTimer = new System.Timers.Timer();
58 protected Dictionary<libsecondlife.LLUUID, ScenePresence> Avatars;
59 protected Dictionary<libsecondlife.LLUUID, Primitive> Prims;
60 private PhysicsScene phyScene;
61 private float timeStep = 0.1f;
62 private Random Rand = new Random();
63 private uint _primCount = 702000;
64 private int storageCount;
65 private Mutex updateLock;
66
67 protected AuthenticateSessionsBase authenticateHandler;
68 protected RegionCommsListener regionCommsHost;
69 protected CommunicationsManager commsManager;
70
71 protected Dictionary<LLUUID,Caps> capsHandlers = new Dictionary<LLUUID, Caps>();
72 protected BaseHttpServer httpListener;
73
74 public ParcelManager parcelManager;
75 public EstateManager estateManager;
76 public EventManager eventManager;
77 public ScriptManager scriptManager;
78
79 #region Properties
80 /// <summary>
81 ///
82 /// </summary>
83 public PhysicsScene PhysScene
84 {
85 set
86 {
87 this.phyScene = value;
88 }
89 get
90 {
91 return (this.phyScene);
92 }
93 }
94
95 #endregion
96
97 #region Constructors
98 /// <summary>
99 /// Creates a new World class, and a region to go with it.
100 /// </summary>
101 /// <param name="clientThreads">Dictionary to contain client threads</param>
102 /// <param name="regionHandle">Region Handle for this region</param>
103 /// <param name="regionName">Region Name for this region</param>
104 public Scene(Dictionary<uint, IClientAPI> clientThreads, RegionInfo regInfo, AuthenticateSessionsBase authen, CommunicationsManager commsMan, AssetCache assetCach, BaseHttpServer httpServer)
105 {
106 try
107 {
108 updateLock = new Mutex(false);
109 this.authenticateHandler = authen;
110 this.commsManager = commsMan;
111 this.assetCache = assetCach;
112 m_clientThreads = clientThreads;
113 m_regInfo = regInfo;
114 m_regionHandle = m_regInfo.RegionHandle;
115 m_regionName = m_regInfo.RegionName;
116 this.m_datastore = m_regInfo.DataStore;
117 this.RegisterRegionWithComms();
118
119 parcelManager = new ParcelManager(this, this.m_regInfo);
120 estateManager = new EstateManager(this, this.m_regInfo);
121 scriptManager = new ScriptManager(this);
122 eventManager = new EventManager();
123
124 OpenSim.Framework.Console.MainLog.Instance.Verbose( "World.cs - creating new entitities instance");
125 Entities = new Dictionary<libsecondlife.LLUUID, Entity>();
126 Avatars = new Dictionary<LLUUID, ScenePresence>();
127 Prims = new Dictionary<LLUUID, Primitive>();
128
129 OpenSim.Framework.Console.MainLog.Instance.Verbose( "World.cs - creating LandMap");
130 Terrain = new TerrainEngine();
131
132 ScenePresence.LoadAnims();
133 this.httpListener = httpServer;
134
135 }
136 catch (Exception e)
137 {
138 OpenSim.Framework.Console.MainLog.Instance.Error( "World.cs: Constructor failed with exception " + e.ToString());
139 }
140 }
141 #endregion
142
143 /// <summary>
144 ///
145 /// </summary>
146 public void StartTimer()
147 {
148 m_heartbeatTimer.Enabled = true;
149 m_heartbeatTimer.Interval = 100;
150 m_heartbeatTimer.Elapsed += new ElapsedEventHandler(this.Heartbeat);
151 }
152
153
154 #region Update Methods
155
156
157 /// <summary>
158 /// Performs per-frame updates regularly
159 /// </summary>
160 /// <param name="sender"></param>
161 /// <param name="e"></param>
162 void Heartbeat(object sender, System.EventArgs e)
163 {
164 this.Update();
165 }
166
167 /// <summary>
168 /// Performs per-frame updates on the world, this should be the central world loop
169 /// </summary>
170 public override void Update()
171 {
172 updateLock.WaitOne();
173 try
174 {
175 if (this.phyScene.IsThreaded)
176 {
177 this.phyScene.GetResults();
178
179 }
180
181 foreach (libsecondlife.LLUUID UUID in Entities.Keys)
182 {
183 Entities[UUID].updateMovement();
184 }
185
186 lock (this.m_syncRoot)
187 {
188 this.phyScene.Simulate(timeStep);
189 }
190
191 foreach (libsecondlife.LLUUID UUID in Entities.Keys)
192 {
193 Entities[UUID].update();
194 }
195
196 // General purpose event manager
197 eventManager.TriggerOnFrame();
198
199 //backup world data
200 this.storageCount++;
201 if (storageCount > 1200) //set to how often you want to backup
202 {
203 this.Backup();
204 storageCount = 0;
205 }
206 }
207 catch (Exception e)
208 {
209 OpenSim.Framework.Console.MainLog.Instance.Warn("World.cs: Update() - Failed with exception " + e.ToString());
210 }
211 updateLock.ReleaseMutex();
212
213 }
214
215 /// <summary>
216 ///
217 /// </summary>
218 /// <returns></returns>
219 public bool Backup()
220 {
221 /*
222 try
223 {
224 // Terrain backup routines
225 if (Terrain.tainted > 0)
226 {
227 Terrain.tainted = 0;
228 OpenSim.Framework.Console.MainLog.Instance.Verbose( "World.cs: Backup() - Terrain tainted, saving.");
229 localStorage.SaveMap(Terrain.getHeights1D());
230 OpenSim.Framework.Console.MainLog.Instance.Verbose( "World.cs: Backup() - Terrain saved, informing Physics.");
231 lock (this.m_syncRoot)
232 {
233 phyScene.SetTerrain(Terrain.getHeights1D());
234 }
235 }
236
237 // Primitive backup routines
238 OpenSim.Framework.Console.MainLog.Instance.Verbose( "World.cs: Backup() - Backing up Primitives");
239 foreach (libsecondlife.LLUUID UUID in Entities.Keys)
240 {
241 Entities[UUID].BackUp();
242 }
243
244 //Parcel backup routines
245 ParcelData[] parcels = new ParcelData[parcelManager.parcelList.Count];
246 int i = 0;
247 foreach (OpenSim.Region.Parcel parcel in parcelManager.parcelList.Values)
248 {
249 parcels[i] = parcel.parcelData;
250 i++;
251 }
252 localStorage.SaveParcels(parcels);
253
254 // Backup successful
255 return true;
256 }
257 catch (Exception e)
258 {
259 // Backup failed
260 OpenSim.Framework.Console.MainLog.Instance.WriteLine(OpenSim.Framework.Console.LogPriority.HIGH, "World.cs: Backup() - Backup Failed with exception " + e.ToString());
261 return false;
262 }
263 */
264 return true;
265 }
266 #endregion
267
268 #region Regenerate Terrain
269
270 /// <summary>
271 /// Rebuilds the terrain using a procedural algorithm
272 /// </summary>
273 public void RegenerateTerrain()
274 {
275 try
276 {
277 Terrain.hills();
278
279 lock (this.m_syncRoot)
280 {
281 this.phyScene.SetTerrain(Terrain.getHeights1D());
282 }
283 this.localStorage.SaveMap(this.Terrain.getHeights1D());
284
285 foreach (IClientAPI client in m_clientThreads.Values)
286 {
287 this.SendLayerData(client);
288 }
289
290 foreach (libsecondlife.LLUUID UUID in Entities.Keys)
291 {
292 Entities[UUID].LandRenegerated();
293 }
294 }
295 catch (Exception e)
296 {
297 OpenSim.Framework.Console.MainLog.Instance.Warn("World.cs: RegenerateTerrain() - Failed with exception " + e.ToString());
298 }
299 }
300
301 /// <summary>
302 /// Rebuilds the terrain using a 2D float array
303 /// </summary>
304 /// <param name="newMap">256,256 float array containing heights</param>
305 public void RegenerateTerrain(float[,] newMap)
306 {
307 try
308 {
309 this.Terrain.setHeights2D(newMap);
310 lock (this.m_syncRoot)
311 {
312 this.phyScene.SetTerrain(this.Terrain.getHeights1D());
313 }
314 this.localStorage.SaveMap(this.Terrain.getHeights1D());
315
316 foreach (IClientAPI client in m_clientThreads.Values)
317 {
318 this.SendLayerData(client);
319 }
320
321 foreach (libsecondlife.LLUUID UUID in Entities.Keys)
322 {
323 Entities[UUID].LandRenegerated();
324 }
325 }
326 catch (Exception e)
327 {
328 OpenSim.Framework.Console.MainLog.Instance.Warn("World.cs: RegenerateTerrain() - Failed with exception " + e.ToString());
329 }
330 }
331
332 /// <summary>
333 /// Rebuilds the terrain assuming changes occured at a specified point[?]
334 /// </summary>
335 /// <param name="changes">???</param>
336 /// <param name="pointx">???</param>
337 /// <param name="pointy">???</param>
338 public void RegenerateTerrain(bool changes, int pointx, int pointy)
339 {
340 try
341 {
342 if (changes)
343 {
344 /* Dont save here, rely on tainting system instead */
345
346 foreach (IClientAPI client in m_clientThreads.Values)
347 {
348 this.SendLayerData(pointx, pointy, client);
349 }
350 }
351 }
352 catch (Exception e)
353 {
354 OpenSim.Framework.Console.MainLog.Instance.Warn("World.cs: RegenerateTerrain() - Failed with exception " + e.ToString());
355 }
356 }
357
358 #endregion
359
360 #region Load Terrain
361 /// <summary>
362 /// Loads the World heightmap
363 /// </summary>
364 ///
365 public override void LoadWorldMap()
366 {
367 try
368 {
369 float[] map = this.localStorage.LoadWorld();
370 if (map == null)
371 {
372 if (string.IsNullOrEmpty(this.m_regInfo.estateSettings.terrainFile))
373 {
374 Console.WriteLine("No default terrain, procedurally generating...");
375 this.Terrain.hills();
376
377 this.localStorage.SaveMap(this.Terrain.getHeights1D());
378 }
379 else
380 {
381 try
382 {
383 this.Terrain.loadFromFileF32(this.m_regInfo.estateSettings.terrainFile);
384 this.Terrain *= this.m_regInfo.estateSettings.terrainMultiplier;
385 }
386 catch
387 {
388 Console.WriteLine("Unable to load default terrain, procedurally generating instead...");
389 Terrain.hills();
390 }
391 this.localStorage.SaveMap(this.Terrain.getHeights1D());
392 }
393 }
394 else
395 {
396 this.Terrain.setHeights1D(map);
397 }
398
399 CreateTerrainTexture();
400
401 }
402 catch (Exception e)
403 {
404 OpenSim.Framework.Console.MainLog.Instance.Warn("World.cs: LoadWorldMap() - Failed with exception " + e.ToString());
405 }
406 }
407
408 /// <summary>
409 ///
410 /// </summary>
411 private void CreateTerrainTexture()
412 {
413 //create a texture asset of the terrain
414 byte[] data = this.Terrain.exportJpegImage("defaultstripe.png");
415 this.m_regInfo.estateSettings.terrainImageID = LLUUID.Random();
416 AssetBase asset = new AssetBase();
417 asset.FullID = this.m_regInfo.estateSettings.terrainImageID;
418 asset.Data = data;
419 asset.Name = "terrainImage";
420 asset.Type = 0;
421 this.assetCache.AddAsset(asset);
422 }
423 #endregion
424
425 #region Primitives Methods
426
427
428 /// <summary>
429 /// Loads the World's objects
430 /// </summary>
431 public void LoadPrimsFromStorage()
432 {
433 try
434 {
435 OpenSim.Framework.Console.MainLog.Instance.Verbose( "World.cs: LoadPrimsFromStorage() - Loading primitives");
436 this.localStorage.LoadPrimitives(this);
437 }
438 catch (Exception e)
439 {
440 OpenSim.Framework.Console.MainLog.Instance.Warn("World.cs: LoadPrimsFromStorage() - Failed with exception " + e.ToString());
441 }
442 }
443
444 /// <summary>
445 /// Loads a specific object from storage
446 /// </summary>
447 /// <param name="prim">The object to load</param>
448 public void PrimFromStorage(PrimData prim)
449 {
450
451 }
452
453 /// <summary>
454 ///
455 /// </summary>
456 /// <param name="addPacket"></param>
457 /// <param name="agentClient"></param>
458 public void AddNewPrim(Packet addPacket, IClientAPI agentClient)
459 {
460 AddNewPrim((ObjectAddPacket)addPacket, agentClient.AgentId);
461 }
462
463 /// <summary>
464 ///
465 /// </summary>
466 /// <param name="addPacket"></param>
467 /// <param name="ownerID"></param>
468 public void AddNewPrim(ObjectAddPacket addPacket, LLUUID ownerID)
469 {
470 try
471 {
472 Primitive prim = new Primitive(m_regionHandle, this, addPacket, ownerID, this._primCount);
473
474 this.Entities.Add(prim.uuid, prim);
475 this._primCount++;
476
477 // Trigger event for listeners
478 eventManager.TriggerOnNewPrimitive(prim);
479 }
480 catch (Exception e)
481 {
482 OpenSim.Framework.Console.MainLog.Instance.Warn("World.cs: AddNewPrim() - Failed with exception " + e.ToString());
483 }
484 }
485
486 #endregion
487
488 #region Add/Remove Avatar Methods
489
490 /// <summary>
491 ///
492 /// </summary>
493 /// <param name="remoteClient"></param
494 /// <param name="agentID"></param>
495 /// <param name="child"></param>
496 public override void AddNewClient(IClientAPI remoteClient, LLUUID agentID, bool child)
497 {
498 remoteClient.OnRegionHandShakeReply += this.SendLayerData;
499 //remoteClient.OnRequestWearables += new GenericCall(this.GetInitialPrims);
500 remoteClient.OnChatFromViewer += this.SimChat;
501 remoteClient.OnRequestWearables += this.InformClientOfNeighbours;
502 remoteClient.OnAddPrim += this.AddNewPrim;
503 remoteClient.OnUpdatePrimPosition += this.UpdatePrimPosition;
504 remoteClient.OnRequestMapBlocks += this.RequestMapBlocks;
505 remoteClient.OnTeleportLocationRequest += this.RequestTeleportLocation;
506 //remoteClient.OnObjectSelect += this.SelectPrim;
507 remoteClient.OnGrapUpdate += this.MoveObject;
508 remoteClient.OnNameFromUUIDRequest += this.commsManager.HandleUUIDNameRequest;
509
510 /* remoteClient.OnParcelPropertiesRequest += new ParcelPropertiesRequest(parcelManager.handleParcelPropertiesRequest);
511 remoteClient.OnParcelDivideRequest += new ParcelDivideRequest(parcelManager.handleParcelDivideRequest);
512 remoteClient.OnParcelJoinRequest += new ParcelJoinRequest(parcelManager.handleParcelJoinRequest);
513 remoteClient.OnParcelPropertiesUpdateRequest += new ParcelPropertiesUpdateRequest(parcelManager.handleParcelPropertiesUpdateRequest);
514 remoteClient.OnEstateOwnerMessage += new EstateOwnerMessageRequest(estateManager.handleEstateOwnerMessage);
515 */
516
517 ScenePresence newAvatar = null;
518 try
519 {
520
521 OpenSim.Framework.Console.MainLog.Instance.Verbose( "World.cs:AddViewerAgent() - Creating new avatar for remote viewer agent");
522 newAvatar = new ScenePresence(remoteClient, this, this.m_regInfo);
523 OpenSim.Framework.Console.MainLog.Instance.Verbose( "World.cs:AddViewerAgent() - Adding new avatar to world");
524 OpenSim.Framework.Console.MainLog.Instance.Verbose( "World.cs:AddViewerAgent() - Starting RegionHandshake ");
525
526 //newAvatar.SendRegionHandshake();
527 this.estateManager.sendRegionHandshake(remoteClient);
528
529 PhysicsVector pVec = new PhysicsVector(newAvatar.Pos.X, newAvatar.Pos.Y, newAvatar.Pos.Z);
530 lock (this.m_syncRoot)
531 {
532 newAvatar.PhysActor = this.phyScene.AddAvatar(pVec);
533 }
534
535 lock (Entities)
536 {
537 if (!Entities.ContainsKey(agentID))
538 {
539 this.Entities.Add(agentID, newAvatar);
540 }
541 else
542 {
543 Entities[agentID] = newAvatar;
544 }
545 }
546 lock (Avatars)
547 {
548 if (Avatars.ContainsKey(agentID))
549 {
550 Avatars[agentID] = newAvatar;
551 }
552 else
553 {
554 this.Avatars.Add(agentID, newAvatar);
555 }
556 }
557 }
558 catch (Exception e)
559 {
560 OpenSim.Framework.Console.MainLog.Instance.Warn("World.cs: AddViewerAgent() - Failed with exception " + e.ToString());
561 }
562 return;
563 }
564
565
566
567 /// <summary>
568 ///
569 /// </summary>
570 /// <param name="agentID"></param>
571 public override void RemoveClient(LLUUID agentID)
572 {
573 eventManager.TriggerOnRemovePresence(agentID);
574
575 return;
576 }
577 #endregion
578
579 #region Request Avatars List Methods
580 //The idea is to have a group of method that return a list of avatars meeting some requirement
581 // ie it could be all Avatars within a certain range of the calling prim/avatar.
582
583 /// <summary>
584 /// Request a List of all Avatars in this World
585 /// </summary>
586 /// <returns></returns>
587 public List<ScenePresence> RequestAvatarList()
588 {
589 List<ScenePresence> result = new List<ScenePresence>();
590
591 foreach (ScenePresence avatar in Avatars.Values)
592 {
593 result.Add(avatar);
594 }
595
596 return result;
597 }
598
599 /// <summary>
600 /// Request a filtered list of Avatars in this World
601 /// </summary>
602 /// <returns></returns>
603 public List<ScenePresence> RequestAvatarList(FilterAvatarList filter)
604 {
605 List<ScenePresence> result = new List<ScenePresence>();
606
607 foreach (ScenePresence avatar in Avatars.Values)
608 {
609 if (filter(avatar))
610 {
611 result.Add(avatar);
612 }
613 }
614
615 return result;
616 }
617
618 /// <summary>
619 /// Request a Avatar by UUID
620 /// </summary>
621 /// <param name="avatarID"></param>
622 /// <returns></returns>
623 public ScenePresence RequestAvatar(LLUUID avatarID)
624 {
625 if (this.Avatars.ContainsKey(avatarID))
626 {
627 return Avatars[avatarID];
628 }
629 return null;
630 }
631 #endregion
632
633
634 #region RegionCommsHost
635
636 /// <summary>
637 ///
638 /// </summary>
639 public void RegisterRegionWithComms()
640 {
641 GridInfo gridSettings = new GridInfo();
642 this.regionCommsHost = this.commsManager.GridServer.RegisterRegion(this.m_regInfo,gridSettings);
643 if (this.regionCommsHost != null)
644 {
645 this.regionCommsHost.OnExpectUser += new ExpectUserDelegate(this.NewUserConnection);
646 this.regionCommsHost.OnAvatarCrossingIntoRegion += new AgentCrossing(this.AgentCrossing);
647 }
648 }
649
650 /// <summary>
651 ///
652 /// </summary>
653 /// <param name="regionHandle"></param>
654 /// <param name="agent"></param>
655 public void NewUserConnection(ulong regionHandle, AgentCircuitData agent)
656 {
657 // Console.WriteLine("World.cs - add new user connection");
658 //should just check that its meant for this region
659 if (regionHandle == this.m_regInfo.RegionHandle)
660 {
661 if (agent.CapsPath != "")
662 {
663 //Console.WriteLine("new user, so creating caps handler for it");
664 Caps cap = new Caps(this.assetCache, httpListener, this.m_regInfo.CommsIPListenAddr, 9000, agent.CapsPath, agent.AgentID);
665 cap.RegisterHandlers();
666 this.capsHandlers.Add(agent.AgentID, cap);
667 }
668 this.authenticateHandler.AddNewCircuit(agent.circuitcode, agent);
669 }
670 }
671
672 public void AgentCrossing(ulong regionHandle, libsecondlife.LLUUID agentID, libsecondlife.LLVector3 position)
673 {
674 if (regionHandle == this.m_regInfo.RegionHandle)
675 {
676 if (this.Avatars.ContainsKey(agentID))
677 {
678 this.Avatars[agentID].MakeAvatar(position);
679 }
680 }
681 }
682
683 /// <summary>
684 ///
685 /// </summary>
686 public void InformClientOfNeighbours(IClientAPI remoteClient)
687 {
688 // Console.WriteLine("informing client of neighbouring regions");
689 List<RegionInfo> neighbours = this.commsManager.GridServer.RequestNeighbours(this.m_regInfo);
690
691 //Console.WriteLine("we have " + neighbours.Count + " neighbouring regions");
692 if (neighbours != null)
693 {
694 for (int i = 0; i < neighbours.Count; i++)
695 {
696 // Console.WriteLine("sending neighbours data");
697 AgentCircuitData agent = remoteClient.RequestClientInfo();
698 agent.BaseFolder = LLUUID.Zero;
699 agent.InventoryFolder = LLUUID.Zero;
700 agent.startpos = new LLVector3(128, 128, 70);
701 agent.child = true;
702 this.commsManager.InterRegion.InformRegionOfChildAgent(neighbours[i].RegionHandle, agent);
703 remoteClient.InformClientOfNeighbour(neighbours[i].RegionHandle, System.Net.IPAddress.Parse(neighbours[i].CommsIPListenAddr), (ushort)neighbours[i].CommsIPListenPort);
704 //this.capsHandlers[remoteClient.AgentId].CreateEstablishAgentComms("", System.Net.IPAddress.Parse(neighbours[i].CommsIPListenAddr) + ":" + neighbours[i].CommsIPListenPort);
705 }
706 }
707 }
708
709 /// <summary>
710 ///
711 /// </summary>
712 /// <param name="regionHandle"></param>
713 /// <returns></returns>
714 public RegionInfo RequestNeighbouringRegionInfo(ulong regionHandle)
715 {
716 return this.commsManager.GridServer.RequestNeighbourInfo(regionHandle);
717 }
718
719 /// <summary>
720 ///
721 /// </summary>
722 /// <param name="minX"></param>
723 /// <param name="minY"></param>
724 /// <param name="maxX"></param>
725 /// <param name="maxY"></param>
726 public void RequestMapBlocks(IClientAPI remoteClient, int minX, int minY, int maxX, int maxY)
727 {
728 List<MapBlockData> mapBlocks;
729 mapBlocks = this.commsManager.GridServer.RequestNeighbourMapBlocks(minX, minY, maxX, maxY);
730 remoteClient.SendMapBlock(mapBlocks);
731 }
732
733 /// <summary>
734 ///
735 /// </summary>
736 /// <param name="remoteClient"></param>
737 /// <param name="RegionHandle"></param>
738 /// <param name="position"></param>
739 /// <param name="lookAt"></param>
740 /// <param name="flags"></param>
741 public void RequestTeleportLocation(IClientAPI remoteClient, ulong regionHandle, LLVector3 position, LLVector3 lookAt, uint flags)
742 {
743 if (regionHandle == this.m_regionHandle)
744 {
745 if (this.Avatars.ContainsKey(remoteClient.AgentId))
746 {
747 remoteClient.SendTeleportLocationStart();
748 remoteClient.SendLocalTeleport(position, lookAt, flags);
749 this.Avatars[remoteClient.AgentId].Teleport(position);
750 }
751 }
752 else
753 {
754 RegionInfo reg = this.RequestNeighbouringRegionInfo(regionHandle);
755 if (reg != null)
756 {
757 remoteClient.SendTeleportLocationStart();
758 AgentCircuitData agent = remoteClient.RequestClientInfo();
759 agent.BaseFolder = LLUUID.Zero;
760 agent.InventoryFolder = LLUUID.Zero;
761 agent.startpos = new LLVector3(128, 128, 70);
762 agent.child = true;
763 this.commsManager.InterRegion.InformRegionOfChildAgent(regionHandle, agent);
764 this.commsManager.InterRegion.ExpectAvatarCrossing(regionHandle, remoteClient.AgentId, position);
765 remoteClient.SendRegionTeleport(regionHandle, 13, reg.CommsIPListenAddr, (ushort)reg.CommsIPListenPort, 4, (1 << 4));
766 }
767 //remoteClient.SendTeleportCancel();
768 }
769 }
770
771 /// <summary>
772 ///
773 /// </summary>
774 /// <param name="regionhandle"></param>
775 /// <param name="agentID"></param>
776 /// <param name="position"></param>
777 public bool InformNeighbourOfCrossing(ulong regionhandle, LLUUID agentID, LLVector3 position)
778 {
779 return this.commsManager.InterRegion.ExpectAvatarCrossing(regionhandle, agentID, position);
780 }
781
782 #endregion
783 }
784}
diff --git a/OpenSim/Region/Environment/Scenes/SceneBase.cs b/OpenSim/Region/Environment/Scenes/SceneBase.cs
new file mode 100644
index 0000000..50d3b82
--- /dev/null
+++ b/OpenSim/Region/Environment/Scenes/SceneBase.cs
@@ -0,0 +1,200 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System;
29using libsecondlife;
30using libsecondlife.Packets;
31using System.Collections.Generic;
32using System.Text;
33using System.Reflection;
34using System.IO;
35using System.Threading;
36using OpenSim.Physics.Manager;
37using OpenSim.Framework.Interfaces;
38using OpenSim.Framework.Types;
39using OpenSim.Framework.Inventory;
40using OpenSim.Region.Terrain;
41using OpenSim.Region.Caches;
42
43namespace OpenSim.Region.Environment.Scenes
44{
45 public abstract class SceneBase : IWorld
46 {
47 public Dictionary<libsecondlife.LLUUID, Entity> Entities;
48 protected Dictionary<uint, IClientAPI> m_clientThreads;
49 protected ulong m_regionHandle;
50 protected string m_regionName;
51 protected RegionInfo m_regInfo;
52
53 public TerrainEngine Terrain;
54
55 public string m_datastore;
56 public ILocalStorage localStorage;
57
58 protected object m_syncRoot = new object();
59 private uint m_nextLocalId = 8880000;
60 protected AssetCache assetCache;
61
62 #region Update Methods
63 /// <summary>
64 /// Normally called once every frame/tick to let the world preform anything required (like running the physics simulation)
65 /// </summary>
66 public abstract void Update();
67
68 #endregion
69
70 #region Terrain Methods
71
72 /// <summary>
73 /// Loads the World heightmap
74 /// </summary>
75 public abstract void LoadWorldMap();
76
77 /// <summary>
78 /// Loads a new storage subsystem from a named library
79 /// </summary>
80 /// <param name="dllName">Storage Library</param>
81 /// <returns>Successful or not</returns>
82 public bool LoadStorageDLL(string dllName)
83 {
84 try
85 {
86 Assembly pluginAssembly = Assembly.LoadFrom(dllName);
87 ILocalStorage store = null;
88
89 foreach (Type pluginType in pluginAssembly.GetTypes())
90 {
91 if (pluginType.IsPublic)
92 {
93 if (!pluginType.IsAbstract)
94 {
95 Type typeInterface = pluginType.GetInterface("ILocalStorage", true);
96
97 if (typeInterface != null)
98 {
99 ILocalStorage plug = (ILocalStorage)Activator.CreateInstance(pluginAssembly.GetType(pluginType.ToString()));
100 store = plug;
101
102 store.Initialise(this.m_datastore);
103 break;
104 }
105
106 typeInterface = null;
107 }
108 }
109 }
110 pluginAssembly = null;
111 this.localStorage = store;
112 return (store == null);
113 }
114 catch (Exception e)
115 {
116 OpenSim.Framework.Console.MainLog.Instance.Warn("World.cs: LoadStorageDLL() - Failed with exception " + e.ToString());
117 return false;
118 }
119 }
120
121
122 /// <summary>
123 /// Send the region heightmap to the client
124 /// </summary>
125 /// <param name="RemoteClient">Client to send to</param>
126 public virtual void SendLayerData(IClientAPI RemoteClient)
127 {
128 RemoteClient.SendLayerData(Terrain.getHeights1D());
129 }
130
131 /// <summary>
132 /// Sends a specified patch to a client
133 /// </summary>
134 /// <param name="px">Patch coordinate (x) 0..16</param>
135 /// <param name="py">Patch coordinate (y) 0..16</param>
136 /// <param name="RemoteClient">The client to send to</param>
137 public virtual void SendLayerData(int px, int py, IClientAPI RemoteClient)
138 {
139 RemoteClient.SendLayerData(px, py, Terrain.getHeights1D());
140 }
141
142 #endregion
143
144 #region Add/Remove Agent/Avatar
145 /// <summary>
146 ///
147 /// </summary>
148 /// <param name="remoteClient"></param>
149 /// <param name="agentID"></param>
150 /// <param name="child"></param>
151 public abstract void AddNewClient(IClientAPI remoteClient, LLUUID agentID, bool child);
152
153 /// <summary>
154 ///
155 /// </summary>
156 /// <param name="agentID"></param>
157 public abstract void RemoveClient(LLUUID agentID);
158
159 #endregion
160
161 /// <summary>
162 ///
163 /// </summary>
164 /// <returns></returns>
165 public virtual RegionInfo RegionInfo
166 {
167 get { return this.m_regInfo; }
168 }
169
170 public object SyncRoot
171 {
172 get { return m_syncRoot; }
173 }
174
175 public uint NextLocalId
176 {
177 get { return m_nextLocalId++; }
178 }
179
180 #region Shutdown
181 /// <summary>
182 /// Tidy before shutdown
183 /// </summary>
184 public virtual void Close()
185 {
186 try
187 {
188 this.localStorage.ShutDown();
189 }
190 catch (Exception e)
191 {
192 OpenSim.Framework.Console.MainLog.Instance.WriteLine(OpenSim.Framework.Console.LogPriority.HIGH, "World.cs: Close() - Failed with exception " + e.ToString());
193 }
194 }
195
196 #endregion
197
198
199 }
200}
diff --git a/OpenSim/Region/Environment/Scenes/SceneEvents.cs b/OpenSim/Region/Environment/Scenes/SceneEvents.cs
new file mode 100644
index 0000000..fa1bacb
--- /dev/null
+++ b/OpenSim/Region/Environment/Scenes/SceneEvents.cs
@@ -0,0 +1,52 @@
1using System;
2using System.Collections.Generic;
3using System.Text;
4
5namespace OpenSim.Region.Environment.Scenes
6{
7 /// <summary>
8 /// A class for triggering remote scene events.
9 /// </summary>
10 public class EventManager
11 {
12 public delegate void OnFrameDelegate();
13 public event OnFrameDelegate OnFrame;
14
15 public delegate void OnNewPresenceDelegate(ScenePresence presence);
16 public event OnNewPresenceDelegate OnNewPresence;
17
18 public delegate void OnNewPrimitiveDelegate(Primitive prim);
19 public event OnNewPrimitiveDelegate OnNewPrimitive;
20
21 public delegate void OnRemovePresenceDelegate(libsecondlife.LLUUID uuid);
22 public event OnRemovePresenceDelegate OnRemovePresence;
23
24 public void TriggerOnFrame()
25 {
26 if (OnFrame != null)
27 {
28 OnFrame();
29 }
30 }
31
32 public void TriggerOnNewPrimitive(Primitive prim)
33 {
34 if (OnNewPrimitive != null)
35 OnNewPrimitive(prim);
36 }
37
38 public void TriggerOnNewPresence(ScenePresence presence)
39 {
40 if (OnNewPresence != null)
41 OnNewPresence(presence);
42 }
43
44 public void TriggerOnRemovePresence(libsecondlife.LLUUID uuid)
45 {
46 if (OnRemovePresence != null)
47 {
48 OnRemovePresence(uuid);
49 }
50 }
51 }
52}
diff --git a/OpenSim/Region/Environment/Scenes/SceneObject.cs b/OpenSim/Region/Environment/Scenes/SceneObject.cs
new file mode 100644
index 0000000..88fb160
--- /dev/null
+++ b/OpenSim/Region/Environment/Scenes/SceneObject.cs
@@ -0,0 +1,128 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System;
29using System.Collections.Generic;
30using System.Text;
31using libsecondlife;
32using libsecondlife.Packets;
33using OpenSim.Framework.Interfaces;
34using OpenSim.Physics.Manager;
35using OpenSim.Framework.Types;
36using OpenSim.Framework.Inventory;
37
38namespace OpenSim.Region.Environment.Scenes
39{
40 public class SceneObject : Entity
41 {
42 private LLUUID rootUUID;
43 //private Dictionary<LLUUID, Primitive> ChildPrimitives = new Dictionary<LLUUID, Primitive>();
44 protected Primitive rootPrimitive;
45 private Scene m_world;
46 protected ulong regionHandle;
47
48 /// <summary>
49 ///
50 /// </summary>
51 public SceneObject()
52 {
53
54 }
55
56 /// <summary>
57 ///
58 /// </summary>
59 /// <param name="addPacket"></param>
60 /// <param name="agentID"></param>
61 /// <param name="localID"></param>
62 public void CreateFromPacket(ObjectAddPacket addPacket, LLUUID agentID, uint localID)
63 {
64 this.rootPrimitive = new Primitive( this.regionHandle, this.m_world, addPacket, agentID, localID);
65 }
66
67 /// <summary>
68 ///
69 /// </summary>
70 /// <param name="data"></param>
71 public void CreateFromBytes(byte[] data)
72 {
73
74 }
75
76 /// <summary>
77 ///
78 /// </summary>
79 public override void update()
80 {
81
82 }
83
84 /// <summary>
85 ///
86 /// </summary>
87 public override void BackUp()
88 {
89
90 }
91
92 /// <summary>
93 ///
94 /// </summary>
95 /// <param name="client"></param>
96 public void GetProperites(IClientAPI client)
97 {
98 //needs changing
99 ObjectPropertiesPacket proper = new ObjectPropertiesPacket();
100 proper.ObjectData = new ObjectPropertiesPacket.ObjectDataBlock[1];
101 proper.ObjectData[0] = new ObjectPropertiesPacket.ObjectDataBlock();
102 proper.ObjectData[0].ItemID = LLUUID.Zero;
103 proper.ObjectData[0].CreationDate = (ulong)this.rootPrimitive.primData.CreationDate;
104 proper.ObjectData[0].CreatorID = this.rootPrimitive.primData.OwnerID;
105 proper.ObjectData[0].FolderID = LLUUID.Zero;
106 proper.ObjectData[0].FromTaskID = LLUUID.Zero;
107 proper.ObjectData[0].GroupID = LLUUID.Zero;
108 proper.ObjectData[0].InventorySerial = 0;
109 proper.ObjectData[0].LastOwnerID = LLUUID.Zero;
110 proper.ObjectData[0].ObjectID = this.uuid;
111 proper.ObjectData[0].OwnerID = this.rootPrimitive.primData.OwnerID;
112 proper.ObjectData[0].TouchName = new byte[0];
113 proper.ObjectData[0].TextureID = new byte[0];
114 proper.ObjectData[0].SitName = new byte[0];
115 proper.ObjectData[0].Name = new byte[0];
116 proper.ObjectData[0].Description = new byte[0];
117 proper.ObjectData[0].OwnerMask = this.rootPrimitive.primData.OwnerMask;
118 proper.ObjectData[0].NextOwnerMask = this.rootPrimitive.primData.NextOwnerMask;
119 proper.ObjectData[0].GroupMask = this.rootPrimitive.primData.GroupMask;
120 proper.ObjectData[0].EveryoneMask = this.rootPrimitive.primData.EveryoneMask;
121 proper.ObjectData[0].BaseMask = this.rootPrimitive.primData.BaseMask;
122
123 client.OutPacket(proper);
124
125 }
126
127 }
128}
diff --git a/OpenSim/Region/Environment/Scenes/ScenePresence.Animations.cs b/OpenSim/Region/Environment/Scenes/ScenePresence.Animations.cs
new file mode 100644
index 0000000..2caabc2
--- /dev/null
+++ b/OpenSim/Region/Environment/Scenes/ScenePresence.Animations.cs
@@ -0,0 +1,76 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System;
29using System.Collections.Generic;
30using System.Text;
31using libsecondlife;
32using System.Xml;
33
34namespace OpenSim.Region.Environment.Scenes
35{
36 partial class ScenePresence
37 {
38 public class AvatarAnimations
39 {
40
41 public Dictionary<string, LLUUID> AnimsLLUUID = new Dictionary<string, LLUUID>();
42 public Dictionary<LLUUID, string> AnimsNames = new Dictionary<LLUUID, string>();
43
44 public AvatarAnimations()
45 {
46 }
47
48 public void LoadAnims()
49 {
50 //OpenSim.Framework.Console.MainLog.Instance.Verbose("Avatar.cs:LoadAnims() - Loading avatar animations");
51 XmlTextReader reader = new XmlTextReader("data/avataranimations.xml");
52
53 XmlDocument doc = new XmlDocument();
54 doc.Load(reader);
55 foreach (XmlNode nod in doc.DocumentElement.ChildNodes)
56 {
57
58 if (nod.Attributes["name"] != null)
59 {
60 AnimsLLUUID.Add(nod.Attributes["name"].Value, nod.InnerText);
61 }
62
63 }
64
65 reader.Close();
66
67 // OpenSim.Framework.Console.MainLog.Instance.Verbose("Loaded " + AnimsLLUUID.Count.ToString() + " animation(s)");
68
69 foreach (KeyValuePair<string, LLUUID> kp in OpenSim.Region.Environment.Scenes.ScenePresence.Animations.AnimsLLUUID)
70 {
71 AnimsNames.Add(kp.Value, kp.Key);
72 }
73 }
74 }
75 }
76}
diff --git a/OpenSim/Region/Environment/Scenes/ScenePresence.Body.cs b/OpenSim/Region/Environment/Scenes/ScenePresence.Body.cs
new file mode 100644
index 0000000..2c81d2a
--- /dev/null
+++ b/OpenSim/Region/Environment/Scenes/ScenePresence.Body.cs
@@ -0,0 +1,90 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System;
29using System.Collections.Generic;
30using System.Text;
31using libsecondlife;
32using libsecondlife.Packets;
33using OpenSim.Physics.Manager;
34using OpenSim.Framework.Interfaces;
35using OpenSim.Framework.Types;
36
37namespace OpenSim.Region.Environment.Scenes
38{
39 partial class ScenePresence
40 {
41 public class Avatar : IScenePresenceBody
42 {
43 public Avatar()
44 {
45
46 }
47
48 public void processMovement(IClientAPI remoteClient, uint flags, LLQuaternion bodyRotation)
49 {
50 }
51
52 public void SetAppearance(byte[] texture, AgentSetAppearancePacket.VisualParamBlock[] visualParam)
53 {
54 }
55
56 public void SendOurAppearance(IClientAPI OurClient)
57 {
58 }
59
60 public void SendAppearanceToOtherAgent(ScenePresence avatarInfo)
61 {
62 }
63 }
64
65 public class ChildAgent : IScenePresenceBody //is a ghost
66 {
67 public ChildAgent()
68 {
69
70 }
71
72 public void processMovement(IClientAPI remoteClient, uint flags, LLQuaternion bodyRotation)
73 {
74 }
75
76 public void SetAppearance(byte[] texture, AgentSetAppearancePacket.VisualParamBlock[] visualParam)
77 {
78 }
79
80 public void SendOurAppearance(IClientAPI OurClient)
81 {
82 }
83
84 public void SendAppearanceToOtherAgent(ScenePresence avatarInfo)
85 {
86 }
87 }
88 }
89
90}
diff --git a/OpenSim/Region/Environment/Scenes/ScenePresence.cs b/OpenSim/Region/Environment/Scenes/ScenePresence.cs
new file mode 100644
index 0000000..b90004e
--- /dev/null
+++ b/OpenSim/Region/Environment/Scenes/ScenePresence.cs
@@ -0,0 +1,549 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System;
29using System.Collections.Generic;
30using System.IO;
31using System.Text;
32using libsecondlife;
33using libsecondlife.Packets;
34using OpenSim.Physics.Manager;
35using OpenSim.Framework.Inventory;
36using OpenSim.Framework.Interfaces;
37using OpenSim.Framework.Types;
38using Axiom.MathLib;
39
40namespace OpenSim.Region.Environment.Scenes
41{
42 public partial class ScenePresence : Entity
43 {
44 public static bool PhysicsEngineFlying = false;
45 public static AvatarAnimations Animations;
46 public static byte[] DefaultTexture;
47 public string firstname;
48 public string lastname;
49 public IClientAPI ControllingClient;
50 public LLUUID current_anim;
51 public int anim_seq;
52 private bool updateflag = false;
53 private byte movementflag = 0;
54 private List<NewForce> forcesList = new List<NewForce>();
55 private short _updateCount = 0;
56 private Axiom.MathLib.Quaternion bodyRot;
57 private LLObject.TextureEntry avatarAppearanceTexture = null;
58 private byte[] visualParams;
59 private AvatarWearable[] Wearables;
60 private LLVector3 positionLastFrame = new LLVector3(0, 0, 0);
61 private ulong m_regionHandle;
62 private bool childAgent = false;
63 private bool newForce = false;
64 private bool newAvatar = false;
65 private IScenePresenceBody m_body;
66
67 protected RegionInfo m_regionInfo;
68
69 private Vector3[] Dir_Vectors = new Vector3[6];
70 private enum Dir_ControlFlags
71 {
72 DIR_CONTROL_FLAG_FOWARD = MainAvatar.ControlFlags.AGENT_CONTROL_AT_POS,
73 DIR_CONTROL_FLAG_BACK = MainAvatar.ControlFlags.AGENT_CONTROL_AT_NEG,
74 DIR_CONTROL_FLAG_LEFT = MainAvatar.ControlFlags.AGENT_CONTROL_LEFT_POS,
75 DIR_CONTROL_FLAG_RIGHT = MainAvatar.ControlFlags.AGENT_CONTROL_LEFT_NEG,
76 DIR_CONTROL_FLAG_UP = MainAvatar.ControlFlags.AGENT_CONTROL_UP_POS,
77 DIR_CONTROL_FLAG_DOWN = MainAvatar.ControlFlags.AGENT_CONTROL_UP_NEG
78 }
79
80 #region Properties
81 /// <summary>
82 ///
83 /// </summary>
84 public PhysicsActor PhysActor
85 {
86 set
87 {
88 this._physActor = value;
89 }
90 get
91 {
92 return _physActor;
93 }
94 }
95 #endregion
96
97 #region Constructor(s)
98 /// <summary>
99 ///
100 /// </summary>
101 /// <param name="theClient"></param>
102 /// <param name="world"></param>
103 /// <param name="clientThreads"></param>
104 /// <param name="regionDat"></param>
105 public ScenePresence(IClientAPI theClient, Scene world, RegionInfo reginfo)
106 {
107
108 m_world = world;
109 this.uuid = theClient.AgentId;
110
111 m_regionInfo = reginfo;
112 m_regionHandle = reginfo.RegionHandle;
113 OpenSim.Framework.Console.MainLog.Instance.Verbose("Avatar.cs ");
114 ControllingClient = theClient;
115 this.firstname = ControllingClient.FirstName;
116 this.lastname = ControllingClient.LastName;
117 m_localId = m_world.NextLocalId;
118 Pos = ControllingClient.StartPos;
119 visualParams = new byte[218];
120 for (int i = 0; i < 218; i++)
121 {
122 visualParams[i] = 100;
123 }
124
125 Wearables = AvatarWearable.DefaultWearables;
126
127 this.avatarAppearanceTexture = new LLObject.TextureEntry(new LLUUID("00000000-0000-0000-5005-000000000005"));
128
129 //register for events
130 ControllingClient.OnRequestWearables += this.SendOurAppearance;
131 //ControllingClient.OnSetAppearance += new SetAppearance(this.SetAppearance);
132 ControllingClient.OnCompleteMovementToRegion += this.CompleteMovement;
133 ControllingClient.OnCompleteMovementToRegion += this.SendInitialData;
134 ControllingClient.OnAgentUpdate += this.HandleAgentUpdate;
135 // ControllingClient.OnStartAnim += new StartAnim(this.SendAnimPack);
136 // ControllingClient.OnChildAgentStatus += new StatusChange(this.ChildStatusChange);
137 //ControllingClient.OnStopMovement += new GenericCall2(this.StopMovement);
138
139 Dir_Vectors[0] = new Vector3(1, 0, 0); //FOWARD
140 Dir_Vectors[1] = new Vector3(-1, 0, 0); //BACK
141 Dir_Vectors[2] = new Vector3(0, 1, 0); //LEFT
142 Dir_Vectors[3] = new Vector3(0, -1, 0); //RIGHT
143 Dir_Vectors[4] = new Vector3(0, 0, 1); //UP
144 Dir_Vectors[5] = new Vector3(0, 0, -1); //DOWN
145
146 }
147 #endregion
148
149 #region Status Methods
150 /// <summary>
151 /// Not Used, most likely can be deleted
152 /// </summary>
153 /// <param name="status"></param>
154 public void ChildStatusChange(bool status)
155 {
156 this.childAgent = status;
157
158 if (this.childAgent == true)
159 {
160 this.Velocity = new LLVector3(0, 0, 0);
161 this.Pos = new LLVector3(128, 128, 70);
162
163 }
164 }
165
166 /// <summary>
167 ///
168 /// </summary>
169 /// <param name="pos"></param>
170 public void MakeAvatar(LLVector3 pos)
171 {
172 //this.childAvatar = false;
173 this.Pos = pos;
174 this.newAvatar = true;
175 this.childAgent = false;
176 }
177
178 protected void MakeChildAgent()
179 {
180 this.Velocity = new LLVector3(0, 0, 0);
181 this.Pos = new LLVector3(128, 128, 70);
182 this.childAgent = true;
183 }
184
185 /// <summary>
186 ///
187 /// </summary>
188 /// <param name="pos"></param>
189 public void Teleport(LLVector3 pos)
190 {
191 this.Pos = pos;
192 this.SendTerseUpdateToALLClients();
193 }
194
195 /// <summary>
196 ///
197 /// </summary>
198 public void StopMovement()
199 {
200
201 }
202 #endregion
203
204 #region Event Handlers
205 /// <summary>
206 ///
207 /// </summary>
208 /// <param name="texture"></param>
209 /// <param name="visualParam"></param>
210 public void SetAppearance(byte[] texture, AgentSetAppearancePacket.VisualParamBlock[] visualParam)
211 {
212
213 }
214
215 /// <summary>
216 /// Complete Avatar's movement into the region
217 /// </summary>
218 public void CompleteMovement()
219 {
220 LLVector3 look = this.Velocity;
221 if ((look.X == 0) && (look.Y == 0) && (look.Z == 0))
222 {
223 look = new LLVector3(0.99f, 0.042f, 0);
224 }
225 this.ControllingClient.MoveAgentIntoRegion(m_regionInfo, Pos, look);
226 if (this.childAgent)
227 {
228 this.childAgent = false;
229 }
230 }
231
232 /// <summary>
233 ///
234 /// </summary>
235 /// <param name="pack"></param>
236 public void HandleAgentUpdate(IClientAPI remoteClient, uint flags, LLQuaternion bodyRotation)
237 {
238 int i = 0;
239 bool update_movementflag = false;
240 bool update_rotation = false;
241 bool DCFlagKeyPressed = false;
242 Vector3 agent_control_v3 = new Vector3(0, 0, 0);
243 Axiom.MathLib.Quaternion q = new Axiom.MathLib.Quaternion(bodyRotation.W, bodyRotation.X, bodyRotation.Y, bodyRotation.Z);
244
245 this.PhysActor.Flying = ((flags & (uint)MainAvatar.ControlFlags.AGENT_CONTROL_FLY) != 0);
246
247 if (q != this.bodyRot)
248 {
249 this.bodyRot = q;
250 update_rotation = true;
251 }
252 foreach (Dir_ControlFlags DCF in Enum.GetValues(typeof(Dir_ControlFlags)))
253 {
254 if ((flags & (uint)DCF) != 0)
255 {
256 DCFlagKeyPressed = true;
257 agent_control_v3 += Dir_Vectors[i];
258 if ((movementflag & (uint)DCF) == 0)
259 {
260 movementflag += (byte)(uint)DCF;
261 update_movementflag = true;
262 }
263 }
264 else
265 {
266 if ((movementflag & (uint)DCF) != 0)
267 {
268 movementflag -= (byte)(uint)DCF;
269 update_movementflag = true;
270 }
271 }
272 i++;
273 }
274 if ((update_movementflag) || (update_rotation && DCFlagKeyPressed))
275 {
276 this.AddNewMovement(agent_control_v3, q);
277 }
278
279 }
280
281 protected void AddNewMovement(Axiom.MathLib.Vector3 vec, Axiom.MathLib.Quaternion rotation)
282 {
283 NewForce newVelocity = new NewForce();
284 Axiom.MathLib.Vector3 direc = rotation * vec;
285 direc.Normalize();
286
287 direc = direc * ((0.03f) * 128f);
288 if (this._physActor.Flying)
289 direc *= 4;
290
291 newVelocity.X = direc.x;
292 newVelocity.Y = direc.y;
293 newVelocity.Z = direc.z;
294 this.forcesList.Add(newVelocity);
295 }
296
297 #endregion
298
299 #region Overridden Methods
300 /// <summary>
301 ///
302 /// </summary>
303 public override void LandRenegerated()
304 {
305
306 }
307
308 /// <summary>
309 ///
310 /// </summary>
311 public override void update()
312 {
313 if (this.childAgent == false)
314 {
315 if (this.newForce)
316 {
317 this.SendTerseUpdateToALLClients();
318 _updateCount = 0;
319 }
320 else if (movementflag != 0)
321 {
322 _updateCount++;
323 if (_updateCount > 3)
324 {
325 this.SendTerseUpdateToALLClients();
326 _updateCount = 0;
327 }
328 }
329
330 this.CheckForBorderCrossing();
331 }
332 }
333 #endregion
334
335 #region Update Client(s)
336 /// <summary>
337 ///
338 /// </summary>
339 /// <param name="RemoteClient"></param>
340 public void SendTerseUpdateToClient(IClientAPI RemoteClient)
341 {
342 LLVector3 pos = this.Pos;
343 LLVector3 vel = this.Velocity;
344 RemoteClient.SendAvatarTerseUpdate(this.m_regionHandle, 64096, this.LocalId, new LLVector3(pos.X, pos.Y, pos.Z), new LLVector3(vel.X, vel.Y, vel.Z));
345 }
346
347 /// <summary>
348 ///
349 /// </summary>
350 public void SendTerseUpdateToALLClients()
351 {
352 List<ScenePresence> avatars = this.m_world.RequestAvatarList();
353 for (int i = 0; i < avatars.Count; i++)
354 {
355 this.SendTerseUpdateToClient(avatars[i].ControllingClient);
356 }
357 }
358
359 /// <summary>
360 ///
361 /// </summary>
362 /// <param name="remoteAvatar"></param>
363 public void SendFullUpdateToOtherClient(ScenePresence remoteAvatar)
364 {
365 remoteAvatar.ControllingClient.SendAvatarData(m_regionInfo.RegionHandle, this.firstname, this.lastname, this.uuid, this.LocalId, this.Pos, DefaultTexture);
366 }
367
368 /// <summary>
369 ///
370 /// </summary>
371 public void SendInitialData()
372 {
373 this.ControllingClient.SendAvatarData(m_regionInfo.RegionHandle, this.firstname, this.lastname, this.uuid, this.LocalId, this.Pos, DefaultTexture);
374 if (this.newAvatar)
375 {
376 this.m_world.InformClientOfNeighbours(this.ControllingClient);
377 this.newAvatar = false;
378 }
379 }
380
381 /// <summary>
382 ///
383 /// </summary>
384 /// <param name="OurClient"></param>
385 public void SendOurAppearance(IClientAPI OurClient)
386 {
387 this.ControllingClient.SendWearables(this.Wearables);
388 }
389
390 /// <summary>
391 ///
392 /// </summary>
393 /// <param name="avatarInfo"></param>
394 public void SendAppearanceToOtherAgent(ScenePresence avatarInfo)
395 {
396
397 }
398
399 /// <summary>
400 ///
401 /// </summary>
402 /// <param name="animID"></param>
403 /// <param name="seq"></param>
404 public void SendAnimPack(LLUUID animID, int seq)
405 {
406
407
408 }
409
410 /// <summary>
411 ///
412 /// </summary>
413 public void SendAnimPack()
414 {
415
416 }
417 #endregion
418
419 #region Border Crossing Methods
420 /// <summary>
421 ///
422 /// </summary>
423 protected void CheckForBorderCrossing()
424 {
425 LLVector3 pos2 = this.Pos;
426 LLVector3 vel = this.Velocity;
427
428 float timeStep = 0.2f;
429 pos2.X = pos2.X + (vel.X * timeStep);
430 pos2.Y = pos2.Y + (vel.Y * timeStep);
431 pos2.Z = pos2.Z + (vel.Z * timeStep);
432
433 if ((pos2.X < 0) || (pos2.X > 256))
434 {
435 this.CrossToNewRegion();
436 }
437
438 if ((pos2.Y < 0) || (pos2.Y > 256))
439 {
440 this.CrossToNewRegion();
441 }
442 }
443
444 /// <summary>
445 ///
446 /// </summary>
447 protected void CrossToNewRegion()
448 {
449 LLVector3 pos = this.Pos;
450 LLVector3 newpos = new LLVector3(pos.X, pos.Y, pos.Z);
451 uint neighbourx = this.m_regionInfo.RegionLocX;
452 uint neighboury = this.m_regionInfo.RegionLocY;
453
454 if (pos.X < 2)
455 {
456 neighbourx -= 1;
457 newpos.X = 254;
458 }
459 if (pos.X > 253)
460 {
461 neighbourx += 1;
462 newpos.X = 1;
463 }
464 if (pos.Y < 2)
465 {
466 neighboury -= 1;
467 newpos.Y = 254;
468 }
469 if (pos.Y > 253)
470 {
471 neighboury += 1;
472 newpos.Y = 1;
473 }
474
475 LLVector3 vel = this.velocity;
476 ulong neighbourHandle = Helpers.UIntsToLong((uint)(neighbourx * 256), (uint)(neighboury * 256));
477 RegionInfo neighbourRegion = this.m_world.RequestNeighbouringRegionInfo(neighbourHandle);
478 if (neighbourRegion != null)
479 {
480 bool res = this.m_world.InformNeighbourOfCrossing(neighbourHandle, this.ControllingClient.AgentId, newpos);
481 if (res)
482 {
483 this.MakeChildAgent();
484 this.ControllingClient.CrossRegion(neighbourHandle, newpos, vel, System.Net.IPAddress.Parse(neighbourRegion.CommsIPListenAddr), (ushort)neighbourRegion.CommsIPListenPort);
485 }
486 }
487 }
488 #endregion
489
490 /// <summary>
491 ///
492 /// </summary>
493 public static void LoadAnims()
494 {
495
496 }
497
498 /// <summary>
499 ///
500 /// </summary>
501 public override void updateMovement()
502 {
503 newForce = false;
504 lock (this.forcesList)
505 {
506 if (this.forcesList.Count > 0)
507 {
508 for (int i = 0; i < this.forcesList.Count; i++)
509 {
510 NewForce force = this.forcesList[i];
511
512 this.updateflag = true;
513 this.Velocity = new LLVector3(force.X, force.Y, force.Z);
514 this.newForce = true;
515 }
516 for (int i = 0; i < this.forcesList.Count; i++)
517 {
518 this.forcesList.RemoveAt(0);
519 }
520 }
521 }
522 }
523
524 public static void LoadTextureFile(string name)
525 {
526 FileInfo fInfo = new FileInfo(name);
527 long numBytes = fInfo.Length;
528 FileStream fStream = new FileStream(name, FileMode.Open, FileAccess.Read);
529 BinaryReader br = new BinaryReader(fStream);
530 byte[] data1 = br.ReadBytes((int)numBytes);
531 br.Close();
532 fStream.Close();
533 DefaultTexture = data1;
534 }
535
536 public class NewForce
537 {
538 public float X;
539 public float Y;
540 public float Z;
541
542 public NewForce()
543 {
544
545 }
546 }
547 }
548
549}
diff --git a/OpenSim/Region/Environment/Scenes/scripting/Engines/CSharpScriptEngine.cs b/OpenSim/Region/Environment/Scenes/scripting/Engines/CSharpScriptEngine.cs
new file mode 100644
index 0000000..a232b65
--- /dev/null
+++ b/OpenSim/Region/Environment/Scenes/scripting/Engines/CSharpScriptEngine.cs
@@ -0,0 +1,104 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System;
29using System.Collections.Generic;
30using System.Text;
31
32// Compilation stuff
33using System.CodeDom;
34using System.CodeDom.Compiler;
35using Microsoft.CSharp;
36
37namespace OpenSim.Region.Enviorment.Scripting
38{
39 public class CSharpScriptEngine : IScriptCompiler
40 {
41 public string FileExt()
42 {
43 return ".cs";
44 }
45
46 private Dictionary<string,IScript> LoadDotNetScript(ICodeCompiler compiler, string filename)
47 {
48 CompilerParameters compilerParams = new CompilerParameters();
49 CompilerResults compilerResults;
50 compilerParams.GenerateExecutable = false;
51 compilerParams.GenerateInMemory = true;
52 compilerParams.IncludeDebugInformation = false;
53 compilerParams.ReferencedAssemblies.Add("OpenSim.Region.dll");
54 compilerParams.ReferencedAssemblies.Add("OpenSim.Framework.dll");
55 compilerParams.ReferencedAssemblies.Add("libsecondlife.dll");
56 compilerParams.ReferencedAssemblies.Add("System.dll");
57
58 compilerResults = compiler.CompileAssemblyFromFile(compilerParams, filename);
59
60 if (compilerResults.Errors.Count > 0)
61 {
62 OpenSim.Framework.Console.MainLog.Instance.Error("Compile errors");
63 foreach (CompilerError error in compilerResults.Errors)
64 {
65 OpenSim.Framework.Console.MainLog.Instance.Error(error.Line.ToString() + ": " + error.ErrorText.ToString());
66 }
67 }
68 else
69 {
70 Dictionary<string,IScript> scripts = new Dictionary<string,IScript>();
71
72 foreach (Type pluginType in compilerResults.CompiledAssembly.GetExportedTypes())
73 {
74 Type testInterface = pluginType.GetInterface("IScript", true);
75
76 if (testInterface != null)
77 {
78 IScript script = (IScript)compilerResults.CompiledAssembly.CreateInstance(pluginType.ToString());
79
80 string scriptName = "C#/" + script.getName();
81 Console.WriteLine("Script: " + scriptName + " loaded.");
82
83 if (!scripts.ContainsKey(scriptName))
84 {
85 scripts.Add(scriptName, script);
86 }
87 else
88 {
89 scripts[scriptName] = script;
90 }
91 }
92 }
93 return scripts;
94 }
95 return null;
96 }
97
98 public Dictionary<string,IScript> compile(string filename)
99 {
100 CSharpCodeProvider csharpProvider = new CSharpCodeProvider();
101 return LoadDotNetScript(csharpProvider.CreateCompiler(), filename);
102 }
103 }
104}
diff --git a/OpenSim/Region/Environment/Scenes/scripting/Engines/JScriptEngine.cs b/OpenSim/Region/Environment/Scenes/scripting/Engines/JScriptEngine.cs
new file mode 100644
index 0000000..2d44223
--- /dev/null
+++ b/OpenSim/Region/Environment/Scenes/scripting/Engines/JScriptEngine.cs
@@ -0,0 +1,104 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System;
29using System.Collections.Generic;
30using System.Text;
31
32// Compilation stuff
33using System.CodeDom;
34using System.CodeDom.Compiler;
35using Microsoft.JScript;
36
37namespace OpenSim.Region.Enviorment.Scripting
38{
39 public class JScriptEngine : IScriptCompiler
40 {
41 public string FileExt()
42 {
43 return ".js";
44 }
45
46 private Dictionary<string, IScript> LoadDotNetScript(ICodeCompiler compiler, string filename)
47 {
48 CompilerParameters compilerParams = new CompilerParameters();
49 CompilerResults compilerResults;
50 compilerParams.GenerateExecutable = false;
51 compilerParams.GenerateInMemory = true;
52 compilerParams.IncludeDebugInformation = false;
53 compilerParams.ReferencedAssemblies.Add("OpenSim.Region.dll");
54 compilerParams.ReferencedAssemblies.Add("OpenSim.Framework.dll");
55 compilerParams.ReferencedAssemblies.Add("libsecondlife.dll");
56 compilerParams.ReferencedAssemblies.Add("System.dll");
57
58 compilerResults = compiler.CompileAssemblyFromFile(compilerParams, filename);
59
60 if (compilerResults.Errors.Count > 0)
61 {
62 OpenSim.Framework.Console.MainLog.Instance.Error("Compile errors");
63 foreach (CompilerError error in compilerResults.Errors)
64 {
65 OpenSim.Framework.Console.MainLog.Instance.Error(error.Line.ToString() + ": " + error.ErrorText.ToString());
66 }
67 }
68 else
69 {
70 Dictionary<string, IScript> scripts = new Dictionary<string, IScript>();
71
72 foreach (Type pluginType in compilerResults.CompiledAssembly.GetExportedTypes())
73 {
74 Type testInterface = pluginType.GetInterface("IScript", true);
75
76 if (testInterface != null)
77 {
78 IScript script = (IScript)compilerResults.CompiledAssembly.CreateInstance(pluginType.ToString());
79
80 string scriptName = "JS.NET/" + script.getName();
81 Console.WriteLine("Script: " + scriptName + " loaded.");
82
83 if (!scripts.ContainsKey(scriptName))
84 {
85 scripts.Add(scriptName, script);
86 }
87 else
88 {
89 scripts[scriptName] = script;
90 }
91 }
92 }
93 return scripts;
94 }
95 return null;
96 }
97
98 public Dictionary<string, IScript> compile(string filename)
99 {
100 JScriptCodeProvider jscriptProvider = new JScriptCodeProvider();
101 return LoadDotNetScript(jscriptProvider.CreateCompiler(), filename);
102 }
103 }
104}
diff --git a/OpenSim/Region/Environment/Scenes/scripting/Script.cs b/OpenSim/Region/Environment/Scenes/scripting/Script.cs
new file mode 100644
index 0000000..1e64675
--- /dev/null
+++ b/OpenSim/Region/Environment/Scenes/scripting/Script.cs
@@ -0,0 +1,71 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System;
29using System.Collections.Generic;
30using System.Text;
31
32using OpenSim.Framework.Console;
33using OpenSim.Framework;
34using OpenSim.Region.Environment;
35using OpenSim.Region.Environment.Scenes;
36
37namespace OpenSim.Region.Enviorment.Scripting
38{
39 public interface IScript
40 {
41 void Initialise(ScriptInfo scriptInfo);
42 string getName();
43 }
44
45 public class TestScript : IScript
46 {
47 ScriptInfo script;
48
49 public string getName()
50 {
51 return "TestScript 0.1";
52 }
53
54 public void Initialise(ScriptInfo scriptInfo)
55 {
56 script = scriptInfo;
57 script.events.OnFrame += new OpenSim.Region.Environment.Scenes.EventManager.OnFrameDelegate(events_OnFrame);
58 script.events.OnNewPresence += new EventManager.OnNewPresenceDelegate(events_OnNewPresence);
59 }
60
61 void events_OnNewPresence(ScenePresence presence)
62 {
63 script.logger.Verbose("Hello " + presence.firstname.ToString() + "!");
64 }
65
66 void events_OnFrame()
67 {
68 //script.logger.Verbose("Hello World!");
69 }
70 }
71}
diff --git a/OpenSim/Region/Environment/Scenes/scripting/ScriptInfo.cs b/OpenSim/Region/Environment/Scenes/scripting/ScriptInfo.cs
new file mode 100644
index 0000000..522a572
--- /dev/null
+++ b/OpenSim/Region/Environment/Scenes/scripting/ScriptInfo.cs
@@ -0,0 +1,58 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System;
29using System.Collections.Generic;
30using System.Text;
31
32using OpenSim.Region.Environment.Scenes;
33using OpenSim.Framework.Console;
34
35namespace OpenSim.Region.Enviorment.Scripting
36{
37 /// <summary>
38 /// Class which provides access to the world
39 /// </summary>
40 public class ScriptInfo
41 {
42 // Reference to world.eventsManager provided for convenience
43 public EventManager events;
44
45 // The main world
46 public Scene world;
47
48 // The console
49 public LogBase logger;
50
51 public ScriptInfo(Scene scene)
52 {
53 world = scene;
54 events = world.eventManager;
55 logger = OpenSim.Framework.Console.MainLog.Instance;
56 }
57 }
58}
diff --git a/OpenSim/Region/Environment/Scenes/scripting/ScriptManager.cs b/OpenSim/Region/Environment/Scenes/scripting/ScriptManager.cs
new file mode 100644
index 0000000..eb1c1d9
--- /dev/null
+++ b/OpenSim/Region/Environment/Scenes/scripting/ScriptManager.cs
@@ -0,0 +1,96 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System;
29using System.Collections.Generic;
30using System.Text;
31
32namespace OpenSim.Region.Enviorment.Scripting
33{
34 public class ScriptManager
35 {
36 List<IScript> scripts = new List<IScript>();
37 OpenSim.Region.Environment.Scenes.Scene scene;
38 Dictionary<string, IScriptCompiler> compilers = new Dictionary<string, IScriptCompiler>();
39
40 private void LoadFromCompiler(Dictionary<string, IScript> compiledscripts)
41 {
42 foreach (KeyValuePair<string, IScript> script in compiledscripts)
43 {
44 ScriptInfo scriptInfo = new ScriptInfo(scene); // Since each script could potentially corrupt their access with a stray assignment, making a new one for each script.
45 OpenSim.Framework.Console.MainLog.Instance.Verbose("Loading " + script.Key);
46 script.Value.Initialise(scriptInfo);
47 scripts.Add(script.Value);
48 }
49 OpenSim.Framework.Console.MainLog.Instance.Verbose("Finished loading " + compiledscripts.Count.ToString() + " script(s)");
50 }
51
52 public ScriptManager(OpenSim.Region.Environment.Scenes.Scene world)
53 {
54 scene = world;
55
56 // Default Engines
57 CSharpScriptEngine csharpCompiler = new CSharpScriptEngine();
58 compilers.Add(csharpCompiler.FileExt(),csharpCompiler);
59
60 JScriptEngine jscriptCompiler = new JScriptEngine();
61 compilers.Add(jscriptCompiler.FileExt(), jscriptCompiler);
62 }
63
64 public void Compile(string filename)
65 {
66 foreach (KeyValuePair<string, IScriptCompiler> compiler in compilers)
67 {
68 if (filename.EndsWith(compiler.Key))
69 {
70 LoadFromCompiler(compiler.Value.compile(filename));
71 break;
72 }
73 }
74 }
75
76 public void RunScriptCmd(string[] args)
77 {
78 switch (args[0])
79 {
80 case "load":
81 Compile(args[1]);
82 break;
83
84 default:
85 OpenSim.Framework.Console.MainLog.Instance.Error("Unknown script command");
86 break;
87 }
88 }
89 }
90
91 interface IScriptCompiler
92 {
93 Dictionary<string,IScript> compile(string filename);
94 string FileExt();
95 }
96}