clockwerk-opensim – Blame information for rev 1

Subversion Repositories:
Rev:
Rev Author Line No. Line
1 vero 1 /*
2 * Copyright (c) Contributors, http://opensimulator.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 OpenSimulator 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  
28 using System;
29 using System.Collections;
30 using System.Collections.Generic;
31 using System.Reflection;
32 using OpenMetaverse;
33 using OpenSim.Framework;
34 using OpenSim.Region.Framework.Scenes;
35 using OpenSim.Region.Framework.Interfaces;
36 using OpenSim.Region.ScriptEngine.Shared;
37 using OpenSim.Region.ScriptEngine.Interfaces;
38 using log4net;
39  
40 namespace OpenSim.Region.ScriptEngine.XEngine
41 {
42 /// <summary>
43 /// Prepares events so they can be directly executed upon a script by EventQueueManager, then queues it.
44 /// </summary>
45 public class EventManager
46 {
47 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
48  
49 private XEngine myScriptEngine;
50  
51 public EventManager(XEngine _ScriptEngine)
52 {
53 myScriptEngine = _ScriptEngine;
54  
55 // m_log.Info("[XEngine] Hooking up to server events");
56 myScriptEngine.World.EventManager.OnAttach += attach;
57 myScriptEngine.World.EventManager.OnObjectGrab += touch_start;
58 myScriptEngine.World.EventManager.OnObjectGrabbing += touch;
59 myScriptEngine.World.EventManager.OnObjectDeGrab += touch_end;
60 myScriptEngine.World.EventManager.OnScriptChangedEvent += changed;
61 myScriptEngine.World.EventManager.OnScriptAtTargetEvent += at_target;
62 myScriptEngine.World.EventManager.OnScriptNotAtTargetEvent += not_at_target;
63 myScriptEngine.World.EventManager.OnScriptAtRotTargetEvent += at_rot_target;
64 myScriptEngine.World.EventManager.OnScriptNotAtRotTargetEvent += not_at_rot_target;
65 myScriptEngine.World.EventManager.OnScriptMovingStartEvent += moving_start;
66 myScriptEngine.World.EventManager.OnScriptMovingEndEvent += moving_end;
67 myScriptEngine.World.EventManager.OnScriptControlEvent += control;
68 myScriptEngine.World.EventManager.OnScriptColliderStart += collision_start;
69 myScriptEngine.World.EventManager.OnScriptColliding += collision;
70 myScriptEngine.World.EventManager.OnScriptCollidingEnd += collision_end;
71 myScriptEngine.World.EventManager.OnScriptLandColliderStart += land_collision_start;
72 myScriptEngine.World.EventManager.OnScriptLandColliding += land_collision;
73 myScriptEngine.World.EventManager.OnScriptLandColliderEnd += land_collision_end;
74 IMoneyModule money = myScriptEngine.World.RequestModuleInterface<IMoneyModule>();
75 if (money != null)
76 {
77 money.OnObjectPaid+=HandleObjectPaid;
78 }
79 }
80  
81 /// <summary>
82 /// When an object gets paid by an avatar and generates the paid event,
83 /// this will pipe it to the script engine
84 /// </summary>
85 /// <param name="objectID">Object ID that got paid</param>
86 /// <param name="agentID">Agent Id that did the paying</param>
87 /// <param name="amount">Amount paid</param>
88 private void HandleObjectPaid(UUID objectID, UUID agentID,
89 int amount)
90 {
91 // Since this is an event from a shared module, all scenes will
92 // get it. But only one has the object in question. The others
93 // just ignore it.
94 //
95 SceneObjectPart part =
96 myScriptEngine.World.GetSceneObjectPart(objectID);
97  
98 if (part == null)
99 return;
100  
101 if ((part.ScriptEvents & scriptEvents.money) == 0)
102 part = part.ParentGroup.RootPart;
103  
104 m_log.Debug("Paid: " + objectID + " from " + agentID + ", amount " + amount);
105  
106 // part = part.ParentGroup.RootPart;
107 money(part.LocalId, agentID, amount);
108 }
109  
110 /// <summary>
111 /// Handles piping the proper stuff to The script engine for touching
112 /// Including DetectedParams
113 /// </summary>
114 /// <param name="localID"></param>
115 /// <param name="originalID"></param>
116 /// <param name="offsetPos"></param>
117 /// <param name="remoteClient"></param>
118 /// <param name="surfaceArgs"></param>
119 public void touch_start(uint localID, uint originalID, Vector3 offsetPos,
120 IClientAPI remoteClient, SurfaceTouchEventArgs surfaceArgs)
121 {
122 // Add to queue for all scripts in ObjectID object
123 DetectParams[] det = new DetectParams[1];
124 det[0] = new DetectParams();
125 det[0].Key = remoteClient.AgentId;
126 det[0].Populate(myScriptEngine.World);
127  
128 if (originalID == 0)
129 {
130 SceneObjectPart part = myScriptEngine.World.GetSceneObjectPart(localID);
131 if (part == null)
132 return;
133  
134 det[0].LinkNum = part.LinkNum;
135 }
136 else
137 {
138 SceneObjectPart originalPart = myScriptEngine.World.GetSceneObjectPart(originalID);
139 det[0].LinkNum = originalPart.LinkNum;
140 }
141  
142 if (surfaceArgs != null)
143 {
144 det[0].SurfaceTouchArgs = surfaceArgs;
145 }
146  
147 myScriptEngine.PostObjectEvent(localID, new EventParams(
148 "touch_start", new Object[] { new LSL_Types.LSLInteger(1) },
149 det));
150 }
151  
152 public void touch(uint localID, uint originalID, Vector3 offsetPos,
153 IClientAPI remoteClient, SurfaceTouchEventArgs surfaceArgs)
154 {
155 // Add to queue for all scripts in ObjectID object
156 DetectParams[] det = new DetectParams[1];
157 det[0] = new DetectParams();
158 det[0].Key = remoteClient.AgentId;
159 det[0].Populate(myScriptEngine.World);
160 det[0].OffsetPos = offsetPos;
161  
162 if (originalID == 0)
163 {
164 SceneObjectPart part = myScriptEngine.World.GetSceneObjectPart(localID);
165 if (part == null)
166 return;
167  
168 det[0].LinkNum = part.LinkNum;
169 }
170 else
171 {
172 SceneObjectPart originalPart = myScriptEngine.World.GetSceneObjectPart(originalID);
173 det[0].LinkNum = originalPart.LinkNum;
174 }
175 if (surfaceArgs != null)
176 {
177 det[0].SurfaceTouchArgs = surfaceArgs;
178 }
179  
180 myScriptEngine.PostObjectEvent(localID, new EventParams(
181 "touch", new Object[] { new LSL_Types.LSLInteger(1) },
182 det));
183 }
184  
185 public void touch_end(uint localID, uint originalID, IClientAPI remoteClient,
186 SurfaceTouchEventArgs surfaceArgs)
187 {
188 // Add to queue for all scripts in ObjectID object
189 DetectParams[] det = new DetectParams[1];
190 det[0] = new DetectParams();
191 det[0].Key = remoteClient.AgentId;
192 det[0].Populate(myScriptEngine.World);
193  
194 if (originalID == 0)
195 {
196 SceneObjectPart part = myScriptEngine.World.GetSceneObjectPart(localID);
197 if (part == null)
198 return;
199  
200 det[0].LinkNum = part.LinkNum;
201 }
202 else
203 {
204 SceneObjectPart originalPart = myScriptEngine.World.GetSceneObjectPart(originalID);
205 det[0].LinkNum = originalPart.LinkNum;
206 }
207  
208 if (surfaceArgs != null)
209 {
210 det[0].SurfaceTouchArgs = surfaceArgs;
211 }
212  
213 myScriptEngine.PostObjectEvent(localID, new EventParams(
214 "touch_end", new Object[] { new LSL_Types.LSLInteger(1) },
215 det));
216 }
217  
218 public void changed(uint localID, uint change)
219 {
220 // Add to queue for all scripts in localID, Object pass change.
221 myScriptEngine.PostObjectEvent(localID, new EventParams(
222 "changed",new object[] { new LSL_Types.LSLInteger(change) },
223 new DetectParams[0]));
224 }
225  
226 // state_entry: not processed here
227 // state_exit: not processed here
228  
229 public void money(uint localID, UUID agentID, int amount)
230 {
231 myScriptEngine.PostObjectEvent(localID, new EventParams(
232 "money", new object[] {
233 new LSL_Types.LSLString(agentID.ToString()),
234 new LSL_Types.LSLInteger(amount) },
235 new DetectParams[0]));
236 }
237  
238 public void collision_start(uint localID, ColliderArgs col)
239 {
240 // Add to queue for all scripts in ObjectID object
241 List<DetectParams> det = new List<DetectParams>();
242  
243 foreach (DetectedObject detobj in col.Colliders)
244 {
245 DetectParams d = new DetectParams();
246 d.Key =detobj.keyUUID;
247 d.Populate(myScriptEngine.World);
248 det.Add(d);
249 }
250  
251 if (det.Count > 0)
252 myScriptEngine.PostObjectEvent(localID, new EventParams(
253 "collision_start",
254 new Object[] { new LSL_Types.LSLInteger(det.Count) },
255 det.ToArray()));
256 }
257  
258 public void collision(uint localID, ColliderArgs col)
259 {
260 // Add to queue for all scripts in ObjectID object
261 List<DetectParams> det = new List<DetectParams>();
262  
263 foreach (DetectedObject detobj in col.Colliders)
264 {
265 DetectParams d = new DetectParams();
266 d.Key =detobj.keyUUID;
267 d.Populate(myScriptEngine.World);
268 det.Add(d);
269 }
270  
271 if (det.Count > 0)
272 myScriptEngine.PostObjectEvent(localID, new EventParams(
273 "collision", new Object[] { new LSL_Types.LSLInteger(det.Count) },
274 det.ToArray()));
275 }
276  
277 public void collision_end(uint localID, ColliderArgs col)
278 {
279 // Add to queue for all scripts in ObjectID object
280 List<DetectParams> det = new List<DetectParams>();
281  
282 foreach (DetectedObject detobj in col.Colliders)
283 {
284 DetectParams d = new DetectParams();
285 d.Key =detobj.keyUUID;
286 d.Populate(myScriptEngine.World);
287 det.Add(d);
288 }
289  
290 if (det.Count > 0)
291 myScriptEngine.PostObjectEvent(localID, new EventParams(
292 "collision_end",
293 new Object[] { new LSL_Types.LSLInteger(det.Count) },
294 det.ToArray()));
295 }
296  
297 public void land_collision_start(uint localID, ColliderArgs col)
298 {
299 List<DetectParams> det = new List<DetectParams>();
300  
301 foreach (DetectedObject detobj in col.Colliders)
302 {
303 DetectParams d = new DetectParams();
304 d.Position = detobj.posVector;
305 d.Populate(myScriptEngine.World);
306 det.Add(d);
307 myScriptEngine.PostObjectEvent(localID, new EventParams(
308 "land_collision_start",
309 new Object[] { new LSL_Types.Vector3(d.Position) },
310 det.ToArray()));
311 }
312  
313 }
314  
315 public void land_collision(uint localID, ColliderArgs col)
316 {
317 List<DetectParams> det = new List<DetectParams>();
318  
319 foreach (DetectedObject detobj in col.Colliders)
320 {
321 DetectParams d = new DetectParams();
322 d.Position = detobj.posVector;
323 d.Populate(myScriptEngine.World);
324 det.Add(d);
325 myScriptEngine.PostObjectEvent(localID, new EventParams(
326 "land_collision",
327 new Object[] { new LSL_Types.Vector3(d.Position) },
328 det.ToArray()));
329 }
330 }
331  
332 public void land_collision_end(uint localID, ColliderArgs col)
333 {
334 List<DetectParams> det = new List<DetectParams>();
335  
336 foreach (DetectedObject detobj in col.Colliders)
337 {
338 DetectParams d = new DetectParams();
339 d.Position = detobj.posVector;
340 d.Populate(myScriptEngine.World);
341 det.Add(d);
342 myScriptEngine.PostObjectEvent(localID, new EventParams(
343 "land_collision_end",
344 new Object[] { new LSL_Types.Vector3(d.Position) },
345 det.ToArray()));
346 }
347 }
348  
349 // timer: not handled here
350 // listen: not handled here
351  
352 public void control(UUID itemID, UUID agentID, uint held, uint change)
353 {
354 myScriptEngine.PostScriptEvent(itemID, new EventParams(
355 "control",new object[] {
356 new LSL_Types.LSLString(agentID.ToString()),
357 new LSL_Types.LSLInteger(held),
358 new LSL_Types.LSLInteger(change)},
359 new DetectParams[0]));
360 }
361  
362 public void email(uint localID, UUID itemID, string timeSent,
363 string address, string subject, string message, int numLeft)
364 {
365 myScriptEngine.PostObjectEvent(localID, new EventParams(
366 "email",new object[] {
367 new LSL_Types.LSLString(timeSent),
368 new LSL_Types.LSLString(address),
369 new LSL_Types.LSLString(subject),
370 new LSL_Types.LSLString(message),
371 new LSL_Types.LSLInteger(numLeft)},
372 new DetectParams[0]));
373 }
374  
375 public void at_target(uint localID, uint handle, Vector3 targetpos,
376 Vector3 atpos)
377 {
378 myScriptEngine.PostObjectEvent(localID, new EventParams(
379 "at_target", new object[] {
380 new LSL_Types.LSLInteger(handle),
381 new LSL_Types.Vector3(targetpos),
382 new LSL_Types.Vector3(atpos) },
383 new DetectParams[0]));
384 }
385  
386 public void not_at_target(uint localID)
387 {
388 myScriptEngine.PostObjectEvent(localID, new EventParams(
389 "not_at_target",new object[0],
390 new DetectParams[0]));
391 }
392  
393 public void at_rot_target(uint localID, uint handle, Quaternion targetrot,
394 Quaternion atrot)
395 {
396 myScriptEngine.PostObjectEvent(localID, new EventParams(
397 "at_rot_target", new object[] {
398 new LSL_Types.LSLInteger(handle),
399 new LSL_Types.Quaternion(targetrot),
400 new LSL_Types.Quaternion(atrot) },
401 new DetectParams[0]));
402 }
403  
404 public void not_at_rot_target(uint localID)
405 {
406 myScriptEngine.PostObjectEvent(localID, new EventParams(
407 "not_at_rot_target",new object[0],
408 new DetectParams[0]));
409 }
410  
411 // run_time_permissions: not handled here
412  
413 public void attach(uint localID, UUID itemID, UUID avatar)
414 {
415 myScriptEngine.PostObjectEvent(localID, new EventParams(
416 "attach",new object[] {
417 new LSL_Types.LSLString(avatar.ToString()) },
418 new DetectParams[0]));
419 }
420  
421 // dataserver: not handled here
422 // link_message: not handled here
423  
424 public void moving_start(uint localID)
425 {
426 myScriptEngine.PostObjectEvent(localID, new EventParams(
427 "moving_start",new object[0],
428 new DetectParams[0]));
429 }
430  
431 public void moving_end(uint localID)
432 {
433 myScriptEngine.PostObjectEvent(localID, new EventParams(
434 "moving_end",new object[0],
435 new DetectParams[0]));
436 }
437  
438 // object_rez: not handled here
439 // remote_data: not handled here
440 // http_response: not handled here
441 }
442 }