diff options
-rw-r--r-- | OpenSim/Framework/ChildAgentDataUpdate.cs | 25 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | 66 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/ScenePresence.cs | 55 | ||||
-rw-r--r-- | OpenSim/Region/Physics/UbitOdePlugin/ODECharacter.cs | 10 |
4 files changed, 136 insertions, 20 deletions
diff --git a/OpenSim/Framework/ChildAgentDataUpdate.cs b/OpenSim/Framework/ChildAgentDataUpdate.cs index fe12874..e718aa6 100644 --- a/OpenSim/Framework/ChildAgentDataUpdate.cs +++ b/OpenSim/Framework/ChildAgentDataUpdate.cs | |||
@@ -229,12 +229,14 @@ namespace OpenSim.Framework | |||
229 | 229 | ||
230 | public class ControllerData | 230 | public class ControllerData |
231 | { | 231 | { |
232 | public UUID ObjectID; | ||
232 | public UUID ItemID; | 233 | public UUID ItemID; |
233 | public uint IgnoreControls; | 234 | public uint IgnoreControls; |
234 | public uint EventControls; | 235 | public uint EventControls; |
235 | 236 | ||
236 | public ControllerData(UUID item, uint ignore, uint ev) | 237 | public ControllerData(UUID obj, UUID item, uint ignore, uint ev) |
237 | { | 238 | { |
239 | ObjectID = obj; | ||
238 | ItemID = item; | 240 | ItemID = item; |
239 | IgnoreControls = ignore; | 241 | IgnoreControls = ignore; |
240 | EventControls = ev; | 242 | EventControls = ev; |
@@ -248,6 +250,7 @@ namespace OpenSim.Framework | |||
248 | public OSDMap PackUpdateMessage() | 250 | public OSDMap PackUpdateMessage() |
249 | { | 251 | { |
250 | OSDMap controldata = new OSDMap(); | 252 | OSDMap controldata = new OSDMap(); |
253 | controldata["object"] = OSD.FromUUID(ObjectID); | ||
251 | controldata["item"] = OSD.FromUUID(ItemID); | 254 | controldata["item"] = OSD.FromUUID(ItemID); |
252 | controldata["ignore"] = OSD.FromInteger(IgnoreControls); | 255 | controldata["ignore"] = OSD.FromInteger(IgnoreControls); |
253 | controldata["event"] = OSD.FromInteger(EventControls); | 256 | controldata["event"] = OSD.FromInteger(EventControls); |
@@ -258,6 +261,8 @@ namespace OpenSim.Framework | |||
258 | 261 | ||
259 | public void UnpackUpdateMessage(OSDMap args) | 262 | public void UnpackUpdateMessage(OSDMap args) |
260 | { | 263 | { |
264 | if (args["object"] != null) | ||
265 | ObjectID = args["object"].AsUUID(); | ||
261 | if (args["item"] != null) | 266 | if (args["item"] != null) |
262 | ItemID = args["item"].AsUUID(); | 267 | ItemID = args["item"].AsUUID(); |
263 | if (args["ignore"] != null) | 268 | if (args["ignore"] != null) |
@@ -306,6 +311,7 @@ namespace OpenSim.Framework | |||
306 | 311 | ||
307 | public AgentGroupData[] Groups; | 312 | public AgentGroupData[] Groups; |
308 | public Animation[] Anims; | 313 | public Animation[] Anims; |
314 | public Animation DefaultAnim = null; | ||
309 | 315 | ||
310 | public UUID GranterID; | 316 | public UUID GranterID; |
311 | public UUID ParentPart; | 317 | public UUID ParentPart; |
@@ -392,6 +398,11 @@ namespace OpenSim.Framework | |||
392 | args["animations"] = anims; | 398 | args["animations"] = anims; |
393 | } | 399 | } |
394 | 400 | ||
401 | if (DefaultAnim != null) | ||
402 | { | ||
403 | args["default_animation"] = DefaultAnim.PackUpdateMessage(); | ||
404 | } | ||
405 | |||
395 | if (Appearance != null) | 406 | if (Appearance != null) |
396 | args["packed_appearance"] = Appearance.Pack(); | 407 | args["packed_appearance"] = Appearance.Pack(); |
397 | 408 | ||
@@ -589,6 +600,18 @@ namespace OpenSim.Framework | |||
589 | } | 600 | } |
590 | } | 601 | } |
591 | 602 | ||
603 | if (args["default_animation"] != null) | ||
604 | { | ||
605 | try | ||
606 | { | ||
607 | DefaultAnim = new Animation((OSDMap)args["default_animation"]); | ||
608 | } | ||
609 | catch | ||
610 | { | ||
611 | DefaultAnim = null; | ||
612 | } | ||
613 | } | ||
614 | |||
592 | //if ((args["agent_textures"] != null) && (args["agent_textures"]).Type == OSDType.Array) | 615 | //if ((args["agent_textures"] != null) && (args["agent_textures"]).Type == OSDType.Array) |
593 | //{ | 616 | //{ |
594 | // OSDArray textures = (OSDArray)(args["agent_textures"]); | 617 | // OSDArray textures = (OSDArray)(args["agent_textures"]); |
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index 42b6bc5..a6ce0e2 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | |||
@@ -465,7 +465,15 @@ namespace OpenSim.Region.Framework.Scenes | |||
465 | { | 465 | { |
466 | return (IsAttachment || (m_rootPart.Shape.PCode == 9 && m_rootPart.Shape.State != 0)); | 466 | return (IsAttachment || (m_rootPart.Shape.PCode == 9 && m_rootPart.Shape.State != 0)); |
467 | } | 467 | } |
468 | 468 | ||
469 | |||
470 | |||
471 | private struct avtocrossInfo | ||
472 | { | ||
473 | public ScenePresence av; | ||
474 | public uint ParentID; | ||
475 | } | ||
476 | |||
469 | /// <summary> | 477 | /// <summary> |
470 | /// The absolute position of this scene object in the scene | 478 | /// The absolute position of this scene object in the scene |
471 | /// </summary> | 479 | /// </summary> |
@@ -517,15 +525,24 @@ namespace OpenSim.Region.Framework.Scenes | |||
517 | { | 525 | { |
518 | // We unparent the SP quietly so that it won't | 526 | // We unparent the SP quietly so that it won't |
519 | // be made to stand up | 527 | // be made to stand up |
528 | |||
529 | List<avtocrossInfo> avsToCross = new List<avtocrossInfo>(); | ||
530 | |||
520 | foreach (ScenePresence av in m_linkedAvatars) | 531 | foreach (ScenePresence av in m_linkedAvatars) |
521 | { | 532 | { |
533 | avtocrossInfo avinfo = new avtocrossInfo(); | ||
522 | SceneObjectPart parentPart = m_scene.GetSceneObjectPart(av.ParentID); | 534 | SceneObjectPart parentPart = m_scene.GetSceneObjectPart(av.ParentID); |
523 | if (parentPart != null) | 535 | if (parentPart != null) |
524 | av.ParentUUID = parentPart.UUID; | 536 | av.ParentUUID = parentPart.UUID; |
525 | 537 | ||
538 | avinfo.av = av; | ||
539 | avinfo.ParentID = av.ParentID; | ||
540 | avsToCross.Add(avinfo); | ||
541 | |||
526 | av.ParentID = 0; | 542 | av.ParentID = 0; |
527 | } | 543 | } |
528 | 544 | ||
545 | // m_linkedAvatars.Clear(); | ||
529 | m_scene.CrossPrimGroupIntoNewRegion(val, this, true); | 546 | m_scene.CrossPrimGroupIntoNewRegion(val, this, true); |
530 | 547 | ||
531 | // Normalize | 548 | // Normalize |
@@ -541,18 +558,37 @@ namespace OpenSim.Region.Framework.Scenes | |||
541 | // If it's deleted, crossing was successful | 558 | // If it's deleted, crossing was successful |
542 | if (IsDeleted) | 559 | if (IsDeleted) |
543 | { | 560 | { |
544 | foreach (ScenePresence av in m_linkedAvatars) | 561 | // foreach (ScenePresence av in m_linkedAvatars) |
562 | foreach (avtocrossInfo avinfo in avsToCross) | ||
545 | { | 563 | { |
546 | m_log.DebugFormat("[SCENE OBJECT]: Crossing avatar {0} to {1}", av.Name, val); | 564 | ScenePresence av = avinfo.av; |
547 | 565 | if (!av.IsInTransit) // just in case... | |
548 | av.IsInTransit = true; | 566 | { |
549 | 567 | m_log.DebugFormat("[SCENE OBJECT]: Crossing avatar {0} to {1}", av.Name, val); | |
550 | CrossAgentToNewRegionDelegate d = entityTransfer.CrossAgentToNewRegionAsync; | 568 | |
551 | d.BeginInvoke(av, val, x, y, destination, av.Flying, version, CrossAgentToNewRegionCompleted, d); | 569 | av.IsInTransit = true; |
570 | |||
571 | CrossAgentToNewRegionDelegate d = entityTransfer.CrossAgentToNewRegionAsync; | ||
572 | d.BeginInvoke(av, val, x, y, destination, av.Flying, version, CrossAgentToNewRegionCompleted, d); | ||
573 | } | ||
574 | else | ||
575 | m_log.DebugFormat("[SCENE OBJECT]: Crossing avatar alreasy in transit {0} to {1}", av.Name, val); | ||
552 | } | 576 | } |
553 | 577 | avsToCross.Clear(); | |
554 | return; | 578 | return; |
555 | } | 579 | } |
580 | else // cross failed, put avas back ?? | ||
581 | { | ||
582 | foreach (avtocrossInfo avinfo in avsToCross) | ||
583 | { | ||
584 | ScenePresence av = avinfo.av; | ||
585 | av.ParentUUID = UUID.Zero; | ||
586 | av.ParentID = avinfo.ParentID; | ||
587 | // m_linkedAvatars.Add(av); | ||
588 | } | ||
589 | } | ||
590 | avsToCross.Clear(); | ||
591 | |||
556 | } | 592 | } |
557 | else if (RootPart.PhysActor != null) | 593 | else if (RootPart.PhysActor != null) |
558 | { | 594 | { |
@@ -565,6 +601,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
565 | val.Z = Util.Clamp<float>(oldp.Z, 0.5f, 4096.0f); | 601 | val.Z = Util.Clamp<float>(oldp.Z, 0.5f, 4096.0f); |
566 | } | 602 | } |
567 | } | 603 | } |
604 | |||
568 | /* don't see the need but worse don't see where is restored to false if things stay in | 605 | /* don't see the need but worse don't see where is restored to false if things stay in |
569 | foreach (SceneObjectPart part in m_parts.GetArray()) | 606 | foreach (SceneObjectPart part in m_parts.GetArray()) |
570 | { | 607 | { |
@@ -640,9 +677,12 @@ namespace OpenSim.Region.Framework.Scenes | |||
640 | { | 677 | { |
641 | agent.ParentPart = null; | 678 | agent.ParentPart = null; |
642 | agent.ParentPosition = Vector3.Zero; | 679 | agent.ParentPosition = Vector3.Zero; |
680 | // agent.ParentUUID = UUID.Zero; | ||
643 | } | 681 | } |
644 | } | 682 | } |
645 | 683 | ||
684 | agent.ParentUUID = UUID.Zero; | ||
685 | |||
646 | // agent.Reset(); | 686 | // agent.Reset(); |
647 | // else // Not successful | 687 | // else // Not successful |
648 | // agent.RestoreInCurrentScene(); | 688 | // agent.RestoreInCurrentScene(); |
@@ -1779,15 +1819,14 @@ namespace OpenSim.Region.Framework.Scenes | |||
1779 | part.ClearUpdateSchedule(); | 1819 | part.ClearUpdateSchedule(); |
1780 | if (part == m_rootPart) | 1820 | if (part == m_rootPart) |
1781 | { | 1821 | { |
1782 | if (!IsAttachment || (AttachedAvatar == avatar.ControllingClient.AgentId) || | 1822 | if (!IsAttachment || (AttachedAvatar == avatar.ControllingClient.AgentId) || |
1783 | (AttachmentPoint < 31) || (AttachmentPoint > 38)) | 1823 | (AttachmentPoint < 31) || (AttachmentPoint > 38)) |
1784 | avatar.ControllingClient.SendKillObject(m_regionHandle, new List<uint> { part.LocalId }); | 1824 | avatar.ControllingClient.SendKillObject(m_regionHandle, new List<uint> { part.LocalId }); |
1785 | } | 1825 | } |
1786 | } | 1826 | } |
1787 | }); | 1827 | }); |
1788 | } | 1828 | } |
1789 | 1829 | ||
1790 | |||
1791 | } | 1830 | } |
1792 | 1831 | ||
1793 | public void AddScriptLPS(int count) | 1832 | public void AddScriptLPS(int count) |
@@ -2069,6 +2108,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
2069 | dupe.m_isBackedUp = false; | 2108 | dupe.m_isBackedUp = false; |
2070 | dupe.m_parts = new MapAndArray<OpenMetaverse.UUID, SceneObjectPart>(); | 2109 | dupe.m_parts = new MapAndArray<OpenMetaverse.UUID, SceneObjectPart>(); |
2071 | 2110 | ||
2111 | // new group as no sitting avatars | ||
2112 | dupe.m_linkedAvatars = new List<ScenePresence>(); | ||
2113 | |||
2072 | // Warning, The following code related to previousAttachmentStatus is needed so that clones of | 2114 | // Warning, The following code related to previousAttachmentStatus is needed so that clones of |
2073 | // attachments do not bordercross while they're being duplicated. This is hacktastic! | 2115 | // attachments do not bordercross while they're being duplicated. This is hacktastic! |
2074 | // Normally, setting AbsolutePosition will bordercross a prim if it's outside the region! | 2116 | // Normally, setting AbsolutePosition will bordercross a prim if it's outside the region! |
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 5e275f6..5a6fb6c 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs | |||
@@ -63,6 +63,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
63 | 63 | ||
64 | struct ScriptControllers | 64 | struct ScriptControllers |
65 | { | 65 | { |
66 | public UUID objectID; | ||
66 | public UUID itemID; | 67 | public UUID itemID; |
67 | public ScriptControlled ignoreControls; | 68 | public ScriptControlled ignoreControls; |
68 | public ScriptControlled eventControls; | 69 | public ScriptControlled eventControls; |
@@ -756,7 +757,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
756 | m_movementAnimationUpdateCounter = 0; | 757 | m_movementAnimationUpdateCounter = 0; |
757 | if (Animator != null) | 758 | if (Animator != null) |
758 | { | 759 | { |
759 | if(ParentID == 0 && !SitGround) // skip it if sitting | 760 | // If the parentID == 0 we are not sitting |
761 | // if !SitGournd then we are not sitting on the ground | ||
762 | // Fairly straightforward, now here comes the twist | ||
763 | // if ParentUUID is NOT UUID.Zero, we are looking to | ||
764 | // be sat on an object that isn't there yet. Should | ||
765 | // be treated as if sat. | ||
766 | if(ParentID == 0 && !SitGround && ParentUUID == UUID.Zero) // skip it if sitting | ||
760 | Animator.UpdateMovementAnimations(); | 767 | Animator.UpdateMovementAnimations(); |
761 | } | 768 | } |
762 | else | 769 | else |
@@ -923,7 +930,15 @@ namespace OpenSim.Region.Framework.Scenes | |||
923 | } | 930 | } |
924 | AbsolutePosition = pos; | 931 | AbsolutePosition = pos; |
925 | 932 | ||
926 | AddToPhysicalScene(isFlying); | 933 | if (m_teleportFlags == TeleportFlags.Default) |
934 | { | ||
935 | Vector3 vel = Velocity; | ||
936 | AddToPhysicalScene(isFlying); | ||
937 | if (PhysicsActor != null) | ||
938 | PhysicsActor.SetMomentum(vel); | ||
939 | } | ||
940 | else | ||
941 | AddToPhysicalScene(isFlying); | ||
927 | 942 | ||
928 | if (ForceFly) | 943 | if (ForceFly) |
929 | { | 944 | { |
@@ -974,6 +989,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
974 | // If we don't reset the movement flag here, an avatar that crosses to a neighbouring sim and returns will | 989 | // If we don't reset the movement flag here, an avatar that crosses to a neighbouring sim and returns will |
975 | // stall on the border crossing since the existing child agent will still have the last movement | 990 | // stall on the border crossing since the existing child agent will still have the last movement |
976 | // recorded, which stops the input from being processed. | 991 | // recorded, which stops the input from being processed. |
992 | |||
977 | MovementFlag = 0; | 993 | MovementFlag = 0; |
978 | 994 | ||
979 | m_scene.EventManager.TriggerOnMakeRootAgent(this); | 995 | m_scene.EventManager.TriggerOnMakeRootAgent(this); |
@@ -1014,6 +1030,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
1014 | // as teleporting back | 1030 | // as teleporting back |
1015 | TeleportFlags = TeleportFlags.Default; | 1031 | TeleportFlags = TeleportFlags.Default; |
1016 | 1032 | ||
1033 | MovementFlag = 0; | ||
1034 | |||
1017 | // It looks like Animator is set to null somewhere, and MakeChild | 1035 | // It looks like Animator is set to null somewhere, and MakeChild |
1018 | // is called after that. Probably in aborted teleports. | 1036 | // is called after that. Probably in aborted teleports. |
1019 | if (Animator == null) | 1037 | if (Animator == null) |
@@ -1021,6 +1039,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1021 | else | 1039 | else |
1022 | Animator.ResetAnimations(); | 1040 | Animator.ResetAnimations(); |
1023 | 1041 | ||
1042 | |||
1024 | // m_log.DebugFormat( | 1043 | // m_log.DebugFormat( |
1025 | // "[SCENE PRESENCE]: Downgrading root agent {0}, {1} to a child agent in {2}", | 1044 | // "[SCENE PRESENCE]: Downgrading root agent {0}, {1} to a child agent in {2}", |
1026 | // Name, UUID, m_scene.RegionInfo.RegionName); | 1045 | // Name, UUID, m_scene.RegionInfo.RegionName); |
@@ -1047,9 +1066,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
1047 | { | 1066 | { |
1048 | // PhysicsActor.OnRequestTerseUpdate -= SendTerseUpdateToAllClients; | 1067 | // PhysicsActor.OnRequestTerseUpdate -= SendTerseUpdateToAllClients; |
1049 | PhysicsActor.OnOutOfBounds -= OutOfBoundsCall; | 1068 | PhysicsActor.OnOutOfBounds -= OutOfBoundsCall; |
1050 | m_scene.PhysicsScene.RemoveAvatar(PhysicsActor); | ||
1051 | PhysicsActor.UnSubscribeEvents(); | ||
1052 | PhysicsActor.OnCollisionUpdate -= PhysicsCollisionUpdate; | 1069 | PhysicsActor.OnCollisionUpdate -= PhysicsCollisionUpdate; |
1070 | PhysicsActor.UnSubscribeEvents(); | ||
1071 | m_scene.PhysicsScene.RemoveAvatar(PhysicsActor); | ||
1053 | PhysicsActor = null; | 1072 | PhysicsActor = null; |
1054 | } | 1073 | } |
1055 | // else | 1074 | // else |
@@ -1885,6 +1904,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
1885 | if (ParentID != 0) | 1904 | if (ParentID != 0) |
1886 | { | 1905 | { |
1887 | SceneObjectPart part = ParentPart; | 1906 | SceneObjectPart part = ParentPart; |
1907 | UnRegisterSeatControls(part.ParentGroup.UUID); | ||
1908 | |||
1888 | TaskInventoryDictionary taskIDict = part.TaskInventory; | 1909 | TaskInventoryDictionary taskIDict = part.TaskInventory; |
1889 | if (taskIDict != null) | 1910 | if (taskIDict != null) |
1890 | { | 1911 | { |
@@ -3212,7 +3233,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
3212 | 3233 | ||
3213 | foreach (ScriptControllers c in scriptedcontrols.Values) | 3234 | foreach (ScriptControllers c in scriptedcontrols.Values) |
3214 | { | 3235 | { |
3215 | controls[i++] = new ControllerData(c.itemID, (uint)c.ignoreControls, (uint)c.eventControls); | 3236 | controls[i++] = new ControllerData(c.objectID, c.itemID, (uint)c.ignoreControls, (uint)c.eventControls); |
3216 | } | 3237 | } |
3217 | cAgent.Controllers = controls; | 3238 | cAgent.Controllers = controls; |
3218 | } | 3239 | } |
@@ -3223,6 +3244,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
3223 | cAgent.Anims = Animator.Animations.ToArray(); | 3244 | cAgent.Anims = Animator.Animations.ToArray(); |
3224 | } | 3245 | } |
3225 | catch { } | 3246 | catch { } |
3247 | cAgent.DefaultAnim = Animator.Animations.DefaultAnimation; | ||
3226 | 3248 | ||
3227 | // Attachment objects | 3249 | // Attachment objects |
3228 | List<SceneObjectGroup> attachments = GetAttachments(); | 3250 | List<SceneObjectGroup> attachments = GetAttachments(); |
@@ -3302,6 +3324,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
3302 | foreach (ControllerData c in cAgent.Controllers) | 3324 | foreach (ControllerData c in cAgent.Controllers) |
3303 | { | 3325 | { |
3304 | ScriptControllers sc = new ScriptControllers(); | 3326 | ScriptControllers sc = new ScriptControllers(); |
3327 | sc.objectID = c.ObjectID; | ||
3305 | sc.itemID = c.ItemID; | 3328 | sc.itemID = c.ItemID; |
3306 | sc.ignoreControls = (ScriptControlled)c.IgnoreControls; | 3329 | sc.ignoreControls = (ScriptControlled)c.IgnoreControls; |
3307 | sc.eventControls = (ScriptControlled)c.EventControls; | 3330 | sc.eventControls = (ScriptControlled)c.EventControls; |
@@ -3316,6 +3339,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
3316 | // FIXME: Why is this null check necessary? Where are the cases where we get a null Anims object? | 3339 | // FIXME: Why is this null check necessary? Where are the cases where we get a null Anims object? |
3317 | if (cAgent.Anims != null) | 3340 | if (cAgent.Anims != null) |
3318 | Animator.Animations.FromArray(cAgent.Anims); | 3341 | Animator.Animations.FromArray(cAgent.Anims); |
3342 | if (cAgent.DefaultAnim != null) | ||
3343 | Animator.Animations.SetDefaultAnimation(cAgent.DefaultAnim.AnimID, cAgent.DefaultAnim.SequenceNum, UUID.Zero); | ||
3319 | 3344 | ||
3320 | if (cAgent.AttachmentObjects != null && cAgent.AttachmentObjects.Count > 0) | 3345 | if (cAgent.AttachmentObjects != null && cAgent.AttachmentObjects.Count > 0) |
3321 | { | 3346 | { |
@@ -3791,10 +3816,15 @@ namespace OpenSim.Region.Framework.Scenes | |||
3791 | 3816 | ||
3792 | public void RegisterControlEventsToScript(int controls, int accept, int pass_on, uint Obj_localID, UUID Script_item_UUID) | 3817 | public void RegisterControlEventsToScript(int controls, int accept, int pass_on, uint Obj_localID, UUID Script_item_UUID) |
3793 | { | 3818 | { |
3819 | SceneObjectPart p = m_scene.GetSceneObjectPart(Obj_localID); | ||
3820 | if (p == null) | ||
3821 | return; | ||
3822 | |||
3794 | ScriptControllers obj = new ScriptControllers(); | 3823 | ScriptControllers obj = new ScriptControllers(); |
3795 | obj.ignoreControls = ScriptControlled.CONTROL_ZERO; | 3824 | obj.ignoreControls = ScriptControlled.CONTROL_ZERO; |
3796 | obj.eventControls = ScriptControlled.CONTROL_ZERO; | 3825 | obj.eventControls = ScriptControlled.CONTROL_ZERO; |
3797 | 3826 | ||
3827 | obj.objectID = p.ParentGroup.UUID; | ||
3798 | obj.itemID = Script_item_UUID; | 3828 | obj.itemID = Script_item_UUID; |
3799 | if (pass_on == 0 && accept == 0) | 3829 | if (pass_on == 0 && accept == 0) |
3800 | { | 3830 | { |
@@ -3843,6 +3873,21 @@ namespace OpenSim.Region.Framework.Scenes | |||
3843 | ControllingClient.SendTakeControls(int.MaxValue, false, false); | 3873 | ControllingClient.SendTakeControls(int.MaxValue, false, false); |
3844 | } | 3874 | } |
3845 | 3875 | ||
3876 | private void UnRegisterSeatControls(UUID obj) | ||
3877 | { | ||
3878 | List<UUID> takers = new List<UUID>(); | ||
3879 | |||
3880 | foreach (ScriptControllers c in scriptedcontrols.Values) | ||
3881 | { | ||
3882 | if (c.objectID == obj) | ||
3883 | takers.Add(c.itemID); | ||
3884 | } | ||
3885 | foreach (UUID t in takers) | ||
3886 | { | ||
3887 | UnRegisterControlEventsToScript(0, t); | ||
3888 | } | ||
3889 | } | ||
3890 | |||
3846 | public void UnRegisterControlEventsToScript(uint Obj_localID, UUID Script_item_UUID) | 3891 | public void UnRegisterControlEventsToScript(uint Obj_localID, UUID Script_item_UUID) |
3847 | { | 3892 | { |
3848 | ScriptControllers takecontrols; | 3893 | ScriptControllers takecontrols; |
diff --git a/OpenSim/Region/Physics/UbitOdePlugin/ODECharacter.cs b/OpenSim/Region/Physics/UbitOdePlugin/ODECharacter.cs index 326fe97..b884b62 100644 --- a/OpenSim/Region/Physics/UbitOdePlugin/ODECharacter.cs +++ b/OpenSim/Region/Physics/UbitOdePlugin/ODECharacter.cs | |||
@@ -168,6 +168,10 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
168 | m_density = density; | 168 | m_density = density; |
169 | m_mass = 80f; // sure we have a default | 169 | m_mass = 80f; // sure we have a default |
170 | 170 | ||
171 | // force lower density for testing | ||
172 | m_density = 3.0f; | ||
173 | |||
174 | |||
171 | mu = parent_scene.AvatarFriction; | 175 | mu = parent_scene.AvatarFriction; |
172 | 176 | ||
173 | walkDivisor = walk_divisor; | 177 | walkDivisor = walk_divisor; |
@@ -1184,7 +1188,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1184 | // destroy avatar capsule and related ODE data | 1188 | // destroy avatar capsule and related ODE data |
1185 | AvatarGeomAndBodyDestroy(); | 1189 | AvatarGeomAndBodyDestroy(); |
1186 | } | 1190 | } |
1187 | 1191 | m_freemove = false; | |
1188 | m_isPhysical = NewStatus; | 1192 | m_isPhysical = NewStatus; |
1189 | } | 1193 | } |
1190 | } | 1194 | } |
@@ -1236,7 +1240,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1236 | + (Amotor == IntPtr.Zero ? "Amotor " : "")); | 1240 | + (Amotor == IntPtr.Zero ? "Amotor " : "")); |
1237 | } | 1241 | } |
1238 | } | 1242 | } |
1239 | 1243 | m_freemove = false; | |
1240 | m_pidControllerActive = true; | 1244 | m_pidControllerActive = true; |
1241 | } | 1245 | } |
1242 | else | 1246 | else |
@@ -1250,6 +1254,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1250 | if (Body != IntPtr.Zero) | 1254 | if (Body != IntPtr.Zero) |
1251 | d.BodySetPosition(Body, newPos.X, newPos.Y, newPos.Z); | 1255 | d.BodySetPosition(Body, newPos.X, newPos.Y, newPos.Z); |
1252 | _position = newPos; | 1256 | _position = newPos; |
1257 | m_freemove = false; | ||
1253 | m_pidControllerActive = true; | 1258 | m_pidControllerActive = true; |
1254 | } | 1259 | } |
1255 | 1260 | ||
@@ -1260,6 +1265,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1260 | private void changeVelocity(Vector3 newVel) | 1265 | private void changeVelocity(Vector3 newVel) |
1261 | { | 1266 | { |
1262 | m_pidControllerActive = true; | 1267 | m_pidControllerActive = true; |
1268 | m_freemove = false; | ||
1263 | _target_velocity = newVel; | 1269 | _target_velocity = newVel; |
1264 | } | 1270 | } |
1265 | 1271 | ||