diff options
Diffstat (limited to 'OpenSim/Region/ScriptEngine/Shared/Api/Implementation')
-rw-r--r-- | OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | 166 |
1 files changed, 153 insertions, 13 deletions
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index fd6d64c..c8bce60 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | |||
@@ -10309,51 +10309,191 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
10309 | return rq.ToString(); | 10309 | return rq.ToString(); |
10310 | } | 10310 | } |
10311 | 10311 | ||
10312 | public LSL_List llCastRay(LSL_Vector start, LSL_Vector end, LSL_List options) | ||
10313 | { | ||
10314 | m_host.AddScriptLPS(1); | ||
10315 | |||
10316 | Vector3 dir = new Vector3((float)(end-start).x, (float)(end-start).y, (float)(end-start).z); | ||
10317 | Vector3 startvector = new Vector3((float)start.x, (float)start.y, (float)start.z); | ||
10318 | Vector3 endvector = new Vector3((float)end.x, (float)end.y, (float)end.z); | ||
10319 | |||
10320 | int count = 0; | ||
10321 | // int detectPhantom = 0; | ||
10322 | int dataFlags = 0; | ||
10323 | int rejectTypes = 0; | ||
10324 | |||
10325 | for (int i = 0; i < options.Length; i += 2) | ||
10326 | { | ||
10327 | if (options.GetLSLIntegerItem(i) == ScriptBaseClass.RC_MAX_HITS) | ||
10328 | { | ||
10329 | count = options.GetLSLIntegerItem(i + 1); | ||
10330 | } | ||
10331 | // else if (options.GetLSLIntegerItem(i) == ScriptBaseClass.RC_DETECT_PHANTOM) | ||
10332 | // { | ||
10333 | // detectPhantom = options.GetLSLIntegerItem(i + 1); | ||
10334 | // } | ||
10335 | else if (options.GetLSLIntegerItem(i) == ScriptBaseClass.RC_DATA_FLAGS) | ||
10336 | { | ||
10337 | dataFlags = options.GetLSLIntegerItem(i + 1); | ||
10338 | } | ||
10339 | else if (options.GetLSLIntegerItem(i) == ScriptBaseClass.RC_REJECT_TYPES) | ||
10340 | { | ||
10341 | rejectTypes = options.GetLSLIntegerItem(i + 1); | ||
10342 | } | ||
10343 | } | ||
10344 | |||
10345 | LSL_List list = new LSL_List(); | ||
10346 | List<ContactResult> results = World.PhysicsScene.RaycastWorld(startvector, dir, dir.Length(), count); | ||
10347 | |||
10348 | double distance = Util.GetDistanceTo(startvector, endvector); | ||
10349 | |||
10350 | if (distance == 0) | ||
10351 | distance = 0.001; | ||
10352 | |||
10353 | Vector3 posToCheck = startvector; | ||
10354 | ITerrainChannel channel = World.RequestModuleInterface<ITerrainChannel>(); | ||
10355 | |||
10356 | bool checkTerrain = !((rejectTypes & ScriptBaseClass.RC_REJECT_LAND) == ScriptBaseClass.RC_REJECT_LAND); | ||
10357 | bool checkAgents = !((rejectTypes & ScriptBaseClass.RC_REJECT_AGENTS) == ScriptBaseClass.RC_REJECT_AGENTS); | ||
10358 | bool checkNonPhysical = !((rejectTypes & ScriptBaseClass.RC_REJECT_NONPHYSICAL) == ScriptBaseClass.RC_REJECT_NONPHYSICAL); | ||
10359 | bool checkPhysical = !((rejectTypes & ScriptBaseClass.RC_REJECT_PHYSICAL) == ScriptBaseClass.RC_REJECT_PHYSICAL); | ||
10360 | |||
10361 | for (float i = 0; i <= distance; i += 0.1f) | ||
10362 | { | ||
10363 | posToCheck = startvector + (dir * (i / (float)distance)); | ||
10364 | |||
10365 | if (checkTerrain && channel[(int)(posToCheck.X + startvector.X), (int)(posToCheck.Y + startvector.Y)] < posToCheck.Z) | ||
10366 | { | ||
10367 | ContactResult result = new ContactResult(); | ||
10368 | result.ConsumerID = 0; | ||
10369 | result.Depth = 0; | ||
10370 | result.Normal = Vector3.Zero; | ||
10371 | result.Pos = posToCheck; | ||
10372 | results.Add(result); | ||
10373 | checkTerrain = false; | ||
10374 | } | ||
10375 | |||
10376 | if (checkAgents) | ||
10377 | { | ||
10378 | World.ForEachScenePresence(delegate(ScenePresence sp) | ||
10379 | { | ||
10380 | if (sp.AbsolutePosition.ApproxEquals(posToCheck, sp.PhysicsActor.Size.X)) | ||
10381 | { | ||
10382 | ContactResult result = new ContactResult (); | ||
10383 | result.ConsumerID = sp.LocalId; | ||
10384 | result.Depth = 0; | ||
10385 | result.Normal = Vector3.Zero; | ||
10386 | result.Pos = posToCheck; | ||
10387 | results.Add(result); | ||
10388 | } | ||
10389 | }); | ||
10390 | } | ||
10391 | } | ||
10392 | |||
10393 | int refcount = 0; | ||
10394 | foreach (ContactResult result in results) | ||
10395 | { | ||
10396 | if ((rejectTypes & ScriptBaseClass.RC_REJECT_LAND) | ||
10397 | == ScriptBaseClass.RC_REJECT_LAND && result.ConsumerID == 0) | ||
10398 | continue; | ||
10399 | |||
10400 | ISceneEntity entity = World.GetSceneObjectPart(result.ConsumerID); | ||
10401 | |||
10402 | if (entity == null && (rejectTypes & ScriptBaseClass.RC_REJECT_AGENTS) != ScriptBaseClass.RC_REJECT_AGENTS) | ||
10403 | entity = World.GetScenePresence(result.ConsumerID); //Only check if we should be looking for agents | ||
10404 | |||
10405 | if (entity == null) | ||
10406 | { | ||
10407 | list.Add(UUID.Zero); | ||
10408 | |||
10409 | if ((dataFlags & ScriptBaseClass.RC_GET_LINK_NUM) == ScriptBaseClass.RC_GET_LINK_NUM) | ||
10410 | list.Add(0); | ||
10411 | |||
10412 | list.Add(result.Pos); | ||
10413 | |||
10414 | if ((dataFlags & ScriptBaseClass.RC_GET_NORMAL) == ScriptBaseClass.RC_GET_NORMAL) | ||
10415 | list.Add(result.Normal); | ||
10416 | |||
10417 | continue; //Can't find it, so add UUID.Zero | ||
10418 | } | ||
10419 | |||
10420 | /*if (detectPhantom == 0 && intersection.obj is ISceneChildEntity && | ||
10421 | ((ISceneChildEntity)intersection.obj).PhysActor == null) | ||
10422 | continue;*/ //Can't do this ATM, physics engine knows only of non phantom objects | ||
10423 | |||
10424 | if (entity is SceneObjectPart) | ||
10425 | { | ||
10426 | if (((SceneObjectPart)entity).PhysActor != null && ((SceneObjectPart)entity).PhysActor.IsPhysical) | ||
10427 | { | ||
10428 | if (!checkPhysical) | ||
10429 | continue; | ||
10430 | } | ||
10431 | else | ||
10432 | { | ||
10433 | if (!checkNonPhysical) | ||
10434 | continue; | ||
10435 | } | ||
10436 | } | ||
10437 | |||
10438 | refcount++; | ||
10439 | if ((dataFlags & ScriptBaseClass.RC_GET_ROOT_KEY) == ScriptBaseClass.RC_GET_ROOT_KEY && entity is SceneObjectPart) | ||
10440 | list.Add(((SceneObjectPart)entity).ParentGroup.UUID); | ||
10441 | else | ||
10442 | list.Add(entity.UUID); | ||
10443 | |||
10444 | if ((dataFlags & ScriptBaseClass.RC_GET_LINK_NUM) == ScriptBaseClass.RC_GET_LINK_NUM) | ||
10445 | { | ||
10446 | if (entity is SceneObjectPart) | ||
10447 | list.Add(((SceneObjectPart)entity).LinkNum); | ||
10448 | else | ||
10449 | list.Add(0); | ||
10450 | } | ||
10451 | |||
10452 | list.Add(result.Pos); | ||
10453 | |||
10454 | if ((dataFlags & ScriptBaseClass.RC_GET_NORMAL) == ScriptBaseClass.RC_GET_NORMAL) | ||
10455 | list.Add(result.Normal); | ||
10456 | } | ||
10457 | |||
10458 | list.Add(refcount); //The status code, either the # of contacts, RCERR_SIM_PERF_LOW, or RCERR_CAST_TIME_EXCEEDED | ||
10459 | |||
10460 | return list; | ||
10461 | } | ||
10462 | |||
10312 | #region Not Implemented | 10463 | #region Not Implemented |
10313 | // | 10464 | // |
10314 | // Listing the unimplemented lsl functions here, please move | 10465 | // Listing the unimplemented lsl functions here, please move |
10315 | // them from this region as they are completed | 10466 | // them from this region as they are completed |
10316 | // | 10467 | // |
10317 | public void llCastRay(LSL_Vector start, LSL_Vector end, LSL_List options) | ||
10318 | { | ||
10319 | m_host.AddScriptLPS(1); | ||
10320 | NotImplemented("llCastRay"); | ||
10321 | |||
10322 | } | ||
10323 | 10468 | ||
10324 | public void llGetEnv(LSL_String name) | 10469 | public void llGetEnv(LSL_String name) |
10325 | { | 10470 | { |
10326 | m_host.AddScriptLPS(1); | 10471 | m_host.AddScriptLPS(1); |
10327 | NotImplemented("llGetEnv"); | 10472 | NotImplemented("llGetEnv"); |
10328 | |||
10329 | } | 10473 | } |
10330 | 10474 | ||
10331 | public void llGetSPMaxMemory() | 10475 | public void llGetSPMaxMemory() |
10332 | { | 10476 | { |
10333 | m_host.AddScriptLPS(1); | 10477 | m_host.AddScriptLPS(1); |
10334 | NotImplemented("llGetSPMaxMemory"); | 10478 | NotImplemented("llGetSPMaxMemory"); |
10335 | |||
10336 | } | 10479 | } |
10337 | 10480 | ||
10338 | public void llGetUsedMemory() | 10481 | public void llGetUsedMemory() |
10339 | { | 10482 | { |
10340 | m_host.AddScriptLPS(1); | 10483 | m_host.AddScriptLPS(1); |
10341 | NotImplemented("llGetUsedMemory"); | 10484 | NotImplemented("llGetUsedMemory"); |
10342 | |||
10343 | } | 10485 | } |
10344 | 10486 | ||
10345 | public void llRegionSayTo( LSL_Key target, LSL_Integer channel, LSL_String msg ) | 10487 | public void llRegionSayTo(LSL_Key target, LSL_Integer channel, LSL_String msg) |
10346 | { | 10488 | { |
10347 | m_host.AddScriptLPS(1); | 10489 | m_host.AddScriptLPS(1); |
10348 | NotImplemented("llRegionSayTo"); | 10490 | NotImplemented("llRegionSayTo"); |
10349 | |||
10350 | } | 10491 | } |
10351 | 10492 | ||
10352 | public void llScriptProfiler( LSL_Integer flags ) | 10493 | public void llScriptProfiler(LSL_Integer flags) |
10353 | { | 10494 | { |
10354 | m_host.AddScriptLPS(1); | 10495 | m_host.AddScriptLPS(1); |
10355 | NotImplemented("llScriptProfiler"); | 10496 | NotImplemented("llScriptProfiler"); |
10356 | |||
10357 | } | 10497 | } |
10358 | 10498 | ||
10359 | public void llSetSoundQueueing(int queue) | 10499 | public void llSetSoundQueueing(int queue) |