diff options
Diffstat (limited to 'OpenSim/Region')
6 files changed, 196 insertions, 21 deletions
diff --git a/OpenSim/Region/Framework/Scenes/EventManager.cs b/OpenSim/Region/Framework/Scenes/EventManager.cs index 4dd6f32..76d5cb6 100644 --- a/OpenSim/Region/Framework/Scenes/EventManager.cs +++ b/OpenSim/Region/Framework/Scenes/EventManager.cs | |||
@@ -181,7 +181,15 @@ namespace OpenSim.Region.Framework.Scenes | |||
181 | 181 | ||
182 | public delegate void ScriptNotAtTargetEvent(uint localID); | 182 | public delegate void ScriptNotAtTargetEvent(uint localID); |
183 | 183 | ||
184 | public event ScriptNotAtTargetEvent OnScriptNotAtTargetEvent; | 184 | public event ScriptNotAtTargetEvent OnScriptNotAtTargetEvent; |
185 | |||
186 | public delegate void ScriptAtRotTargetEvent(uint localID, uint handle, Quaternion targetrot, Quaternion atrot); | ||
187 | |||
188 | public event ScriptAtRotTargetEvent OnScriptAtRotTargetEvent; | ||
189 | |||
190 | public delegate void ScriptNotAtRotTargetEvent(uint localID); | ||
191 | |||
192 | public event ScriptNotAtRotTargetEvent OnScriptNotAtRotTargetEvent; | ||
185 | 193 | ||
186 | public delegate void ScriptColliding(uint localID, ColliderArgs colliders); | 194 | public delegate void ScriptColliding(uint localID, ColliderArgs colliders); |
187 | 195 | ||
@@ -383,7 +391,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
383 | 391 | ||
384 | private ScriptChangedEvent handlerScriptChangedEvent = null; //OnScriptChangedEvent; | 392 | private ScriptChangedEvent handlerScriptChangedEvent = null; //OnScriptChangedEvent; |
385 | private ScriptAtTargetEvent handlerScriptAtTargetEvent = null; | 393 | private ScriptAtTargetEvent handlerScriptAtTargetEvent = null; |
386 | private ScriptNotAtTargetEvent handlerScriptNotAtTargetEvent = null; | 394 | private ScriptNotAtTargetEvent handlerScriptNotAtTargetEvent = null; |
395 | private ScriptAtRotTargetEvent handlerScriptAtRotTargetEvent = null; | ||
396 | private ScriptNotAtRotTargetEvent handlerScriptNotAtRotTargetEvent = null; | ||
387 | private ClientMovement handlerClientMovement = null; //OnClientMovement; | 397 | private ClientMovement handlerClientMovement = null; //OnClientMovement; |
388 | private OnPermissionErrorDelegate handlerPermissionError = null; //OnPermissionError; | 398 | private OnPermissionErrorDelegate handlerPermissionError = null; //OnPermissionError; |
389 | private OnPluginConsoleDelegate handlerPluginConsole = null; //OnPluginConsole; | 399 | private OnPluginConsoleDelegate handlerPluginConsole = null; //OnPluginConsole; |
@@ -849,6 +859,24 @@ namespace OpenSim.Region.Framework.Scenes | |||
849 | { | 859 | { |
850 | handlerScriptNotAtTargetEvent(localID); | 860 | handlerScriptNotAtTargetEvent(localID); |
851 | } | 861 | } |
862 | } | ||
863 | |||
864 | public void TriggerAtRotTargetEvent(uint localID, uint handle, Quaternion targetrot, Quaternion currentrot) | ||
865 | { | ||
866 | handlerScriptAtRotTargetEvent = OnScriptAtRotTargetEvent; | ||
867 | if (handlerScriptAtRotTargetEvent != null) | ||
868 | { | ||
869 | handlerScriptAtRotTargetEvent(localID, handle, targetrot, currentrot); | ||
870 | } | ||
871 | } | ||
872 | |||
873 | public void TriggerNotAtRotTargetEvent(uint localID) | ||
874 | { | ||
875 | handlerScriptNotAtRotTargetEvent = OnScriptNotAtRotTargetEvent; | ||
876 | if (handlerScriptNotAtRotTargetEvent != null) | ||
877 | { | ||
878 | handlerScriptNotAtRotTargetEvent(localID); | ||
879 | } | ||
852 | } | 880 | } |
853 | 881 | ||
854 | public void TriggerRequestChangeWaterHeight(float height) | 882 | public void TriggerRequestChangeWaterHeight(float height) |
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index 34d8b49..8050bf6 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | |||
@@ -56,7 +56,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
56 | land_collision = 2048, | 56 | land_collision = 2048, |
57 | land_collision_end = 4096, | 57 | land_collision_end = 4096, |
58 | land_collision_start = 8192, | 58 | land_collision_start = 8192, |
59 | at_target = 16384, | 59 | at_target = 16384, |
60 | at_rot_target = 16777216, | ||
60 | listen = 32768, | 61 | listen = 32768, |
61 | money = 65536, | 62 | money = 65536, |
62 | moving_end = 131072, | 63 | moving_end = 131072, |
@@ -79,6 +80,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
79 | public Vector3 targetPos; | 80 | public Vector3 targetPos; |
80 | public float tolerance; | 81 | public float tolerance; |
81 | public uint handle; | 82 | public uint handle; |
83 | } | ||
84 | |||
85 | struct scriptRotTarget | ||
86 | { | ||
87 | public Quaternion targetRot; | ||
88 | public float tolerance; | ||
89 | public uint handle; | ||
82 | } | 90 | } |
83 | 91 | ||
84 | public delegate void PrimCountTaintedDelegate(); | 92 | public delegate void PrimCountTaintedDelegate(); |
@@ -165,10 +173,14 @@ namespace OpenSim.Region.Framework.Scenes | |||
165 | protected SceneObjectPart m_rootPart; | 173 | protected SceneObjectPart m_rootPart; |
166 | // private Dictionary<UUID, scriptEvents> m_scriptEvents = new Dictionary<UUID, scriptEvents>(); | 174 | // private Dictionary<UUID, scriptEvents> m_scriptEvents = new Dictionary<UUID, scriptEvents>(); |
167 | 175 | ||
168 | private Dictionary<uint, scriptPosTarget> m_targets = new Dictionary<uint, scriptPosTarget>(); | 176 | private Dictionary<uint, scriptPosTarget> m_targets = new Dictionary<uint, scriptPosTarget>(); |
177 | private Dictionary<uint, scriptRotTarget> m_rotTargets = new Dictionary<uint, scriptRotTarget>(); | ||
169 | 178 | ||
170 | private bool m_scriptListens_atTarget = false; | 179 | private bool m_scriptListens_atTarget = false; |
171 | private bool m_scriptListens_notAtTarget = false; | 180 | private bool m_scriptListens_notAtTarget = false; |
181 | |||
182 | private bool m_scriptListens_atRotTarget = false; | ||
183 | private bool m_scriptListens_notAtRotTarget = false; | ||
172 | 184 | ||
173 | internal Dictionary<UUID, string> m_savedScriptState = null; | 185 | internal Dictionary<UUID, string> m_savedScriptState = null; |
174 | 186 | ||
@@ -1261,6 +1273,15 @@ namespace OpenSim.Region.Framework.Scenes | |||
1261 | lock (m_targets) | 1273 | lock (m_targets) |
1262 | m_targets.Clear(); | 1274 | m_targets.Clear(); |
1263 | m_scene.RemoveGroupTarget(this); | 1275 | m_scene.RemoveGroupTarget(this); |
1276 | } | ||
1277 | m_scriptListens_atRotTarget = ((aggregateScriptEvents & scriptEvents.at_rot_target) != 0); | ||
1278 | m_scriptListens_notAtRotTarget = ((aggregateScriptEvents & scriptEvents.not_at_rot_target) != 0); | ||
1279 | |||
1280 | if (!m_scriptListens_atRotTarget && !m_scriptListens_notAtRotTarget) | ||
1281 | { | ||
1282 | lock (m_rotTargets) | ||
1283 | m_rotTargets.Clear(); | ||
1284 | m_scene.RemoveGroupTarget(this); | ||
1264 | } | 1285 | } |
1265 | 1286 | ||
1266 | ScheduleGroupForFullUpdate(); | 1287 | ScheduleGroupForFullUpdate(); |
@@ -3157,6 +3178,30 @@ namespace OpenSim.Region.Framework.Scenes | |||
3157 | } | 3178 | } |
3158 | 3179 | ||
3159 | } | 3180 | } |
3181 | } | ||
3182 | public int registerRotTargetWaypoint(Quaternion target, float tolerance) | ||
3183 | { | ||
3184 | scriptRotTarget waypoint = new scriptRotTarget(); | ||
3185 | waypoint.targetRot = target; | ||
3186 | waypoint.tolerance = tolerance; | ||
3187 | uint handle = m_scene.AllocateLocalId(); | ||
3188 | waypoint.handle = handle; | ||
3189 | lock (m_rotTargets) | ||
3190 | { | ||
3191 | m_rotTargets.Add(handle, waypoint); | ||
3192 | } | ||
3193 | m_scene.AddGroupTarget(this); | ||
3194 | return (int)handle; | ||
3195 | } | ||
3196 | |||
3197 | public void unregisterRotTargetWaypoint(int handle) | ||
3198 | { | ||
3199 | lock (m_targets) | ||
3200 | { | ||
3201 | m_rotTargets.Remove((uint)handle); | ||
3202 | if (m_targets.Count == 0) | ||
3203 | m_scene.RemoveGroupTarget(this); | ||
3204 | } | ||
3160 | } | 3205 | } |
3161 | 3206 | ||
3162 | public int registerTargetWaypoint(Vector3 target, float tolerance) | 3207 | public int registerTargetWaypoint(Vector3 target, float tolerance) |
@@ -3263,6 +3308,85 @@ namespace OpenSim.Region.Framework.Scenes | |||
3263 | } | 3308 | } |
3264 | } | 3309 | } |
3265 | } | 3310 | } |
3311 | } | ||
3312 | if (m_scriptListens_atRotTarget || m_scriptListens_notAtRotTarget) | ||
3313 | { | ||
3314 | if (m_rotTargets.Count > 0) | ||
3315 | { | ||
3316 | bool at_Rottarget = false; | ||
3317 | Dictionary<uint, scriptRotTarget> atRotTargets = new Dictionary<uint, scriptRotTarget>(); | ||
3318 | lock (m_rotTargets) | ||
3319 | { | ||
3320 | foreach (uint idx in m_rotTargets.Keys) | ||
3321 | { | ||
3322 | scriptRotTarget target = m_rotTargets[idx]; | ||
3323 | double angle = Math.Acos(target.targetRot.X * m_rootPart.RotationOffset.X + target.targetRot.Y * m_rootPart.RotationOffset.Y + target.targetRot.Z * m_rootPart.RotationOffset.Z + target.targetRot.W * m_rootPart.RotationOffset.W) * 2; | ||
3324 | if (angle < 0) angle = -angle; | ||
3325 | if (angle > Math.PI) angle = (Math.PI * 2 - angle); | ||
3326 | if (angle <= target.tolerance) | ||
3327 | { | ||
3328 | // trigger at_rot_target | ||
3329 | if (m_scriptListens_atRotTarget) | ||
3330 | { | ||
3331 | at_Rottarget = true; | ||
3332 | scriptRotTarget att = new scriptRotTarget(); | ||
3333 | att.targetRot = target.targetRot; | ||
3334 | att.tolerance = target.tolerance; | ||
3335 | att.handle = target.handle; | ||
3336 | atRotTargets.Add(idx, att); | ||
3337 | } | ||
3338 | } | ||
3339 | } | ||
3340 | } | ||
3341 | |||
3342 | if (atRotTargets.Count > 0) | ||
3343 | { | ||
3344 | uint[] localids = new uint[0]; | ||
3345 | lock (m_parts) | ||
3346 | { | ||
3347 | localids = new uint[m_parts.Count]; | ||
3348 | int cntr = 0; | ||
3349 | foreach (SceneObjectPart part in m_parts.Values) | ||
3350 | { | ||
3351 | localids[cntr] = part.LocalId; | ||
3352 | cntr++; | ||
3353 | } | ||
3354 | } | ||
3355 | |||
3356 | for (int ctr = 0; ctr < localids.Length; ctr++) | ||
3357 | { | ||
3358 | foreach (uint target in atRotTargets.Keys) | ||
3359 | { | ||
3360 | scriptRotTarget att = atRotTargets[target]; | ||
3361 | m_scene.EventManager.TriggerAtRotTargetEvent( | ||
3362 | localids[ctr], att.handle, att.targetRot, m_rootPart.RotationOffset); | ||
3363 | } | ||
3364 | } | ||
3365 | |||
3366 | return; | ||
3367 | } | ||
3368 | |||
3369 | if (m_scriptListens_notAtRotTarget && !at_Rottarget) | ||
3370 | { | ||
3371 | //trigger not_at_target | ||
3372 | uint[] localids = new uint[0]; | ||
3373 | lock (m_parts) | ||
3374 | { | ||
3375 | localids = new uint[m_parts.Count]; | ||
3376 | int cntr = 0; | ||
3377 | foreach (SceneObjectPart part in m_parts.Values) | ||
3378 | { | ||
3379 | localids[cntr] = part.LocalId; | ||
3380 | cntr++; | ||
3381 | } | ||
3382 | } | ||
3383 | |||
3384 | for (int ctr = 0; ctr < localids.Length; ctr++) | ||
3385 | { | ||
3386 | m_scene.EventManager.TriggerNotAtRotTargetEvent(localids[ctr]); | ||
3387 | } | ||
3388 | } | ||
3389 | } | ||
3266 | } | 3390 | } |
3267 | } | 3391 | } |
3268 | 3392 | ||
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 73f79b3..177de47 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | |||
@@ -4078,6 +4078,23 @@ namespace OpenSim.Region.Framework.Scenes | |||
4078 | { | 4078 | { |
4079 | m_parentGroup.unregisterTargetWaypoint(handle); | 4079 | m_parentGroup.unregisterTargetWaypoint(handle); |
4080 | } | 4080 | } |
4081 | } | ||
4082 | |||
4083 | public int registerRotTargetWaypoint(Quaternion target, float tolerance) | ||
4084 | { | ||
4085 | if (m_parentGroup != null) | ||
4086 | { | ||
4087 | return m_parentGroup.registerRotTargetWaypoint(target, tolerance); | ||
4088 | } | ||
4089 | return 0; | ||
4090 | } | ||
4091 | |||
4092 | public void unregisterRotTargetWaypoint(int handle) | ||
4093 | { | ||
4094 | if (m_parentGroup != null) | ||
4095 | { | ||
4096 | m_parentGroup.unregisterRotTargetWaypoint(handle); | ||
4097 | } | ||
4081 | } | 4098 | } |
4082 | 4099 | ||
4083 | public void SetCameraAtOffset(Vector3 v) | 4100 | public void SetCameraAtOffset(Vector3 v) |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 39b597e..856f8b6 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | |||
@@ -2108,15 +2108,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2108 | 2108 | ||
2109 | public LSL_Integer llRotTarget(LSL_Rotation rot, double error) | 2109 | public LSL_Integer llRotTarget(LSL_Rotation rot, double error) |
2110 | { | 2110 | { |
2111 | m_host.AddScriptLPS(1); | 2111 | m_host.AddScriptLPS(1); |
2112 | NotImplemented("llRotTarget"); | 2112 | return m_host.registerRotTargetWaypoint(new Quaternion((float)rot.x, (float)rot.y, (float)rot.z, (float)rot.s), (float)error); |
2113 | return 0; | ||
2114 | } | 2113 | } |
2115 | 2114 | ||
2116 | public void llRotTargetRemove(int number) | 2115 | public void llRotTargetRemove(int number) |
2117 | { | 2116 | { |
2118 | m_host.AddScriptLPS(1); | 2117 | m_host.AddScriptLPS(1); |
2119 | NotImplemented("llRotTargetRemove"); | 2118 | m_host.unregisterRotTargetWaypoint(number); |
2120 | } | 2119 | } |
2121 | 2120 | ||
2122 | public void llMoveToTarget(LSL_Vector target, double tau) | 2121 | public void llMoveToTarget(LSL_Vector target, double tau) |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/Executor.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/Executor.cs index 7f67599..fb86850 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/Executor.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/Executor.cs | |||
@@ -61,7 +61,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase | |||
61 | land_collision = 2048, | 61 | land_collision = 2048, |
62 | land_collision_end = 4096, | 62 | land_collision_end = 4096, |
63 | land_collision_start = 8192, | 63 | land_collision_start = 8192, |
64 | at_target = 16384, | 64 | at_target = 16384, |
65 | at_rot_target = 16777216, | ||
65 | listen = 32768, | 66 | listen = 32768, |
66 | money = 65536, | 67 | money = 65536, |
67 | moving_end = 131072, | 68 | moving_end = 131072, |
@@ -202,8 +203,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase | |||
202 | return; | 203 | return; |
203 | } | 204 | } |
204 | 205 | ||
205 | m_eventFlagsMap.Add("attach", scriptEvents.attach); | 206 | m_eventFlagsMap.Add("attach", scriptEvents.attach); |
206 | // m_eventFlagsMap.Add("at_rot_target",(long)scriptEvents.at_rot_target); | 207 | m_eventFlagsMap.Add("at_rot_target", scriptEvents.at_rot_target); |
207 | m_eventFlagsMap.Add("at_target", scriptEvents.at_target); | 208 | m_eventFlagsMap.Add("at_target", scriptEvents.at_target); |
208 | // m_eventFlagsMap.Add("changed",(long)scriptEvents.changed); | 209 | // m_eventFlagsMap.Add("changed",(long)scriptEvents.changed); |
209 | m_eventFlagsMap.Add("collision", scriptEvents.collision); | 210 | m_eventFlagsMap.Add("collision", scriptEvents.collision); |
diff --git a/OpenSim/Region/ScriptEngine/XEngine/EventManager.cs b/OpenSim/Region/ScriptEngine/XEngine/EventManager.cs index b2eab45..ce22ba5 100644 --- a/OpenSim/Region/ScriptEngine/XEngine/EventManager.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/EventManager.cs | |||
@@ -58,7 +58,9 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
58 | myScriptEngine.World.EventManager.OnObjectDeGrab += touch_end; | 58 | myScriptEngine.World.EventManager.OnObjectDeGrab += touch_end; |
59 | myScriptEngine.World.EventManager.OnScriptChangedEvent += changed; | 59 | myScriptEngine.World.EventManager.OnScriptChangedEvent += changed; |
60 | myScriptEngine.World.EventManager.OnScriptAtTargetEvent += at_target; | 60 | myScriptEngine.World.EventManager.OnScriptAtTargetEvent += at_target; |
61 | myScriptEngine.World.EventManager.OnScriptNotAtTargetEvent += not_at_target; | 61 | myScriptEngine.World.EventManager.OnScriptNotAtTargetEvent += not_at_target; |
62 | myScriptEngine.World.EventManager.OnScriptAtRotTargetEvent += at_rot_target; | ||
63 | myScriptEngine.World.EventManager.OnScriptNotAtRotTargetEvent += not_at_rot_target; | ||
62 | myScriptEngine.World.EventManager.OnScriptControlEvent += control; | 64 | myScriptEngine.World.EventManager.OnScriptControlEvent += control; |
63 | myScriptEngine.World.EventManager.OnScriptColliderStart += collision_start; | 65 | myScriptEngine.World.EventManager.OnScriptColliderStart += collision_start; |
64 | myScriptEngine.World.EventManager.OnScriptColliding += collision; | 66 | myScriptEngine.World.EventManager.OnScriptColliding += collision; |
@@ -388,16 +390,20 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
388 | myScriptEngine.PostObjectEvent(localID, new EventParams( | 390 | myScriptEngine.PostObjectEvent(localID, new EventParams( |
389 | "not_at_target",new object[0], | 391 | "not_at_target",new object[0], |
390 | new DetectParams[0])); | 392 | new DetectParams[0])); |
391 | } | 393 | } |
392 | 394 | ||
393 | public void at_rot_target(uint localID, UUID itemID) | 395 | public void at_rot_target(uint localID, uint handle, Quaternion targetrot, |
394 | { | 396 | Quaternion atrot) |
395 | myScriptEngine.PostObjectEvent(localID, new EventParams( | 397 | { |
396 | "at_rot_target",new object[0], | 398 | myScriptEngine.PostObjectEvent(localID, new EventParams( |
399 | "at_rot_target", new object[] { | ||
400 | new LSL_Types.LSLInteger(handle), | ||
401 | new LSL_Types.Quaternion(targetrot.X,targetrot.Y,targetrot.Z,targetrot.W), | ||
402 | new LSL_Types.Quaternion(atrot.X,atrot.Y,atrot.Z,atrot.W) }, | ||
397 | new DetectParams[0])); | 403 | new DetectParams[0])); |
398 | } | 404 | } |
399 | 405 | ||
400 | public void not_at_rot_target(uint localID, UUID itemID) | 406 | public void not_at_rot_target(uint localID) |
401 | { | 407 | { |
402 | myScriptEngine.PostObjectEvent(localID, new EventParams( | 408 | myScriptEngine.PostObjectEvent(localID, new EventParams( |
403 | "not_at_rot_target",new object[0], | 409 | "not_at_rot_target",new object[0], |