aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Framework/Scenes
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Framework/Scenes')
-rw-r--r--OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs13
-rw-r--r--OpenSim/Region/Framework/Scenes/EventManager.cs172
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.Inventory.cs3
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.cs49
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneGraph.cs11
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs139
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectPart.cs342
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs6
-rw-r--r--OpenSim/Region/Framework/Scenes/ScenePresence.cs92
-rw-r--r--OpenSim/Region/Framework/Scenes/UndoState.cs79
10 files changed, 706 insertions, 200 deletions
diff --git a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs
index fd526eb..712dcc7 100644
--- a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs
+++ b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs
@@ -418,15 +418,12 @@ namespace OpenSim.Region.Framework.Scenes.Animation
418 { 418 {
419 if (m_scenePresence.IsChildAgent) 419 if (m_scenePresence.IsChildAgent)
420 return; 420 return;
421
422 UUID[] animIDs;
423 int[] sequenceNums;
424 UUID[] objectIDs;
425 421
426 m_animations.GetArrays(out animIDs, out sequenceNums, out objectIDs); 422 m_scenePresence.Scene.ForEachScenePresence(
427 423 delegate(ScenePresence SP)
428 m_scenePresence.ControllingClient.SendAnimations( 424 {
429 animIDs, sequenceNums, m_scenePresence.ControllingClient.AgentId, objectIDs); 425 SP.Animator.SendAnimPack();
426 });
430 } 427 }
431 428
432 /// <summary> 429 /// <summary>
diff --git a/OpenSim/Region/Framework/Scenes/EventManager.cs b/OpenSim/Region/Framework/Scenes/EventManager.cs
index 9f74b2a..57e1c37 100644
--- a/OpenSim/Region/Framework/Scenes/EventManager.cs
+++ b/OpenSim/Region/Framework/Scenes/EventManager.cs
@@ -209,7 +209,7 @@ namespace OpenSim.Region.Framework.Scenes
209 /// Triggered when an object or attachment enters a scene 209 /// Triggered when an object or attachment enters a scene
210 /// </summary> 210 /// </summary>
211 public event OnIncomingSceneObjectDelegate OnIncomingSceneObject; 211 public event OnIncomingSceneObjectDelegate OnIncomingSceneObject;
212 public delegate void OnIncomingSceneObjectDelegate(SceneObjectGroup so); 212 public delegate void OnIncomingSceneObjectDelegate(SceneObjectGroup so);
213 213
214 public delegate void NewInventoryItemUploadComplete(UUID avatarID, UUID assetID, string name, int userlevel); 214 public delegate void NewInventoryItemUploadComplete(UUID avatarID, UUID assetID, string name, int userlevel);
215 215
@@ -413,7 +413,7 @@ namespace OpenSim.Region.Framework.Scenes
413 } 413 }
414 } 414 }
415 } 415 }
416 } 416 }
417 417
418 public void TriggerGetScriptRunning(IClientAPI controllingClient, UUID objectID, UUID itemID) 418 public void TriggerGetScriptRunning(IClientAPI controllingClient, UUID objectID, UUID itemID)
419 { 419 {
@@ -433,7 +433,7 @@ namespace OpenSim.Region.Framework.Scenes
433 e.Message, e.StackTrace); 433 e.Message, e.StackTrace);
434 } 434 }
435 } 435 }
436 } 436 }
437 } 437 }
438 438
439 public void TriggerOnScriptChangedEvent(uint localID, uint change) 439 public void TriggerOnScriptChangedEvent(uint localID, uint change)
@@ -454,7 +454,7 @@ namespace OpenSim.Region.Framework.Scenes
454 e.Message, e.StackTrace); 454 e.Message, e.StackTrace);
455 } 455 }
456 } 456 }
457 } 457 }
458 } 458 }
459 459
460 public void TriggerOnClientMovement(ScenePresence avatar) 460 public void TriggerOnClientMovement(ScenePresence avatar)
@@ -475,7 +475,7 @@ namespace OpenSim.Region.Framework.Scenes
475 e.Message, e.StackTrace); 475 e.Message, e.StackTrace);
476 } 476 }
477 } 477 }
478 } 478 }
479 } 479 }
480 480
481 public void TriggerPermissionError(UUID user, string reason) 481 public void TriggerPermissionError(UUID user, string reason)
@@ -496,7 +496,7 @@ namespace OpenSim.Region.Framework.Scenes
496 e.Message, e.StackTrace); 496 e.Message, e.StackTrace);
497 } 497 }
498 } 498 }
499 } 499 }
500 } 500 }
501 501
502 public void TriggerOnPluginConsole(string[] args) 502 public void TriggerOnPluginConsole(string[] args)
@@ -517,7 +517,7 @@ namespace OpenSim.Region.Framework.Scenes
517 e.Message, e.StackTrace); 517 e.Message, e.StackTrace);
518 } 518 }
519 } 519 }
520 } 520 }
521 } 521 }
522 522
523 public void TriggerOnFrame() 523 public void TriggerOnFrame()
@@ -538,11 +538,11 @@ namespace OpenSim.Region.Framework.Scenes
538 e.Message, e.StackTrace); 538 e.Message, e.StackTrace);
539 } 539 }
540 } 540 }
541 } 541 }
542 } 542 }
543 543
544 public void TriggerOnNewClient(IClientAPI client) 544 public void TriggerOnNewClient(IClientAPI client)
545 { 545 {
546 OnNewClientDelegate handlerNewClient = OnNewClient; 546 OnNewClientDelegate handlerNewClient = OnNewClient;
547 if (handlerNewClient != null) 547 if (handlerNewClient != null)
548 { 548 {
@@ -559,10 +559,10 @@ namespace OpenSim.Region.Framework.Scenes
559 e.Message, e.StackTrace); 559 e.Message, e.StackTrace);
560 } 560 }
561 } 561 }
562 } 562 }
563 563
564 if (client is IClientCore) 564 if (client is IClientCore)
565 { 565 {
566 OnClientConnectCoreDelegate handlerClientConnect = OnClientConnect; 566 OnClientConnectCoreDelegate handlerClientConnect = OnClientConnect;
567 if (handlerClientConnect != null) 567 if (handlerClientConnect != null)
568 { 568 {
@@ -579,7 +579,7 @@ namespace OpenSim.Region.Framework.Scenes
579 e.Message, e.StackTrace); 579 e.Message, e.StackTrace);
580 } 580 }
581 } 581 }
582 } 582 }
583 } 583 }
584 } 584 }
585 585
@@ -601,11 +601,11 @@ namespace OpenSim.Region.Framework.Scenes
601 e.Message, e.StackTrace); 601 e.Message, e.StackTrace);
602 } 602 }
603 } 603 }
604 } 604 }
605 } 605 }
606 606
607 public void TriggerOnRemovePresence(UUID agentId) 607 public void TriggerOnRemovePresence(UUID agentId)
608 { 608 {
609 OnRemovePresenceDelegate handlerRemovePresence = OnRemovePresence; 609 OnRemovePresenceDelegate handlerRemovePresence = OnRemovePresence;
610 if (handlerRemovePresence != null) 610 if (handlerRemovePresence != null)
611 { 611 {
@@ -622,11 +622,11 @@ namespace OpenSim.Region.Framework.Scenes
622 e.Message, e.StackTrace); 622 e.Message, e.StackTrace);
623 } 623 }
624 } 624 }
625 } 625 }
626 } 626 }
627 627
628 public void TriggerOnBackup(IRegionDataStore dstore) 628 public void TriggerOnBackup(IRegionDataStore dstore)
629 { 629 {
630 OnBackupDelegate handlerOnAttach = OnBackup; 630 OnBackupDelegate handlerOnAttach = OnBackup;
631 if (handlerOnAttach != null) 631 if (handlerOnAttach != null)
632 { 632 {
@@ -643,7 +643,7 @@ namespace OpenSim.Region.Framework.Scenes
643 e.Message, e.StackTrace); 643 e.Message, e.StackTrace);
644 } 644 }
645 } 645 }
646 } 646 }
647 } 647 }
648 648
649 public void TriggerParcelPrimCountUpdate() 649 public void TriggerParcelPrimCountUpdate()
@@ -664,7 +664,7 @@ namespace OpenSim.Region.Framework.Scenes
664 e.Message, e.StackTrace); 664 e.Message, e.StackTrace);
665 } 665 }
666 } 666 }
667 } 667 }
668 } 668 }
669 669
670 public void TriggerMoneyTransfer(Object sender, MoneyTransferArgs args) 670 public void TriggerMoneyTransfer(Object sender, MoneyTransferArgs args)
@@ -685,7 +685,7 @@ namespace OpenSim.Region.Framework.Scenes
685 e.Message, e.StackTrace); 685 e.Message, e.StackTrace);
686 } 686 }
687 } 687 }
688 } 688 }
689 } 689 }
690 690
691 public void TriggerTerrainTick() 691 public void TriggerTerrainTick()
@@ -706,7 +706,7 @@ namespace OpenSim.Region.Framework.Scenes
706 e.Message, e.StackTrace); 706 e.Message, e.StackTrace);
707 } 707 }
708 } 708 }
709 } 709 }
710 } 710 }
711 711
712 public void TriggerParcelPrimCountAdd(SceneObjectGroup obj) 712 public void TriggerParcelPrimCountAdd(SceneObjectGroup obj)
@@ -727,7 +727,7 @@ namespace OpenSim.Region.Framework.Scenes
727 e.Message, e.StackTrace); 727 e.Message, e.StackTrace);
728 } 728 }
729 } 729 }
730 } 730 }
731 } 731 }
732 732
733 public void TriggerObjectBeingRemovedFromScene(SceneObjectGroup obj) 733 public void TriggerObjectBeingRemovedFromScene(SceneObjectGroup obj)
@@ -748,11 +748,11 @@ namespace OpenSim.Region.Framework.Scenes
748 e.Message, e.StackTrace); 748 e.Message, e.StackTrace);
749 } 749 }
750 } 750 }
751 } 751 }
752 } 752 }
753 753
754 public void TriggerShutdown() 754 public void TriggerShutdown()
755 { 755 {
756 OnShutdownDelegate handlerShutdown = OnShutdown; 756 OnShutdownDelegate handlerShutdown = OnShutdown;
757 if (handlerShutdown != null) 757 if (handlerShutdown != null)
758 { 758 {
@@ -769,11 +769,11 @@ namespace OpenSim.Region.Framework.Scenes
769 e.Message, e.StackTrace); 769 e.Message, e.StackTrace);
770 } 770 }
771 } 771 }
772 } 772 }
773 } 773 }
774 774
775 public void TriggerObjectGrab(uint localID, uint originalID, Vector3 offsetPos, IClientAPI remoteClient, SurfaceTouchEventArgs surfaceArgs) 775 public void TriggerObjectGrab(uint localID, uint originalID, Vector3 offsetPos, IClientAPI remoteClient, SurfaceTouchEventArgs surfaceArgs)
776 { 776 {
777 ObjectGrabDelegate handlerObjectGrab = OnObjectGrab; 777 ObjectGrabDelegate handlerObjectGrab = OnObjectGrab;
778 if (handlerObjectGrab != null) 778 if (handlerObjectGrab != null)
779 { 779 {
@@ -790,11 +790,11 @@ namespace OpenSim.Region.Framework.Scenes
790 e.Message, e.StackTrace); 790 e.Message, e.StackTrace);
791 } 791 }
792 } 792 }
793 } 793 }
794 } 794 }
795 795
796 public void TriggerObjectGrabbing(uint localID, uint originalID, Vector3 offsetPos, IClientAPI remoteClient, SurfaceTouchEventArgs surfaceArgs) 796 public void TriggerObjectGrabbing(uint localID, uint originalID, Vector3 offsetPos, IClientAPI remoteClient, SurfaceTouchEventArgs surfaceArgs)
797 { 797 {
798 ObjectGrabDelegate handlerObjectGrabbing = OnObjectGrabbing; 798 ObjectGrabDelegate handlerObjectGrabbing = OnObjectGrabbing;
799 if (handlerObjectGrabbing != null) 799 if (handlerObjectGrabbing != null)
800 { 800 {
@@ -811,11 +811,11 @@ namespace OpenSim.Region.Framework.Scenes
811 e.Message, e.StackTrace); 811 e.Message, e.StackTrace);
812 } 812 }
813 } 813 }
814 } 814 }
815 } 815 }
816 816
817 public void TriggerObjectDeGrab(uint localID, uint originalID, IClientAPI remoteClient, SurfaceTouchEventArgs surfaceArgs) 817 public void TriggerObjectDeGrab(uint localID, uint originalID, IClientAPI remoteClient, SurfaceTouchEventArgs surfaceArgs)
818 { 818 {
819 ObjectDeGrabDelegate handlerObjectDeGrab = OnObjectDeGrab; 819 ObjectDeGrabDelegate handlerObjectDeGrab = OnObjectDeGrab;
820 if (handlerObjectDeGrab != null) 820 if (handlerObjectDeGrab != null)
821 { 821 {
@@ -832,11 +832,11 @@ namespace OpenSim.Region.Framework.Scenes
832 e.Message, e.StackTrace); 832 e.Message, e.StackTrace);
833 } 833 }
834 } 834 }
835 } 835 }
836 } 836 }
837 837
838 public void TriggerScriptReset(uint localID, UUID itemID) 838 public void TriggerScriptReset(uint localID, UUID itemID)
839 { 839 {
840 ScriptResetDelegate handlerScriptReset = OnScriptReset; 840 ScriptResetDelegate handlerScriptReset = OnScriptReset;
841 if (handlerScriptReset != null) 841 if (handlerScriptReset != null)
842 { 842 {
@@ -853,11 +853,11 @@ namespace OpenSim.Region.Framework.Scenes
853 e.Message, e.StackTrace); 853 e.Message, e.StackTrace);
854 } 854 }
855 } 855 }
856 } 856 }
857 } 857 }
858 858
859 public void TriggerRezScript(uint localID, UUID itemID, string script, int startParam, bool postOnRez, string engine, int stateSource) 859 public void TriggerRezScript(uint localID, UUID itemID, string script, int startParam, bool postOnRez, string engine, int stateSource)
860 { 860 {
861 NewRezScript handlerRezScript = OnRezScript; 861 NewRezScript handlerRezScript = OnRezScript;
862 if (handlerRezScript != null) 862 if (handlerRezScript != null)
863 { 863 {
@@ -874,7 +874,7 @@ namespace OpenSim.Region.Framework.Scenes
874 e.Message, e.StackTrace); 874 e.Message, e.StackTrace);
875 } 875 }
876 } 876 }
877 } 877 }
878 } 878 }
879 879
880 public void TriggerStartScript(uint localID, UUID itemID) 880 public void TriggerStartScript(uint localID, UUID itemID)
@@ -895,7 +895,7 @@ namespace OpenSim.Region.Framework.Scenes
895 e.Message, e.StackTrace); 895 e.Message, e.StackTrace);
896 } 896 }
897 } 897 }
898 } 898 }
899 } 899 }
900 900
901 public void TriggerStopScript(uint localID, UUID itemID) 901 public void TriggerStopScript(uint localID, UUID itemID)
@@ -916,11 +916,11 @@ namespace OpenSim.Region.Framework.Scenes
916 e.Message, e.StackTrace); 916 e.Message, e.StackTrace);
917 } 917 }
918 } 918 }
919 } 919 }
920 } 920 }
921 921
922 public void TriggerRemoveScript(uint localID, UUID itemID) 922 public void TriggerRemoveScript(uint localID, UUID itemID)
923 { 923 {
924 RemoveScript handlerRemoveScript = OnRemoveScript; 924 RemoveScript handlerRemoveScript = OnRemoveScript;
925 if (handlerRemoveScript != null) 925 if (handlerRemoveScript != null)
926 { 926 {
@@ -937,7 +937,7 @@ namespace OpenSim.Region.Framework.Scenes
937 e.Message, e.StackTrace); 937 e.Message, e.StackTrace);
938 } 938 }
939 } 939 }
940 } 940 }
941 } 941 }
942 942
943 public bool TriggerGroupMove(UUID groupID, Vector3 delta) 943 public bool TriggerGroupMove(UUID groupID, Vector3 delta)
@@ -1036,7 +1036,7 @@ namespace OpenSim.Region.Framework.Scenes
1036 e.Message, e.StackTrace); 1036 e.Message, e.StackTrace);
1037 } 1037 }
1038 } 1038 }
1039 } 1039 }
1040 } 1040 }
1041 1041
1042 public void TriggerLandObjectAdded(ILandObject newParcel) 1042 public void TriggerLandObjectAdded(ILandObject newParcel)
@@ -1057,7 +1057,7 @@ namespace OpenSim.Region.Framework.Scenes
1057 e.Message, e.StackTrace); 1057 e.Message, e.StackTrace);
1058 } 1058 }
1059 } 1059 }
1060 } 1060 }
1061 } 1061 }
1062 1062
1063 public void TriggerLandObjectRemoved(UUID globalID) 1063 public void TriggerLandObjectRemoved(UUID globalID)
@@ -1078,7 +1078,7 @@ namespace OpenSim.Region.Framework.Scenes
1078 e.Message, e.StackTrace); 1078 e.Message, e.StackTrace);
1079 } 1079 }
1080 } 1080 }
1081 } 1081 }
1082 } 1082 }
1083 1083
1084 public void TriggerLandObjectUpdated(uint localParcelID, ILandObject newParcel) 1084 public void TriggerLandObjectUpdated(uint localParcelID, ILandObject newParcel)
@@ -1104,7 +1104,7 @@ namespace OpenSim.Region.Framework.Scenes
1104 e.Message, e.StackTrace); 1104 e.Message, e.StackTrace);
1105 } 1105 }
1106 } 1106 }
1107 } 1107 }
1108 } 1108 }
1109 1109
1110 public void TriggerIncomingInstantMessage(GridInstantMessage message) 1110 public void TriggerIncomingInstantMessage(GridInstantMessage message)
@@ -1125,7 +1125,7 @@ namespace OpenSim.Region.Framework.Scenes
1125 e.Message, e.StackTrace); 1125 e.Message, e.StackTrace);
1126 } 1126 }
1127 } 1127 }
1128 } 1128 }
1129 } 1129 }
1130 1130
1131 public void TriggerUnhandledInstantMessage(GridInstantMessage message) 1131 public void TriggerUnhandledInstantMessage(GridInstantMessage message)
@@ -1146,7 +1146,7 @@ namespace OpenSim.Region.Framework.Scenes
1146 e.Message, e.StackTrace); 1146 e.Message, e.StackTrace);
1147 } 1147 }
1148 } 1148 }
1149 } 1149 }
1150 } 1150 }
1151 1151
1152 public void TriggerClientClosed(UUID ClientID, Scene scene) 1152 public void TriggerClientClosed(UUID ClientID, Scene scene)
@@ -1167,7 +1167,7 @@ namespace OpenSim.Region.Framework.Scenes
1167 e.Message, e.StackTrace); 1167 e.Message, e.StackTrace);
1168 } 1168 }
1169 } 1169 }
1170 } 1170 }
1171 } 1171 }
1172 1172
1173 public void TriggerOnMakeChildAgent(ScenePresence presence) 1173 public void TriggerOnMakeChildAgent(ScenePresence presence)
@@ -1188,7 +1188,7 @@ namespace OpenSim.Region.Framework.Scenes
1188 e.Message, e.StackTrace); 1188 e.Message, e.StackTrace);
1189 } 1189 }
1190 } 1190 }
1191 } 1191 }
1192 } 1192 }
1193 1193
1194 public void TriggerOnMakeRootAgent(ScenePresence presence) 1194 public void TriggerOnMakeRootAgent(ScenePresence presence)
@@ -1209,7 +1209,7 @@ namespace OpenSim.Region.Framework.Scenes
1209 e.Message, e.StackTrace); 1209 e.Message, e.StackTrace);
1210 } 1210 }
1211 } 1211 }
1212 } 1212 }
1213 } 1213 }
1214 1214
1215 public void TriggerOnIncomingSceneObject(SceneObjectGroup so) 1215 public void TriggerOnIncomingSceneObject(SceneObjectGroup so)
@@ -1229,12 +1229,12 @@ namespace OpenSim.Region.Framework.Scenes
1229 "[EVENT MANAGER]: Delegate for TriggerOnIncomingSceneObject failed - continuing. {0} {1}", 1229 "[EVENT MANAGER]: Delegate for TriggerOnIncomingSceneObject failed - continuing. {0} {1}",
1230 e.Message, e.StackTrace); 1230 e.Message, e.StackTrace);
1231 } 1231 }
1232 } 1232 }
1233 } 1233 }
1234 } 1234 }
1235 1235
1236 public void TriggerOnRegisterCaps(UUID agentID, Caps caps) 1236 public void TriggerOnRegisterCaps(UUID agentID, Caps caps)
1237 { 1237 {
1238 RegisterCapsEvent handlerRegisterCaps = OnRegisterCaps; 1238 RegisterCapsEvent handlerRegisterCaps = OnRegisterCaps;
1239 if (handlerRegisterCaps != null) 1239 if (handlerRegisterCaps != null)
1240 { 1240 {
@@ -1251,7 +1251,7 @@ namespace OpenSim.Region.Framework.Scenes
1251 e.Message, e.StackTrace); 1251 e.Message, e.StackTrace);
1252 } 1252 }
1253 } 1253 }
1254 } 1254 }
1255 } 1255 }
1256 1256
1257 public void TriggerOnDeregisterCaps(UUID agentID, Caps caps) 1257 public void TriggerOnDeregisterCaps(UUID agentID, Caps caps)
@@ -1272,7 +1272,7 @@ namespace OpenSim.Region.Framework.Scenes
1272 e.Message, e.StackTrace); 1272 e.Message, e.StackTrace);
1273 } 1273 }
1274 } 1274 }
1275 } 1275 }
1276 } 1276 }
1277 1277
1278 public void TriggerOnNewInventoryItemUploadComplete(UUID agentID, UUID AssetID, String AssetName, int userlevel) 1278 public void TriggerOnNewInventoryItemUploadComplete(UUID agentID, UUID AssetID, String AssetName, int userlevel)
@@ -1293,7 +1293,7 @@ namespace OpenSim.Region.Framework.Scenes
1293 e.Message, e.StackTrace); 1293 e.Message, e.StackTrace);
1294 } 1294 }
1295 } 1295 }
1296 } 1296 }
1297 } 1297 }
1298 1298
1299 public void TriggerLandBuy(Object sender, LandBuyArgs args) 1299 public void TriggerLandBuy(Object sender, LandBuyArgs args)
@@ -1314,7 +1314,7 @@ namespace OpenSim.Region.Framework.Scenes
1314 e.Message, e.StackTrace); 1314 e.Message, e.StackTrace);
1315 } 1315 }
1316 } 1316 }
1317 } 1317 }
1318 } 1318 }
1319 1319
1320 public void TriggerValidateLandBuy(Object sender, LandBuyArgs args) 1320 public void TriggerValidateLandBuy(Object sender, LandBuyArgs args)
@@ -1335,11 +1335,11 @@ namespace OpenSim.Region.Framework.Scenes
1335 e.Message, e.StackTrace); 1335 e.Message, e.StackTrace);
1336 } 1336 }
1337 } 1337 }
1338 } 1338 }
1339 } 1339 }
1340 1340
1341 public void TriggerAtTargetEvent(uint localID, uint handle, Vector3 targetpos, Vector3 currentpos) 1341 public void TriggerAtTargetEvent(uint localID, uint handle, Vector3 targetpos, Vector3 currentpos)
1342 { 1342 {
1343 ScriptAtTargetEvent handlerScriptAtTargetEvent = OnScriptAtTargetEvent; 1343 ScriptAtTargetEvent handlerScriptAtTargetEvent = OnScriptAtTargetEvent;
1344 if (handlerScriptAtTargetEvent != null) 1344 if (handlerScriptAtTargetEvent != null)
1345 { 1345 {
@@ -1356,7 +1356,7 @@ namespace OpenSim.Region.Framework.Scenes
1356 e.Message, e.StackTrace); 1356 e.Message, e.StackTrace);
1357 } 1357 }
1358 } 1358 }
1359 } 1359 }
1360 } 1360 }
1361 1361
1362 public void TriggerNotAtTargetEvent(uint localID) 1362 public void TriggerNotAtTargetEvent(uint localID)
@@ -1377,11 +1377,11 @@ namespace OpenSim.Region.Framework.Scenes
1377 e.Message, e.StackTrace); 1377 e.Message, e.StackTrace);
1378 } 1378 }
1379 } 1379 }
1380 } 1380 }
1381 } 1381 }
1382 1382
1383 public void TriggerAtRotTargetEvent(uint localID, uint handle, Quaternion targetrot, Quaternion currentrot) 1383 public void TriggerAtRotTargetEvent(uint localID, uint handle, Quaternion targetrot, Quaternion currentrot)
1384 { 1384 {
1385 ScriptAtRotTargetEvent handlerScriptAtRotTargetEvent = OnScriptAtRotTargetEvent; 1385 ScriptAtRotTargetEvent handlerScriptAtRotTargetEvent = OnScriptAtRotTargetEvent;
1386 if (handlerScriptAtRotTargetEvent != null) 1386 if (handlerScriptAtRotTargetEvent != null)
1387 { 1387 {
@@ -1398,7 +1398,7 @@ namespace OpenSim.Region.Framework.Scenes
1398 e.Message, e.StackTrace); 1398 e.Message, e.StackTrace);
1399 } 1399 }
1400 } 1400 }
1401 } 1401 }
1402 } 1402 }
1403 1403
1404 public void TriggerNotAtRotTargetEvent(uint localID) 1404 public void TriggerNotAtRotTargetEvent(uint localID)
@@ -1419,7 +1419,7 @@ namespace OpenSim.Region.Framework.Scenes
1419 e.Message, e.StackTrace); 1419 e.Message, e.StackTrace);
1420 } 1420 }
1421 } 1421 }
1422 } 1422 }
1423 } 1423 }
1424 1424
1425 public void TriggerRequestChangeWaterHeight(float height) 1425 public void TriggerRequestChangeWaterHeight(float height)
@@ -1440,7 +1440,7 @@ namespace OpenSim.Region.Framework.Scenes
1440 e.Message, e.StackTrace); 1440 e.Message, e.StackTrace);
1441 } 1441 }
1442 } 1442 }
1443 } 1443 }
1444 } 1444 }
1445 1445
1446 public void TriggerAvatarKill(uint KillerObjectLocalID, ScenePresence DeadAvatar) 1446 public void TriggerAvatarKill(uint KillerObjectLocalID, ScenePresence DeadAvatar)
@@ -1461,7 +1461,7 @@ namespace OpenSim.Region.Framework.Scenes
1461 e.Message, e.StackTrace); 1461 e.Message, e.StackTrace);
1462 } 1462 }
1463 } 1463 }
1464 } 1464 }
1465 } 1465 }
1466 1466
1467 public void TriggerSignificantClientMovement(IClientAPI client) 1467 public void TriggerSignificantClientMovement(IClientAPI client)
@@ -1482,7 +1482,7 @@ namespace OpenSim.Region.Framework.Scenes
1482 e.Message, e.StackTrace); 1482 e.Message, e.StackTrace);
1483 } 1483 }
1484 } 1484 }
1485 } 1485 }
1486 } 1486 }
1487 1487
1488 public void TriggerOnChatFromWorld(Object sender, OSChatMessage chat) 1488 public void TriggerOnChatFromWorld(Object sender, OSChatMessage chat)
@@ -1503,7 +1503,7 @@ namespace OpenSim.Region.Framework.Scenes
1503 e.Message, e.StackTrace); 1503 e.Message, e.StackTrace);
1504 } 1504 }
1505 } 1505 }
1506 } 1506 }
1507 } 1507 }
1508 1508
1509 public void TriggerOnChatFromClient(Object sender, OSChatMessage chat) 1509 public void TriggerOnChatFromClient(Object sender, OSChatMessage chat)
@@ -1524,7 +1524,7 @@ namespace OpenSim.Region.Framework.Scenes
1524 e.Message, e.StackTrace); 1524 e.Message, e.StackTrace);
1525 } 1525 }
1526 } 1526 }
1527 } 1527 }
1528 } 1528 }
1529 1529
1530 public void TriggerOnChatBroadcast(Object sender, OSChatMessage chat) 1530 public void TriggerOnChatBroadcast(Object sender, OSChatMessage chat)
@@ -1545,7 +1545,7 @@ namespace OpenSim.Region.Framework.Scenes
1545 e.Message, e.StackTrace); 1545 e.Message, e.StackTrace);
1546 } 1546 }
1547 } 1547 }
1548 } 1548 }
1549 } 1549 }
1550 1550
1551 internal void TriggerControlEvent(uint p, UUID scriptUUID, UUID avatarID, uint held, uint _changed) 1551 internal void TriggerControlEvent(uint p, UUID scriptUUID, UUID avatarID, uint held, uint _changed)
@@ -1566,7 +1566,7 @@ namespace OpenSim.Region.Framework.Scenes
1566 e.Message, e.StackTrace); 1566 e.Message, e.StackTrace);
1567 } 1567 }
1568 } 1568 }
1569 } 1569 }
1570 } 1570 }
1571 1571
1572 public void TriggerNoticeNoLandDataFromStorage() 1572 public void TriggerNoticeNoLandDataFromStorage()
@@ -1587,7 +1587,7 @@ namespace OpenSim.Region.Framework.Scenes
1587 e.Message, e.StackTrace); 1587 e.Message, e.StackTrace);
1588 } 1588 }
1589 } 1589 }
1590 } 1590 }
1591 } 1591 }
1592 1592
1593 public void TriggerIncomingLandDataFromStorage(List<LandData> landData) 1593 public void TriggerIncomingLandDataFromStorage(List<LandData> landData)
@@ -1608,7 +1608,7 @@ namespace OpenSim.Region.Framework.Scenes
1608 e.Message, e.StackTrace); 1608 e.Message, e.StackTrace);
1609 } 1609 }
1610 } 1610 }
1611 } 1611 }
1612 } 1612 }
1613 1613
1614 public void TriggerSetAllowForcefulBan(bool allow) 1614 public void TriggerSetAllowForcefulBan(bool allow)
@@ -1629,7 +1629,7 @@ namespace OpenSim.Region.Framework.Scenes
1629 e.Message, e.StackTrace); 1629 e.Message, e.StackTrace);
1630 } 1630 }
1631 } 1631 }
1632 } 1632 }
1633 } 1633 }
1634 1634
1635 public void TriggerRequestParcelPrimCountUpdate() 1635 public void TriggerRequestParcelPrimCountUpdate()
@@ -1650,7 +1650,7 @@ namespace OpenSim.Region.Framework.Scenes
1650 e.Message, e.StackTrace); 1650 e.Message, e.StackTrace);
1651 } 1651 }
1652 } 1652 }
1653 } 1653 }
1654 } 1654 }
1655 1655
1656 public void TriggerParcelPrimCountTainted() 1656 public void TriggerParcelPrimCountTainted()
@@ -1671,7 +1671,7 @@ namespace OpenSim.Region.Framework.Scenes
1671 e.Message, e.StackTrace); 1671 e.Message, e.StackTrace);
1672 } 1672 }
1673 } 1673 }
1674 } 1674 }
1675 } 1675 }
1676 1676
1677 // this lets us keep track of nasty script events like timer, etc. 1677 // this lets us keep track of nasty script events like timer, etc.
@@ -1710,7 +1710,7 @@ namespace OpenSim.Region.Framework.Scenes
1710 e.Message, e.StackTrace); 1710 e.Message, e.StackTrace);
1711 } 1711 }
1712 } 1712 }
1713 } 1713 }
1714 } 1714 }
1715 1715
1716 public float GetCurrentTimeAsSunLindenHour() 1716 public float GetCurrentTimeAsSunLindenHour()
@@ -1737,7 +1737,7 @@ namespace OpenSim.Region.Framework.Scenes
1737 } 1737 }
1738 1738
1739 public void TriggerOarFileLoaded(Guid requestId, string message) 1739 public void TriggerOarFileLoaded(Guid requestId, string message)
1740 { 1740 {
1741 OarFileLoaded handlerOarFileLoaded = OnOarFileLoaded; 1741 OarFileLoaded handlerOarFileLoaded = OnOarFileLoaded;
1742 if (handlerOarFileLoaded != null) 1742 if (handlerOarFileLoaded != null)
1743 { 1743 {
@@ -1754,7 +1754,7 @@ namespace OpenSim.Region.Framework.Scenes
1754 e.Message, e.StackTrace); 1754 e.Message, e.StackTrace);
1755 } 1755 }
1756 } 1756 }
1757 } 1757 }
1758 } 1758 }
1759 1759
1760 public void TriggerOarFileSaved(Guid requestId, string message) 1760 public void TriggerOarFileSaved(Guid requestId, string message)
@@ -1775,7 +1775,7 @@ namespace OpenSim.Region.Framework.Scenes
1775 e.Message, e.StackTrace); 1775 e.Message, e.StackTrace);
1776 } 1776 }
1777 } 1777 }
1778 } 1778 }
1779 } 1779 }
1780 1780
1781 public void TriggerEmptyScriptCompileQueue(int numScriptsFailed, string message) 1781 public void TriggerEmptyScriptCompileQueue(int numScriptsFailed, string message)
@@ -1796,7 +1796,7 @@ namespace OpenSim.Region.Framework.Scenes
1796 e.Message, e.StackTrace); 1796 e.Message, e.StackTrace);
1797 } 1797 }
1798 } 1798 }
1799 } 1799 }
1800 } 1800 }
1801 1801
1802 public void TriggerScriptCollidingStart(uint localId, ColliderArgs colliders) 1802 public void TriggerScriptCollidingStart(uint localId, ColliderArgs colliders)
@@ -1817,7 +1817,7 @@ namespace OpenSim.Region.Framework.Scenes
1817 e.Message, e.StackTrace); 1817 e.Message, e.StackTrace);
1818 } 1818 }
1819 } 1819 }
1820 } 1820 }
1821 } 1821 }
1822 1822
1823 public void TriggerScriptColliding(uint localId, ColliderArgs colliders) 1823 public void TriggerScriptColliding(uint localId, ColliderArgs colliders)
@@ -1838,7 +1838,7 @@ namespace OpenSim.Region.Framework.Scenes
1838 e.Message, e.StackTrace); 1838 e.Message, e.StackTrace);
1839 } 1839 }
1840 } 1840 }
1841 } 1841 }
1842 } 1842 }
1843 1843
1844 public void TriggerScriptCollidingEnd(uint localId, ColliderArgs colliders) 1844 public void TriggerScriptCollidingEnd(uint localId, ColliderArgs colliders)
@@ -1859,7 +1859,7 @@ namespace OpenSim.Region.Framework.Scenes
1859 e.Message, e.StackTrace); 1859 e.Message, e.StackTrace);
1860 } 1860 }
1861 } 1861 }
1862 } 1862 }
1863 } 1863 }
1864 1864
1865 public void TriggerScriptLandCollidingStart(uint localId, ColliderArgs colliders) 1865 public void TriggerScriptLandCollidingStart(uint localId, ColliderArgs colliders)
@@ -1880,7 +1880,7 @@ namespace OpenSim.Region.Framework.Scenes
1880 e.Message, e.StackTrace); 1880 e.Message, e.StackTrace);
1881 } 1881 }
1882 } 1882 }
1883 } 1883 }
1884 } 1884 }
1885 1885
1886 public void TriggerScriptLandColliding(uint localId, ColliderArgs colliders) 1886 public void TriggerScriptLandColliding(uint localId, ColliderArgs colliders)
@@ -1901,7 +1901,7 @@ namespace OpenSim.Region.Framework.Scenes
1901 e.Message, e.StackTrace); 1901 e.Message, e.StackTrace);
1902 } 1902 }
1903 } 1903 }
1904 } 1904 }
1905 } 1905 }
1906 1906
1907 public void TriggerScriptLandCollidingEnd(uint localId, ColliderArgs colliders) 1907 public void TriggerScriptLandCollidingEnd(uint localId, ColliderArgs colliders)
@@ -1922,11 +1922,11 @@ namespace OpenSim.Region.Framework.Scenes
1922 e.Message, e.StackTrace); 1922 e.Message, e.StackTrace);
1923 } 1923 }
1924 } 1924 }
1925 } 1925 }
1926 } 1926 }
1927 1927
1928 public void TriggerSetRootAgentScene(UUID agentID, Scene scene) 1928 public void TriggerSetRootAgentScene(UUID agentID, Scene scene)
1929 { 1929 {
1930 OnSetRootAgentSceneDelegate handlerSetRootAgentScene = OnSetRootAgentScene; 1930 OnSetRootAgentSceneDelegate handlerSetRootAgentScene = OnSetRootAgentScene;
1931 if (handlerSetRootAgentScene != null) 1931 if (handlerSetRootAgentScene != null)
1932 { 1932 {
@@ -1943,7 +1943,7 @@ namespace OpenSim.Region.Framework.Scenes
1943 e.Message, e.StackTrace); 1943 e.Message, e.StackTrace);
1944 } 1944 }
1945 } 1945 }
1946 } 1946 }
1947 } 1947 }
1948 1948
1949 public void TriggerOnRegionUp(GridRegion otherRegion) 1949 public void TriggerOnRegionUp(GridRegion otherRegion)
@@ -1964,7 +1964,7 @@ namespace OpenSim.Region.Framework.Scenes
1964 e.Message, e.StackTrace); 1964 e.Message, e.StackTrace);
1965 } 1965 }
1966 } 1966 }
1967 } 1967 }
1968 } 1968 }
1969 } 1969 }
1970} \ No newline at end of file 1970} \ No newline at end of file
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index 7df3e50..c6cee75 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -585,6 +585,9 @@ namespace OpenSim.Region.Framework.Scenes
585 m_log.Error("[AGENT INVENTORY]: Failed to find item " + oldItemID.ToString()); 585 m_log.Error("[AGENT INVENTORY]: Failed to find item " + oldItemID.ToString());
586 return; 586 return;
587 } 587 }
588
589 if ((item.CurrentPermissions & (uint)PermissionMask.Copy) == 0)
590 return;
588 } 591 }
589 592
590 AssetBase asset = AssetService.Get(item.AssetID.ToString()); 593 AssetBase asset = AssetService.Get(item.AssetID.ToString());
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 2909311..41fd1e1 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -1976,6 +1976,23 @@ namespace OpenSim.Region.Framework.Scenes
1976 return; 1976 return;
1977 } 1977 }
1978 1978
1979 if (grp.RootPart.RETURN_AT_EDGE)
1980 {
1981 // We remove the object here
1982 try
1983 {
1984 List<SceneObjectGroup> objects = new List<SceneObjectGroup>();
1985 objects.Add(grp);
1986 SceneObjectGroup[] objectsArray = objects.ToArray();
1987 returnObjects(objectsArray, UUID.Zero);
1988 }
1989 catch (Exception)
1990 {
1991 m_log.Warn("[DATABASE]: exception when trying to return the prim that crossed the border.");
1992 }
1993 return;
1994 }
1995
1979 int thisx = (int)RegionInfo.RegionLocX; 1996 int thisx = (int)RegionInfo.RegionLocX;
1980 int thisy = (int)RegionInfo.RegionLocY; 1997 int thisy = (int)RegionInfo.RegionLocY;
1981 Vector3 EastCross = new Vector3(0.1f,0,0); 1998 Vector3 EastCross = new Vector3(0.1f,0,0);
@@ -2044,19 +2061,25 @@ namespace OpenSim.Region.Framework.Scenes
2044 Border crossedBordery = GetCrossedBorder(attemptedPosition + SouthCross, Cardinals.S); 2061 Border crossedBordery = GetCrossedBorder(attemptedPosition + SouthCross, Cardinals.S);
2045 //(crossedBorderx.BorderLine.Z / (int)Constants.RegionSize) 2062 //(crossedBorderx.BorderLine.Z / (int)Constants.RegionSize)
2046 2063
2047 if (crossedBordery.BorderLine.Z > 0) 2064 try
2048 { 2065 {
2049 pos.Y = ((pos.Y + crossedBordery.BorderLine.Z)); 2066 if (crossedBordery.BorderLine.Z > 0)
2050 changeY = (int)(crossedBordery.BorderLine.Z / (int)Constants.RegionSize); 2067 {
2051 } 2068 pos.Y = ((pos.Y + crossedBordery.BorderLine.Z));
2052 else 2069 changeY = (int)(crossedBordery.BorderLine.Z / (int)Constants.RegionSize);
2053 pos.Y = ((pos.Y + Constants.RegionSize)); 2070 }
2071 else
2072 pos.Y = ((pos.Y + Constants.RegionSize));
2054 2073
2055 newRegionHandle 2074 newRegionHandle
2056 = Util.UIntsToLong((uint)((thisx - changeX) * Constants.RegionSize), 2075 = Util.UIntsToLong((uint)((thisx - changeX) * Constants.RegionSize),
2057 (uint)((thisy + changeY) * Constants.RegionSize)); 2076 (uint)((thisy + changeY) * Constants.RegionSize));
2058 // x - 1 2077 // x - 1
2059 // y + 1 2078 // y + 1
2079 }
2080 catch (Exception ex)
2081 {
2082 }
2060 } 2083 }
2061 else 2084 else
2062 { 2085 {
@@ -2518,7 +2541,7 @@ namespace OpenSim.Region.Framework.Scenes
2518 AttachObject( 2541 AttachObject(
2519 sp.ControllingClient, grp.LocalId, (uint)0, grp.GroupRotation, grp.AbsolutePosition, false); 2542 sp.ControllingClient, grp.LocalId, (uint)0, grp.GroupRotation, grp.AbsolutePosition, false);
2520 RootPrim.RemFlag(PrimFlags.TemporaryOnRez); 2543 RootPrim.RemFlag(PrimFlags.TemporaryOnRez);
2521 grp.SendGroupFullUpdate(); 2544 grp.SendGroupFullUpdate();
2522 } 2545 }
2523 else 2546 else
2524 { 2547 {
@@ -2684,6 +2707,7 @@ namespace OpenSim.Region.Framework.Scenes
2684 client.OnGrabUpdate += ProcessObjectGrabUpdate; 2707 client.OnGrabUpdate += ProcessObjectGrabUpdate;
2685 client.OnDeGrabObject += ProcessObjectDeGrab; 2708 client.OnDeGrabObject += ProcessObjectDeGrab;
2686 client.OnUndo += m_sceneGraph.HandleUndo; 2709 client.OnUndo += m_sceneGraph.HandleUndo;
2710 client.OnRedo += m_sceneGraph.HandleRedo;
2687 client.OnObjectDescription += m_sceneGraph.PrimDescription; 2711 client.OnObjectDescription += m_sceneGraph.PrimDescription;
2688 client.OnObjectDrop += m_sceneGraph.DropObject; 2712 client.OnObjectDrop += m_sceneGraph.DropObject;
2689 client.OnObjectSaleInfo += ObjectSaleInfo; 2713 client.OnObjectSaleInfo += ObjectSaleInfo;
@@ -2838,6 +2862,7 @@ namespace OpenSim.Region.Framework.Scenes
2838 client.OnGrabObject -= ProcessObjectGrab; 2862 client.OnGrabObject -= ProcessObjectGrab;
2839 client.OnDeGrabObject -= ProcessObjectDeGrab; 2863 client.OnDeGrabObject -= ProcessObjectDeGrab;
2840 client.OnUndo -= m_sceneGraph.HandleUndo; 2864 client.OnUndo -= m_sceneGraph.HandleUndo;
2865 client.OnRedo -= m_sceneGraph.HandleRedo;
2841 client.OnObjectDescription -= m_sceneGraph.PrimDescription; 2866 client.OnObjectDescription -= m_sceneGraph.PrimDescription;
2842 client.OnObjectDrop -= m_sceneGraph.DropObject; 2867 client.OnObjectDrop -= m_sceneGraph.DropObject;
2843 client.OnObjectSaleInfo -= ObjectSaleInfo; 2868 client.OnObjectSaleInfo -= ObjectSaleInfo;
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
index 1ac061a..321cc45 100644
--- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
@@ -452,6 +452,15 @@ namespace OpenSim.Region.Framework.Scenes
452 part.Undo(); 452 part.Undo();
453 } 453 }
454 } 454 }
455 protected internal void HandleRedo(IClientAPI remoteClient, UUID primId)
456 {
457 if (primId != UUID.Zero)
458 {
459 SceneObjectPart part = m_parentScene.GetSceneObjectPart(primId);
460 if (part != null)
461 part.Redo();
462 }
463 }
455 464
456 protected internal void HandleObjectGroupUpdate( 465 protected internal void HandleObjectGroupUpdate(
457 IClientAPI remoteClient, UUID GroupID, uint objectLocalID, UUID Garbage) 466 IClientAPI remoteClient, UUID GroupID, uint objectLocalID, UUID Garbage)
@@ -633,7 +642,7 @@ namespace OpenSim.Region.Framework.Scenes
633 // it get cleaned up 642 // it get cleaned up
634 // 643 //
635 group.RootPart.RemFlag(PrimFlags.TemporaryOnRez); 644 group.RootPart.RemFlag(PrimFlags.TemporaryOnRez);
636 group.HasGroupChanged = false; 645 group.HasGroupChanged = false;
637 } 646 }
638 else 647 else
639 { 648 {
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 94e64e4..6357192 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -298,7 +298,16 @@ namespace OpenSim.Region.Framework.Scenes
298 { 298 {
299 m_scene.CrossPrimGroupIntoNewRegion(val, this, true); 299 m_scene.CrossPrimGroupIntoNewRegion(val, this, true);
300 } 300 }
301 301 if (RootPart.GetStatusSandbox())
302 {
303 if (Util.GetDistanceTo(RootPart.StatusSandboxPos, value) > 10)
304 {
305 RootPart.ScriptSetPhysicsStatus(false);
306 Scene.SimChat(Utils.StringToBytes("Hit Sandbox Limit"),
307 ChatTypeEnum.DebugChannel, 0x7FFFFFFF, RootPart.AbsolutePosition, Name, UUID, false);
308 return;
309 }
310 }
302 lock (m_parts) 311 lock (m_parts)
303 { 312 {
304 foreach (SceneObjectPart part in m_parts.Values) 313 foreach (SceneObjectPart part in m_parts.Values)
@@ -398,6 +407,34 @@ namespace OpenSim.Region.Framework.Scenes
398 } 407 }
399 } 408 }
400 409
410 private SceneObjectPart m_PlaySoundMasterPrim = null;
411 public SceneObjectPart PlaySoundMasterPrim
412 {
413 get { return m_PlaySoundMasterPrim; }
414 set { m_PlaySoundMasterPrim = value; }
415 }
416
417 private List<SceneObjectPart> m_PlaySoundSlavePrims = new List<SceneObjectPart>();
418 public List<SceneObjectPart> PlaySoundSlavePrims
419 {
420 get { return m_LoopSoundSlavePrims; }
421 set { m_LoopSoundSlavePrims = value; }
422 }
423
424 private SceneObjectPart m_LoopSoundMasterPrim = null;
425 public SceneObjectPart LoopSoundMasterPrim
426 {
427 get { return m_LoopSoundMasterPrim; }
428 set { m_LoopSoundMasterPrim = value; }
429 }
430
431 private List<SceneObjectPart> m_LoopSoundSlavePrims = new List<SceneObjectPart>();
432 public List<SceneObjectPart> LoopSoundSlavePrims
433 {
434 get { return m_LoopSoundSlavePrims; }
435 set { m_LoopSoundSlavePrims = value; }
436 }
437
401 // The UUID for the Region this Object is in. 438 // The UUID for the Region this Object is in.
402 public UUID RegionUUID 439 public UUID RegionUUID
403 { 440 {
@@ -1782,32 +1819,6 @@ namespace OpenSim.Region.Framework.Scenes
1782 } 1819 }
1783 } 1820 }
1784 1821
1785 public void rotLookAt(Quaternion target, float strength, float damping)
1786 {
1787 SceneObjectPart rootpart = m_rootPart;
1788 if (rootpart != null)
1789 {
1790 if (IsAttachment)
1791 {
1792 /*
1793 ScenePresence avatar = m_scene.GetScenePresence(rootpart.AttachedAvatar);
1794 if (avatar != null)
1795 {
1796 Rotate the Av?
1797 } */
1798 }
1799 else
1800 {
1801 if (rootpart.PhysActor != null)
1802 {
1803 rootpart.PhysActor.APIDTarget = new Quaternion(target.X, target.Y, target.Z, target.W);
1804 rootpart.PhysActor.APIDStrength = strength;
1805 rootpart.PhysActor.APIDDamping = damping;
1806 rootpart.PhysActor.APIDActive = true;
1807 }
1808 }
1809 }
1810 }
1811 public void stopLookAt() 1822 public void stopLookAt()
1812 { 1823 {
1813 SceneObjectPart rootpart = m_rootPart; 1824 SceneObjectPart rootpart = m_rootPart;
@@ -1966,6 +1977,8 @@ namespace OpenSim.Region.Framework.Scenes
1966 1977
1967 foreach (SceneObjectPart part in m_parts.Values) 1978 foreach (SceneObjectPart part in m_parts.Values)
1968 { 1979 {
1980 if (!IsSelected)
1981 part.UpdateLookAt();
1969 part.SendScheduledUpdates(); 1982 part.SendScheduledUpdates();
1970 } 1983 }
1971 } 1984 }
@@ -2467,11 +2480,14 @@ namespace OpenSim.Region.Framework.Scenes
2467 { 2480 {
2468 if (m_rootPart.PhysActor.IsPhysical) 2481 if (m_rootPart.PhysActor.IsPhysical)
2469 { 2482 {
2470 Vector3 llmoveforce = pos - AbsolutePosition; 2483 if (!m_rootPart.BlockGrab)
2471 Vector3 grabforce = llmoveforce; 2484 {
2472 grabforce = (grabforce / 10) * m_rootPart.PhysActor.Mass; 2485 Vector3 llmoveforce = pos - AbsolutePosition;
2473 m_rootPart.PhysActor.AddForce(grabforce,true); 2486 Vector3 grabforce = llmoveforce;
2474 m_scene.PhysicsScene.AddPhysicsActorTaint(m_rootPart.PhysActor); 2487 grabforce = (grabforce / 10) * m_rootPart.PhysActor.Mass;
2488 m_rootPart.PhysActor.AddForce(grabforce, true);
2489 m_scene.PhysicsScene.AddPhysicsActorTaint(m_rootPart.PhysActor);
2490 }
2475 } 2491 }
2476 else 2492 else
2477 { 2493 {
@@ -2827,6 +2843,7 @@ namespace OpenSim.Region.Framework.Scenes
2827 SceneObjectPart part = GetChildPart(localID); 2843 SceneObjectPart part = GetChildPart(localID);
2828 if (part != null) 2844 if (part != null)
2829 { 2845 {
2846 part.IgnoreUndoUpdate = true;
2830 if (scale.X > m_scene.m_maxNonphys) 2847 if (scale.X > m_scene.m_maxNonphys)
2831 scale.X = m_scene.m_maxNonphys; 2848 scale.X = m_scene.m_maxNonphys;
2832 if (scale.Y > m_scene.m_maxNonphys) 2849 if (scale.Y > m_scene.m_maxNonphys)
@@ -2854,6 +2871,7 @@ namespace OpenSim.Region.Framework.Scenes
2854 { 2871 {
2855 if (obPart.UUID != m_rootPart.UUID) 2872 if (obPart.UUID != m_rootPart.UUID)
2856 { 2873 {
2874 obPart.IgnoreUndoUpdate = true;
2857 Vector3 oldSize = new Vector3(obPart.Scale); 2875 Vector3 oldSize = new Vector3(obPart.Scale);
2858 2876
2859 float f = 1.0f; 2877 float f = 1.0f;
@@ -2913,6 +2931,8 @@ namespace OpenSim.Region.Framework.Scenes
2913 z *= a; 2931 z *= a;
2914 } 2932 }
2915 } 2933 }
2934 obPart.IgnoreUndoUpdate = false;
2935 obPart.StoreUndoState();
2916 } 2936 }
2917 } 2937 }
2918 } 2938 }
@@ -2928,6 +2948,7 @@ namespace OpenSim.Region.Framework.Scenes
2928 { 2948 {
2929 foreach (SceneObjectPart obPart in m_parts.Values) 2949 foreach (SceneObjectPart obPart in m_parts.Values)
2930 { 2950 {
2951 obPart.IgnoreUndoUpdate = true;
2931 if (obPart.UUID != m_rootPart.UUID) 2952 if (obPart.UUID != m_rootPart.UUID)
2932 { 2953 {
2933 Vector3 currentpos = new Vector3(obPart.OffsetPosition); 2954 Vector3 currentpos = new Vector3(obPart.OffsetPosition);
@@ -2941,6 +2962,8 @@ namespace OpenSim.Region.Framework.Scenes
2941 obPart.Resize(newSize); 2962 obPart.Resize(newSize);
2942 obPart.UpdateOffSet(currentpos); 2963 obPart.UpdateOffSet(currentpos);
2943 } 2964 }
2965 obPart.IgnoreUndoUpdate = false;
2966 obPart.StoreUndoState();
2944 } 2967 }
2945 } 2968 }
2946 2969
@@ -2950,6 +2973,8 @@ namespace OpenSim.Region.Framework.Scenes
2950 m_scene.PhysicsScene.AddPhysicsActorTaint(part.PhysActor); 2973 m_scene.PhysicsScene.AddPhysicsActorTaint(part.PhysActor);
2951 } 2974 }
2952 2975
2976 part.IgnoreUndoUpdate = false;
2977 part.StoreUndoState();
2953 HasGroupChanged = true; 2978 HasGroupChanged = true;
2954 ScheduleGroupForTerseUpdate(); 2979 ScheduleGroupForTerseUpdate();
2955 } 2980 }
@@ -2965,13 +2990,26 @@ namespace OpenSim.Region.Framework.Scenes
2965 /// <param name="pos"></param> 2990 /// <param name="pos"></param>
2966 public void UpdateGroupPosition(Vector3 pos) 2991 public void UpdateGroupPosition(Vector3 pos)
2967 { 2992 {
2993 foreach (SceneObjectPart part in Children.Values)
2994 {
2995 part.StoreUndoState();
2996 }
2968 if (m_scene.EventManager.TriggerGroupMove(UUID, pos)) 2997 if (m_scene.EventManager.TriggerGroupMove(UUID, pos))
2969 { 2998 {
2970 if (IsAttachment) 2999 if (IsAttachment)
2971 { 3000 {
2972 m_rootPart.AttachedPos = pos; 3001 m_rootPart.AttachedPos = pos;
2973 } 3002 }
2974 3003 if (RootPart.GetStatusSandbox())
3004 {
3005 if (Util.GetDistanceTo(RootPart.StatusSandboxPos, pos) > 10)
3006 {
3007 RootPart.ScriptSetPhysicsStatus(false);
3008 pos = AbsolutePosition;
3009 Scene.SimChat(Utils.StringToBytes("Hit Sandbox Limit"),
3010 ChatTypeEnum.DebugChannel, 0x7FFFFFFF, RootPart.AbsolutePosition, Name, UUID, false);
3011 }
3012 }
2975 AbsolutePosition = pos; 3013 AbsolutePosition = pos;
2976 3014
2977 HasGroupChanged = true; 3015 HasGroupChanged = true;
@@ -2990,7 +3028,10 @@ namespace OpenSim.Region.Framework.Scenes
2990 public void UpdateSinglePosition(Vector3 pos, uint localID) 3028 public void UpdateSinglePosition(Vector3 pos, uint localID)
2991 { 3029 {
2992 SceneObjectPart part = GetChildPart(localID); 3030 SceneObjectPart part = GetChildPart(localID);
2993 3031 foreach (SceneObjectPart parts in Children.Values)
3032 {
3033 parts.StoreUndoState();
3034 }
2994 if (part != null) 3035 if (part != null)
2995 { 3036 {
2996 if (part.UUID == m_rootPart.UUID) 3037 if (part.UUID == m_rootPart.UUID)
@@ -3012,6 +3053,10 @@ namespace OpenSim.Region.Framework.Scenes
3012 /// <param name="pos"></param> 3053 /// <param name="pos"></param>
3013 private void UpdateRootPosition(Vector3 pos) 3054 private void UpdateRootPosition(Vector3 pos)
3014 { 3055 {
3056 foreach (SceneObjectPart part in Children.Values)
3057 {
3058 part.StoreUndoState();
3059 }
3015 Vector3 newPos = new Vector3(pos.X, pos.Y, pos.Z); 3060 Vector3 newPos = new Vector3(pos.X, pos.Y, pos.Z);
3016 Vector3 oldPos = 3061 Vector3 oldPos =
3017 new Vector3(AbsolutePosition.X + m_rootPart.OffsetPosition.X, 3062 new Vector3(AbsolutePosition.X + m_rootPart.OffsetPosition.X,
@@ -3055,6 +3100,10 @@ namespace OpenSim.Region.Framework.Scenes
3055 /// <param name="rot"></param> 3100 /// <param name="rot"></param>
3056 public void UpdateGroupRotationR(Quaternion rot) 3101 public void UpdateGroupRotationR(Quaternion rot)
3057 { 3102 {
3103 foreach (SceneObjectPart parts in Children.Values)
3104 {
3105 parts.StoreUndoState();
3106 }
3058 m_rootPart.UpdateRotation(rot); 3107 m_rootPart.UpdateRotation(rot);
3059 3108
3060 PhysicsActor actor = m_rootPart.PhysActor; 3109 PhysicsActor actor = m_rootPart.PhysActor;
@@ -3075,6 +3124,10 @@ namespace OpenSim.Region.Framework.Scenes
3075 /// <param name="rot"></param> 3124 /// <param name="rot"></param>
3076 public void UpdateGroupRotationPR(Vector3 pos, Quaternion rot) 3125 public void UpdateGroupRotationPR(Vector3 pos, Quaternion rot)
3077 { 3126 {
3127 foreach (SceneObjectPart parts in Children.Values)
3128 {
3129 parts.StoreUndoState();
3130 }
3078 m_rootPart.UpdateRotation(rot); 3131 m_rootPart.UpdateRotation(rot);
3079 3132
3080 PhysicsActor actor = m_rootPart.PhysActor; 3133 PhysicsActor actor = m_rootPart.PhysActor;
@@ -3098,6 +3151,10 @@ namespace OpenSim.Region.Framework.Scenes
3098 public void UpdateSingleRotation(Quaternion rot, uint localID) 3151 public void UpdateSingleRotation(Quaternion rot, uint localID)
3099 { 3152 {
3100 SceneObjectPart part = GetChildPart(localID); 3153 SceneObjectPart part = GetChildPart(localID);
3154 foreach (SceneObjectPart parts in Children.Values)
3155 {
3156 parts.StoreUndoState();
3157 }
3101 if (part != null) 3158 if (part != null)
3102 { 3159 {
3103 if (part.UUID == m_rootPart.UUID) 3160 if (part.UUID == m_rootPart.UUID)
@@ -3128,8 +3185,11 @@ namespace OpenSim.Region.Framework.Scenes
3128 } 3185 }
3129 else 3186 else
3130 { 3187 {
3188 part.IgnoreUndoUpdate = true;
3131 part.UpdateRotation(rot); 3189 part.UpdateRotation(rot);
3132 part.OffsetPosition = pos; 3190 part.OffsetPosition = pos;
3191 part.IgnoreUndoUpdate = false;
3192 part.StoreUndoState();
3133 } 3193 }
3134 } 3194 }
3135 } 3195 }
@@ -3143,6 +3203,7 @@ namespace OpenSim.Region.Framework.Scenes
3143 Quaternion axRot = rot; 3203 Quaternion axRot = rot;
3144 Quaternion oldParentRot = m_rootPart.RotationOffset; 3204 Quaternion oldParentRot = m_rootPart.RotationOffset;
3145 3205
3206 m_rootPart.StoreUndoState();
3146 m_rootPart.UpdateRotation(rot); 3207 m_rootPart.UpdateRotation(rot);
3147 if (m_rootPart.PhysActor != null) 3208 if (m_rootPart.PhysActor != null)
3148 { 3209 {
@@ -3156,6 +3217,7 @@ namespace OpenSim.Region.Framework.Scenes
3156 { 3217 {
3157 if (prim.UUID != m_rootPart.UUID) 3218 if (prim.UUID != m_rootPart.UUID)
3158 { 3219 {
3220 prim.IgnoreUndoUpdate = true;
3159 Vector3 axPos = prim.OffsetPosition; 3221 Vector3 axPos = prim.OffsetPosition;
3160 axPos *= oldParentRot; 3222 axPos *= oldParentRot;
3161 axPos *= Quaternion.Inverse(axRot); 3223 axPos *= Quaternion.Inverse(axRot);
@@ -3168,7 +3230,14 @@ namespace OpenSim.Region.Framework.Scenes
3168 } 3230 }
3169 } 3231 }
3170 } 3232 }
3171 3233 foreach (SceneObjectPart childpart in Children.Values)
3234 {
3235 if (childpart != m_rootPart)
3236 {
3237 childpart.IgnoreUndoUpdate = false;
3238 childpart.StoreUndoState();
3239 }
3240 }
3172 m_rootPart.ScheduleTerseUpdate(); 3241 m_rootPart.ScheduleTerseUpdate();
3173 } 3242 }
3174 3243
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index dd797fc..5c283bc 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -133,6 +133,18 @@ namespace OpenSim.Region.Framework.Scenes
133 [XmlIgnore] 133 [XmlIgnore]
134 public bool DIE_AT_EDGE; 134 public bool DIE_AT_EDGE;
135 135
136 [XmlIgnore]
137 public bool RETURN_AT_EDGE;
138
139 [XmlIgnore]
140 public bool BlockGrab;
141
142 [XmlIgnore]
143 public bool StatusSandbox;
144
145 [XmlIgnore]
146 public Vector3 StatusSandboxPos;
147
136 // TODO: This needs to be persisted in next XML version update! 148 // TODO: This needs to be persisted in next XML version update!
137 [XmlIgnore] 149 [XmlIgnore]
138 public readonly int[] PayPrice = {-2,-2,-2,-2,-2}; 150 public readonly int[] PayPrice = {-2,-2,-2,-2,-2};
@@ -219,6 +231,15 @@ namespace OpenSim.Region.Framework.Scenes
219 [XmlIgnore] 231 [XmlIgnore]
220 public Quaternion SpinOldOrientation = Quaternion.Identity; 232 public Quaternion SpinOldOrientation = Quaternion.Identity;
221 233
234 [XmlIgnore]
235 public Quaternion m_APIDTarget = Quaternion.Identity;
236
237 [XmlIgnore]
238 public float m_APIDDamp = 0;
239
240 [XmlIgnore]
241 public float m_APIDStrength = 0;
242
222 /// <summary> 243 /// <summary>
223 /// This part's inventory 244 /// This part's inventory
224 /// </summary> 245 /// </summary>
@@ -233,6 +254,9 @@ namespace OpenSim.Region.Framework.Scenes
233 public bool Undoing; 254 public bool Undoing;
234 255
235 [XmlIgnore] 256 [XmlIgnore]
257 public bool IgnoreUndoUpdate = false;
258
259 [XmlIgnore]
236 private PrimFlags LocalFlags; 260 private PrimFlags LocalFlags;
237 [XmlIgnore] 261 [XmlIgnore]
238 private float m_damage = -1.0f; 262 private float m_damage = -1.0f;
@@ -253,6 +277,7 @@ namespace OpenSim.Region.Framework.Scenes
253 private string m_text = String.Empty; 277 private string m_text = String.Empty;
254 private string m_touchName = String.Empty; 278 private string m_touchName = String.Empty;
255 private readonly UndoStack<UndoState> m_undo = new UndoStack<UndoState>(5); 279 private readonly UndoStack<UndoState> m_undo = new UndoStack<UndoState>(5);
280 private readonly UndoStack<UndoState> m_redo = new UndoStack<UndoState>(5);
256 private UUID _creatorID; 281 private UUID _creatorID;
257 282
258 private bool m_passTouches; 283 private bool m_passTouches;
@@ -501,6 +526,27 @@ namespace OpenSim.Region.Framework.Scenes
501 } 526 }
502 } 527 }
503 528
529 [XmlIgnore]
530 public Quaternion APIDTarget
531 {
532 get { return m_APIDTarget; }
533 set { m_APIDTarget = value; }
534 }
535
536 [XmlIgnore]
537 public float APIDDamp
538 {
539 get { return m_APIDDamp; }
540 set { m_APIDDamp = value; }
541 }
542
543 [XmlIgnore]
544 public float APIDStrength
545 {
546 get { return m_APIDStrength; }
547 set { m_APIDStrength = value; }
548 }
549
504 public ulong RegionHandle 550 public ulong RegionHandle
505 { 551 {
506 get { return m_regionHandle; } 552 get { return m_regionHandle; }
@@ -512,6 +558,33 @@ namespace OpenSim.Region.Framework.Scenes
512 get { return m_scriptAccessPin; } 558 get { return m_scriptAccessPin; }
513 set { m_scriptAccessPin = (int)value; } 559 set { m_scriptAccessPin = (int)value; }
514 } 560 }
561 private SceneObjectPart m_PlaySoundMasterPrim = null;
562 public SceneObjectPart PlaySoundMasterPrim
563 {
564 get { return m_PlaySoundMasterPrim; }
565 set { m_PlaySoundMasterPrim = value; }
566 }
567
568 private List<SceneObjectPart> m_PlaySoundSlavePrims = new List<SceneObjectPart>();
569 public List<SceneObjectPart> PlaySoundSlavePrims
570 {
571 get { return m_LoopSoundSlavePrims; }
572 set { m_LoopSoundSlavePrims = value; }
573 }
574
575 private SceneObjectPart m_LoopSoundMasterPrim = null;
576 public SceneObjectPart LoopSoundMasterPrim
577 {
578 get { return m_LoopSoundMasterPrim; }
579 set { m_LoopSoundMasterPrim = value; }
580 }
581
582 private List<SceneObjectPart> m_LoopSoundSlavePrims = new List<SceneObjectPart>();
583 public List<SceneObjectPart> LoopSoundSlavePrims
584 {
585 get { return m_LoopSoundSlavePrims; }
586 set { m_LoopSoundSlavePrims = value; }
587 }
515 588
516 [XmlIgnore] 589 [XmlIgnore]
517 public Byte[] TextureAnimation 590 public Byte[] TextureAnimation
@@ -573,8 +646,6 @@ namespace OpenSim.Region.Framework.Scenes
573 } 646 }
574 set 647 set
575 { 648 {
576 StoreUndoState();
577
578 m_groupPosition = value; 649 m_groupPosition = value;
579 650
580 PhysicsActor actor = PhysActor; 651 PhysicsActor actor = PhysActor;
@@ -1401,6 +1472,10 @@ namespace OpenSim.Region.Framework.Scenes
1401 { 1472 {
1402 m_undo.Clear(); 1473 m_undo.Clear();
1403 } 1474 }
1475 lock (m_redo)
1476 {
1477 m_redo.Clear();
1478 }
1404 StoreUndoState(); 1479 StoreUndoState();
1405 } 1480 }
1406 1481
@@ -1711,6 +1786,66 @@ namespace OpenSim.Region.Framework.Scenes
1711 return m_parentGroup.RootPart.DIE_AT_EDGE; 1786 return m_parentGroup.RootPart.DIE_AT_EDGE;
1712 } 1787 }
1713 1788
1789 public bool GetReturnAtEdge()
1790 {
1791 if (m_parentGroup == null)
1792 return false;
1793 if (m_parentGroup.IsDeleted)
1794 return false;
1795
1796 return m_parentGroup.RootPart.RETURN_AT_EDGE;
1797 }
1798
1799 public void SetReturnAtEdge(bool p)
1800 {
1801 if (m_parentGroup == null)
1802 return;
1803 if (m_parentGroup.IsDeleted)
1804 return;
1805
1806 m_parentGroup.RootPart.RETURN_AT_EDGE = p;
1807 }
1808
1809 public bool GetBlockGrab()
1810 {
1811 if (m_parentGroup == null)
1812 return false;
1813 if (m_parentGroup.IsDeleted)
1814 return false;
1815
1816 return m_parentGroup.RootPart.BlockGrab;
1817 }
1818
1819 public void SetBlockGrab(bool p)
1820 {
1821 if (m_parentGroup == null)
1822 return;
1823 if (m_parentGroup.IsDeleted)
1824 return;
1825
1826 m_parentGroup.RootPart.BlockGrab = p;
1827 }
1828
1829 public void SetStatusSandbox(bool p)
1830 {
1831 if (m_parentGroup == null)
1832 return;
1833 if (m_parentGroup.IsDeleted)
1834 return;
1835 StatusSandboxPos = m_parentGroup.RootPart.AbsolutePosition;
1836 m_parentGroup.RootPart.StatusSandbox = p;
1837 }
1838
1839 public bool GetStatusSandbox()
1840 {
1841 if (m_parentGroup == null)
1842 return false;
1843 if (m_parentGroup.IsDeleted)
1844 return false;
1845
1846 return m_parentGroup.RootPart.StatusSandbox;
1847 }
1848
1714 public int GetAxisRotation(int axis) 1849 public int GetAxisRotation(int axis)
1715 { 1850 {
1716 //Cannot use ScriptBaseClass constants as no referance to it currently. 1851 //Cannot use ScriptBaseClass constants as no referance to it currently.
@@ -1917,7 +2052,7 @@ namespace OpenSim.Region.Framework.Scenes
1917 // play the sound. 2052 // play the sound.
1918 if (startedColliders.Count > 0 && CollisionSound != UUID.Zero && CollisionSoundVolume > 0.0f) 2053 if (startedColliders.Count > 0 && CollisionSound != UUID.Zero && CollisionSoundVolume > 0.0f)
1919 { 2054 {
1920 SendSound(CollisionSound.ToString(), CollisionSoundVolume, true, (byte)0); 2055 SendSound(CollisionSound.ToString(), CollisionSoundVolume, true, (byte)0, 0, false, false);
1921 } 2056 }
1922 2057
1923 if ((m_parentGroup.RootPart.ScriptEvents & scriptEvents.collision_start) != 0) 2058 if ((m_parentGroup.RootPart.ScriptEvents & scriptEvents.collision_start) != 0)
@@ -2491,9 +2626,8 @@ namespace OpenSim.Region.Framework.Scenes
2491 List<ScenePresence> avatarts = m_parentGroup.Scene.GetAvatars(); 2626 List<ScenePresence> avatarts = m_parentGroup.Scene.GetAvatars();
2492 foreach (ScenePresence p in avatarts) 2627 foreach (ScenePresence p in avatarts)
2493 { 2628 {
2494 // TODO: some filtering by distance of avatar 2629 if (!(Util.GetDistanceTo(p.AbsolutePosition, AbsolutePosition) >= 100))
2495 2630 p.ControllingClient.SendPreLoadSound(objectID, objectID, soundID);
2496 p.ControllingClient.SendPreLoadSound(objectID, objectID, soundID);
2497 } 2631 }
2498 } 2632 }
2499 2633
@@ -2554,7 +2688,38 @@ namespace OpenSim.Region.Framework.Scenes
2554 2688
2555 public void RotLookAt(Quaternion target, float strength, float damping) 2689 public void RotLookAt(Quaternion target, float strength, float damping)
2556 { 2690 {
2557 m_parentGroup.rotLookAt(target, strength, damping); 2691 rotLookAt(target, strength, damping);
2692 }
2693
2694 public void rotLookAt(Quaternion target, float strength, float damping)
2695 {
2696 if (IsAttachment)
2697 {
2698 /*
2699 ScenePresence avatar = m_scene.GetScenePresence(rootpart.AttachedAvatar);
2700 if (avatar != null)
2701 {
2702 Rotate the Av?
2703 } */
2704 }
2705 else
2706 {
2707 APIDDamp = damping;
2708 APIDStrength = strength;
2709 APIDTarget = target;
2710 }
2711 }
2712
2713 public void startLookAt(Quaternion rot, float damp, float strength)
2714 {
2715 APIDDamp = damp;
2716 APIDStrength = strength;
2717 APIDTarget = rot;
2718 }
2719
2720 public void stopLookAt()
2721 {
2722 APIDTarget = Quaternion.Identity;
2558 } 2723 }
2559 2724
2560 /// <summary> 2725 /// <summary>
@@ -2814,7 +2979,7 @@ namespace OpenSim.Region.Framework.Scenes
2814 /// <param name="volume"></param> 2979 /// <param name="volume"></param>
2815 /// <param name="triggered"></param> 2980 /// <param name="triggered"></param>
2816 /// <param name="flags"></param> 2981 /// <param name="flags"></param>
2817 public void SendSound(string sound, double volume, bool triggered, byte flags) 2982 public void SendSound(string sound, double volume, bool triggered, byte flags, float radius, bool useMaster, bool isMaster)
2818 { 2983 {
2819 if (volume > 1) 2984 if (volume > 1)
2820 volume = 1; 2985 volume = 1;
@@ -2850,10 +3015,51 @@ namespace OpenSim.Region.Framework.Scenes
2850 ISoundModule soundModule = m_parentGroup.Scene.RequestModuleInterface<ISoundModule>(); 3015 ISoundModule soundModule = m_parentGroup.Scene.RequestModuleInterface<ISoundModule>();
2851 if (soundModule != null) 3016 if (soundModule != null)
2852 { 3017 {
2853 if (triggered) 3018 if (useMaster)
2854 soundModule.TriggerSound(soundID, ownerID, objectID, parentID, volume, position, regionHandle); 3019 {
3020 if (isMaster)
3021 {
3022 if (triggered)
3023 soundModule.TriggerSound(soundID, ownerID, objectID, parentID, volume, position, regionHandle, radius);
3024 else
3025 soundModule.PlayAttachedSound(soundID, ownerID, objectID, volume, position, flags, radius);
3026 ParentGroup.PlaySoundMasterPrim = this;
3027 ownerID = this._ownerID;
3028 objectID = this.UUID;
3029 parentID = this.GetRootPartUUID();
3030 position = this.AbsolutePosition; // region local
3031 regionHandle = this.ParentGroup.Scene.RegionInfo.RegionHandle;
3032 if (triggered)
3033 soundModule.TriggerSound(soundID, ownerID, objectID, parentID, volume, position, regionHandle, radius);
3034 else
3035 soundModule.PlayAttachedSound(soundID, ownerID, objectID, volume, position, flags, radius);
3036 foreach (SceneObjectPart prim in ParentGroup.PlaySoundSlavePrims)
3037 {
3038 ownerID = prim._ownerID;
3039 objectID = prim.UUID;
3040 parentID = prim.GetRootPartUUID();
3041 position = prim.AbsolutePosition; // region local
3042 regionHandle = prim.ParentGroup.Scene.RegionInfo.RegionHandle;
3043 if (triggered)
3044 soundModule.TriggerSound(soundID, ownerID, objectID, parentID, volume, position, regionHandle, radius);
3045 else
3046 soundModule.PlayAttachedSound(soundID, ownerID, objectID, volume, position, flags, radius);
3047 }
3048 ParentGroup.PlaySoundSlavePrims.Clear();
3049 ParentGroup.PlaySoundMasterPrim = null;
3050 }
3051 else
3052 {
3053 ParentGroup.PlaySoundSlavePrims.Add(this);
3054 }
3055 }
2855 else 3056 else
2856 soundModule.PlayAttachedSound(soundID, ownerID, objectID, volume, position, flags); 3057 {
3058 if (triggered)
3059 soundModule.TriggerSound(soundID, ownerID, objectID, parentID, volume, position, regionHandle, radius);
3060 else
3061 soundModule.PlayAttachedSound(soundID, ownerID, objectID, volume, position, flags, radius);
3062 }
2857 } 3063 }
2858 } 3064 }
2859 3065
@@ -3156,6 +3362,14 @@ namespace OpenSim.Region.Framework.Scenes
3156 hasProfileCut = hasDimple; // is it the same thing? 3362 hasProfileCut = hasDimple; // is it the same thing?
3157 } 3363 }
3158 3364
3365 public void SetVehicleFlags(int param, bool remove)
3366 {
3367 if (PhysActor != null)
3368 {
3369 PhysActor.VehicleFlags(param, remove);
3370 }
3371 }
3372
3159 public void SetGroup(UUID groupID, IClientAPI client) 3373 public void SetGroup(UUID groupID, IClientAPI client)
3160 { 3374 {
3161 _groupID = groupID; 3375 _groupID = groupID;
@@ -3260,27 +3474,30 @@ namespace OpenSim.Region.Framework.Scenes
3260 { 3474 {
3261 if (!Undoing) 3475 if (!Undoing)
3262 { 3476 {
3263 if (m_parentGroup != null) 3477 if (!IgnoreUndoUpdate)
3264 { 3478 {
3265 lock (m_undo) 3479 if (m_parentGroup != null)
3266 { 3480 {
3267 if (m_undo.Count > 0) 3481 lock (m_undo)
3268 { 3482 {
3269 UndoState last = m_undo.Peek(); 3483 if (m_undo.Count > 0)
3270 if (last != null)
3271 { 3484 {
3272 if (last.Compare(this)) 3485 UndoState last = m_undo.Peek();
3273 return; 3486 if (last != null)
3487 {
3488 if (last.Compare(this))
3489 return;
3490 }
3274 } 3491 }
3275 }
3276 3492
3277 if (m_parentGroup.GetSceneMaxUndo() > 0) 3493 if (m_parentGroup.GetSceneMaxUndo() > 0)
3278 { 3494 {
3279 UndoState nUndo = new UndoState(this); 3495 UndoState nUndo = new UndoState(this);
3280 3496
3281 m_undo.Push(nUndo); 3497 m_undo.Push(nUndo);
3282 } 3498 }
3283 3499
3500 }
3284 } 3501 }
3285 } 3502 }
3286 } 3503 }
@@ -3751,11 +3968,36 @@ namespace OpenSim.Region.Framework.Scenes
3751 lock (m_undo) 3968 lock (m_undo)
3752 { 3969 {
3753 if (m_undo.Count > 0) 3970 if (m_undo.Count > 0)
3971 {
3972 UndoState nUndo = null;
3973 if (m_parentGroup.GetSceneMaxUndo() > 0)
3754 { 3974 {
3755 UndoState goback = m_undo.Pop(); 3975 nUndo = new UndoState(this);
3756 if (goback != null) 3976 }
3757 goback.PlaybackState(this); 3977 UndoState goback = m_undo.Pop();
3978 if (goback != null)
3979 {
3980 goback.PlaybackState(this);
3981 if (nUndo != null)
3982 m_redo.Push(nUndo);
3983 }
3984 }
3985 }
3986 }
3987
3988 public void Redo()
3989 {
3990 lock (m_redo)
3991 {
3992 if (m_parentGroup.GetSceneMaxUndo() > 0)
3993 {
3994 UndoState nUndo = new UndoState(this);
3995
3996 m_undo.Push(nUndo);
3758 } 3997 }
3998 UndoState gofwd = m_redo.Pop();
3999 if (gofwd != null)
4000 gofwd.PlayfwdState(this);
3759 } 4001 }
3760 } 4002 }
3761 4003
@@ -3802,6 +4044,18 @@ namespace OpenSim.Region.Framework.Scenes
3802 (pos.Z != OffsetPosition.Z)) 4044 (pos.Z != OffsetPosition.Z))
3803 { 4045 {
3804 Vector3 newPos = new Vector3(pos.X, pos.Y, pos.Z); 4046 Vector3 newPos = new Vector3(pos.X, pos.Y, pos.Z);
4047
4048 if (ParentGroup.RootPart.GetStatusSandbox())
4049 {
4050 if (Util.GetDistanceTo(ParentGroup.RootPart.StatusSandboxPos, newPos) > 10)
4051 {
4052 ParentGroup.RootPart.ScriptSetPhysicsStatus(false);
4053 newPos = OffsetPosition;
4054 ParentGroup.Scene.SimChat(Utils.StringToBytes("Hit Sandbox Limit"),
4055 ChatTypeEnum.DebugChannel, 0x7FFFFFFF, ParentGroup.RootPart.AbsolutePosition, Name, UUID, false);
4056 }
4057 }
4058
3805 OffsetPosition = newPos; 4059 OffsetPosition = newPos;
3806 ScheduleTerseUpdate(); 4060 ScheduleTerseUpdate();
3807 } 4061 }
@@ -4094,7 +4348,6 @@ namespace OpenSim.Region.Framework.Scenes
4094 (rot.Z != RotationOffset.Z) || 4348 (rot.Z != RotationOffset.Z) ||
4095 (rot.W != RotationOffset.W)) 4349 (rot.W != RotationOffset.W))
4096 { 4350 {
4097 //StoreUndoState();
4098 RotationOffset = rot; 4351 RotationOffset = rot;
4099 ParentGroup.HasGroupChanged = true; 4352 ParentGroup.HasGroupChanged = true;
4100 ScheduleTerseUpdate(); 4353 ScheduleTerseUpdate();
@@ -4278,7 +4531,7 @@ namespace OpenSim.Region.Framework.Scenes
4278 else 4531 else
4279 { 4532 {
4280// m_log.DebugFormat( 4533// m_log.DebugFormat(
4281// "[SCENE OBJECT PART]: Scheduling part {0} {1} for full update in aggregateScriptEvents()", Name, LocalId); 4534// "[SCENE OBJECT PART]: Scheduling part {0} {1} for full update in aggregateScriptEvents()", Name, LocalId);
4282 ScheduleFullUpdate(); 4535 ScheduleFullUpdate();
4283 } 4536 }
4284 } 4537 }
@@ -4396,5 +4649,36 @@ namespace OpenSim.Region.Framework.Scenes
4396 4649
4397 Inventory.ApplyNextOwnerPermissions(); 4650 Inventory.ApplyNextOwnerPermissions();
4398 } 4651 }
4652 public void UpdateLookAt()
4653 {
4654 try
4655 {
4656 if (APIDTarget != Quaternion.Identity)
4657 {
4658 if (Single.IsNaN(APIDTarget.W) == true)
4659 {
4660 APIDTarget = Quaternion.Identity;
4661 return;
4662 }
4663 Quaternion rot = RotationOffset;
4664 Quaternion dir = (rot - APIDTarget);
4665 float speed = ((APIDStrength / APIDDamp) * (float)(Math.PI / 180.0f));
4666 if (dir.Z > speed)
4667 {
4668 rot.Z -= speed;
4669 }
4670 if (dir.Z < -speed)
4671 {
4672 rot.Z += speed;
4673 }
4674 rot.Normalize();
4675 UpdateRotation(rot);
4676 }
4677 }
4678 catch (Exception ex)
4679 {
4680 m_log.Error("[Physics] " + ex);
4681 }
4682 }
4399 } 4683 }
4400} 4684}
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
index 298ede9..a555eae 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
@@ -314,7 +314,7 @@ namespace OpenSim.Region.Framework.Scenes
314 } 314 }
315 ); 315 );
316 } 316 }
317 } 317 }
318 318
319 private void RestoreSavedScriptState(UUID oldID, UUID newID) 319 private void RestoreSavedScriptState(UUID oldID, UUID newID)
320 { 320 {
@@ -579,7 +579,7 @@ namespace OpenSim.Region.Framework.Scenes
579 m_items.TryGetValue(itemId, out item); 579 m_items.TryGetValue(itemId, out item);
580 580
581 return item; 581 return item;
582 } 582 }
583 583
584 /// <summary> 584 /// <summary>
585 /// Get inventory items by name. 585 /// Get inventory items by name.
@@ -588,7 +588,7 @@ namespace OpenSim.Region.Framework.Scenes
588 /// <returns> 588 /// <returns>
589 /// A list of inventory items with that name. 589 /// A list of inventory items with that name.
590 /// If no inventory item has that name then an empty list is returned. 590 /// If no inventory item has that name then an empty list is returned.
591 /// </returns> 591 /// </returns>
592 public IList<TaskInventoryItem> GetInventoryItems(string name) 592 public IList<TaskInventoryItem> GetInventoryItems(string name)
593 { 593 {
594 IList<TaskInventoryItem> items = new List<TaskInventoryItem>(); 594 IList<TaskInventoryItem> items = new List<TaskInventoryItem>();
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 9c7559b..4973663 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -164,6 +164,8 @@ namespace OpenSim.Region.Framework.Scenes
164 164
165 private Quaternion m_bodyRot= Quaternion.Identity; 165 private Quaternion m_bodyRot= Quaternion.Identity;
166 166
167 private Quaternion m_bodyRotPrevious = Quaternion.Identity;
168
167 private const int LAND_VELOCITYMAG_MAX = 12; 169 private const int LAND_VELOCITYMAG_MAX = 12;
168 170
169 public bool IsRestrictedToRegion; 171 public bool IsRestrictedToRegion;
@@ -225,7 +227,7 @@ namespace OpenSim.Region.Framework.Scenes
225 // Agent's Draw distance. 227 // Agent's Draw distance.
226 protected float m_DrawDistance; 228 protected float m_DrawDistance;
227 229
228 protected AvatarAppearance m_appearance; 230 protected AvatarAppearance m_appearance;
229 231
230 // neighbouring regions we have enabled a child agent in 232 // neighbouring regions we have enabled a child agent in
231 // holds the seed cap for the child agent in that region 233 // holds the seed cap for the child agent in that region
@@ -508,6 +510,12 @@ namespace OpenSim.Region.Framework.Scenes
508 set { m_bodyRot = value; } 510 set { m_bodyRot = value; }
509 } 511 }
510 512
513 public Quaternion PreviousRotation
514 {
515 get { return m_bodyRotPrevious; }
516 set { m_bodyRotPrevious = value; }
517 }
518
511 /// <summary> 519 /// <summary>
512 /// If this is true, agent doesn't have a representation in this scene. 520 /// If this is true, agent doesn't have a representation in this scene.
513 /// this is an agent 'looking into' this scene from a nearby scene(region) 521 /// this is an agent 'looking into' this scene from a nearby scene(region)
@@ -640,7 +648,7 @@ namespace OpenSim.Region.Framework.Scenes
640 #region Constructor(s) 648 #region Constructor(s)
641 649
642 public ScenePresence() 650 public ScenePresence()
643 { 651 {
644 m_sendCourseLocationsMethod = SendCoarseLocationsDefault; 652 m_sendCourseLocationsMethod = SendCoarseLocationsDefault;
645 CreateSceneViewer(); 653 CreateSceneViewer();
646 m_animator = new ScenePresenceAnimator(this); 654 m_animator = new ScenePresenceAnimator(this);
@@ -824,6 +832,31 @@ namespace OpenSim.Region.Framework.Scenes
824 if (pos.X < 0 || pos.Y < 0 || pos.Z < 0) 832 if (pos.X < 0 || pos.Y < 0 || pos.Z < 0)
825 { 833 {
826 Vector3 emergencyPos = new Vector3(((int)Constants.RegionSize * 0.5f), ((int)Constants.RegionSize * 0.5f), 128); 834 Vector3 emergencyPos = new Vector3(((int)Constants.RegionSize * 0.5f), ((int)Constants.RegionSize * 0.5f), 128);
835
836 if (pos.X < 0)
837 {
838 emergencyPos.X = (int)Constants.RegionSize + pos.X;
839 if (!(pos.Y < 0))
840 emergencyPos.Y = pos.Y;
841 if (!(pos.Z < 0))
842 emergencyPos.X = pos.X;
843 }
844 if (pos.Y < 0)
845 {
846 emergencyPos.Y = (int)Constants.RegionSize + pos.Y;
847 if (!(pos.X < 0))
848 emergencyPos.X = pos.X;
849 if (!(pos.Z < 0))
850 emergencyPos.Z = pos.Z;
851 }
852 if (pos.Z < 0)
853 {
854 if (!(pos.X < 0))
855 emergencyPos.X = pos.X;
856 if (!(pos.Y < 0))
857 emergencyPos.Y = pos.Y;
858 //Leave as 128
859 }
827 860
828 m_log.WarnFormat( 861 m_log.WarnFormat(
829 "[SCENE PRESENCE]: MakeRootAgent() was given an illegal position of {0} for avatar {1}, {2}. Substituting {3}", 862 "[SCENE PRESENCE]: MakeRootAgent() was given an illegal position of {0} for avatar {1}, {2}. Substituting {3}",
@@ -2704,36 +2737,75 @@ namespace OpenSim.Region.Framework.Scenes
2704 { 2737 {
2705 // Checks if where it's headed exists a region 2738 // Checks if where it's headed exists a region
2706 2739
2740 bool needsTransit = false;
2707 if (m_scene.TestBorderCross(pos2, Cardinals.W)) 2741 if (m_scene.TestBorderCross(pos2, Cardinals.W))
2708 { 2742 {
2709 if (m_scene.TestBorderCross(pos2, Cardinals.S)) 2743 if (m_scene.TestBorderCross(pos2, Cardinals.S))
2744 {
2745 needsTransit = true;
2710 neighbor = HaveNeighbor(Cardinals.SW, ref fix); 2746 neighbor = HaveNeighbor(Cardinals.SW, ref fix);
2747 }
2711 else if (m_scene.TestBorderCross(pos2, Cardinals.N)) 2748 else if (m_scene.TestBorderCross(pos2, Cardinals.N))
2749 {
2750 needsTransit = true;
2712 neighbor = HaveNeighbor(Cardinals.NW, ref fix); 2751 neighbor = HaveNeighbor(Cardinals.NW, ref fix);
2752 }
2713 else 2753 else
2754 {
2755 needsTransit = true;
2714 neighbor = HaveNeighbor(Cardinals.W, ref fix); 2756 neighbor = HaveNeighbor(Cardinals.W, ref fix);
2757 }
2715 } 2758 }
2716 else if (m_scene.TestBorderCross(pos2, Cardinals.E)) 2759 else if (m_scene.TestBorderCross(pos2, Cardinals.E))
2717 { 2760 {
2718 if (m_scene.TestBorderCross(pos2, Cardinals.S)) 2761 if (m_scene.TestBorderCross(pos2, Cardinals.S))
2762 {
2763 needsTransit = true;
2719 neighbor = HaveNeighbor(Cardinals.SE, ref fix); 2764 neighbor = HaveNeighbor(Cardinals.SE, ref fix);
2765 }
2720 else if (m_scene.TestBorderCross(pos2, Cardinals.N)) 2766 else if (m_scene.TestBorderCross(pos2, Cardinals.N))
2767 {
2768 needsTransit = true;
2721 neighbor = HaveNeighbor(Cardinals.NE, ref fix); 2769 neighbor = HaveNeighbor(Cardinals.NE, ref fix);
2770 }
2722 else 2771 else
2772 {
2773 needsTransit = true;
2723 neighbor = HaveNeighbor(Cardinals.E, ref fix); 2774 neighbor = HaveNeighbor(Cardinals.E, ref fix);
2775 }
2724 } 2776 }
2725 else if (m_scene.TestBorderCross(pos2, Cardinals.S)) 2777 else if (m_scene.TestBorderCross(pos2, Cardinals.S))
2778 {
2779 needsTransit = true;
2726 neighbor = HaveNeighbor(Cardinals.S, ref fix); 2780 neighbor = HaveNeighbor(Cardinals.S, ref fix);
2781 }
2727 else if (m_scene.TestBorderCross(pos2, Cardinals.N)) 2782 else if (m_scene.TestBorderCross(pos2, Cardinals.N))
2783 {
2784 needsTransit = true;
2728 neighbor = HaveNeighbor(Cardinals.N, ref fix); 2785 neighbor = HaveNeighbor(Cardinals.N, ref fix);
2786 }
2787
2729 2788
2730
2731 // Makes sure avatar does not end up outside region 2789 // Makes sure avatar does not end up outside region
2732 if (neighbor < 0) 2790 if (neighbor <= 0)
2733 AbsolutePosition = new Vector3( 2791 {
2734 AbsolutePosition.X + 3*fix[0], 2792 if (!needsTransit)
2735 AbsolutePosition.Y + 3*fix[1], 2793 {
2736 AbsolutePosition.Z); 2794 if (m_requestedSitTargetUUID == UUID.Zero)
2795 {
2796 Vector3 pos = AbsolutePosition;
2797 if (AbsolutePosition.X < 0)
2798 pos.X += Velocity.X;
2799 else if (AbsolutePosition.X > Constants.RegionSize)
2800 pos.X -= Velocity.X;
2801 if (AbsolutePosition.Y < 0)
2802 pos.Y += Velocity.Y;
2803 else if (AbsolutePosition.Y > Constants.RegionSize)
2804 pos.Y -= Velocity.Y;
2805 AbsolutePosition = pos;
2806 }
2807 }
2808 }
2737 else if (neighbor > 0) 2809 else if (neighbor > 0)
2738 CrossToNewRegion(); 2810 CrossToNewRegion();
2739 } 2811 }
@@ -3193,7 +3265,7 @@ namespace OpenSim.Region.Framework.Scenes
3193 m_physicsActor.OnCollisionUpdate += PhysicsCollisionUpdate; 3265 m_physicsActor.OnCollisionUpdate += PhysicsCollisionUpdate;
3194 m_physicsActor.OnOutOfBounds += OutOfBoundsCall; // Called for PhysicsActors when there's something wrong 3266 m_physicsActor.OnOutOfBounds += OutOfBoundsCall; // Called for PhysicsActors when there's something wrong
3195 m_physicsActor.SubscribeEvents(500); 3267 m_physicsActor.SubscribeEvents(500);
3196 m_physicsActor.LocalID = LocalId; 3268 m_physicsActor.LocalID = LocalId;
3197 } 3269 }
3198 3270
3199 private void OutOfBoundsCall(Vector3 pos) 3271 private void OutOfBoundsCall(Vector3 pos)
@@ -3285,7 +3357,7 @@ namespace OpenSim.Region.Framework.Scenes
3285 } 3357 }
3286 if (m_health <= 0) 3358 if (m_health <= 0)
3287 m_scene.EventManager.TriggerAvatarKill(killerObj, this); 3359 m_scene.EventManager.TriggerAvatarKill(killerObj, this);
3288 } 3360 }
3289 } 3361 }
3290 3362
3291 public void setHealthWithUpdate(float health) 3363 public void setHealthWithUpdate(float health)
diff --git a/OpenSim/Region/Framework/Scenes/UndoState.cs b/OpenSim/Region/Framework/Scenes/UndoState.cs
index 713ff69..55e407e 100644
--- a/OpenSim/Region/Framework/Scenes/UndoState.cs
+++ b/OpenSim/Region/Framework/Scenes/UndoState.cs
@@ -26,6 +26,7 @@
26 */ 26 */
27 27
28using OpenMetaverse; 28using OpenMetaverse;
29using OpenSim.Region.Framework.Interfaces;
29 30
30namespace OpenSim.Region.Framework.Scenes 31namespace OpenSim.Region.Framework.Scenes
31{ 32{
@@ -35,29 +36,21 @@ namespace OpenSim.Region.Framework.Scenes
35 public Vector3 Scale = Vector3.Zero; 36 public Vector3 Scale = Vector3.Zero;
36 public Quaternion Rotation = Quaternion.Identity; 37 public Quaternion Rotation = Quaternion.Identity;
37 38
38 public UndoState(Vector3 pos, Quaternion rot, Vector3 scale)
39 {
40 Position = pos;
41 Rotation = rot;
42 Scale = scale;
43 }
44
45 public UndoState(SceneObjectPart part) 39 public UndoState(SceneObjectPart part)
46 { 40 {
47 if (part != null) 41 if (part != null)
48 { 42 {
49 if (part.ParentID == 0) 43 if (part.ParentID == 0)
50 { 44 {
51 Position = part.AbsolutePosition; 45 Position = part.ParentGroup.AbsolutePosition;
52 Rotation = part.RotationOffset; 46 Rotation = part.RotationOffset;
53 47 Scale = part.Shape.Scale;
54 } 48 }
55 else 49 else
56 { 50 {
57 Position = part.OffsetPosition; 51 Position = part.OffsetPosition;
58 Rotation = part.RotationOffset; 52 Rotation = part.RotationOffset;
59 Scale = part.Shape.Scale; 53 Scale = part.Shape.Scale;
60
61 } 54 }
62 } 55 }
63 } 56 }
@@ -68,7 +61,7 @@ namespace OpenSim.Region.Framework.Scenes
68 { 61 {
69 if (part.ParentID == 0) 62 if (part.ParentID == 0)
70 { 63 {
71 if (Position == part.AbsolutePosition && Rotation == part.RotationOffset) 64 if (Position == part.ParentGroup.AbsolutePosition && Rotation == part.ParentGroup.Rotation)
72 return true; 65 return true;
73 else 66 else
74 return false; 67 return false;
@@ -93,24 +86,78 @@ namespace OpenSim.Region.Framework.Scenes
93 86
94 if (part.ParentID == 0) 87 if (part.ParentID == 0)
95 { 88 {
96 part.ParentGroup.AbsolutePosition = Position; 89 if (Position != Vector3.Zero)
97 part.UpdateRotation(Rotation); 90 part.ParentGroup.AbsolutePosition = Position;
91 part.RotationOffset = Rotation;
92 if (Scale != Vector3.Zero)
93 part.Resize(Scale);
98 part.ParentGroup.ScheduleGroupForTerseUpdate(); 94 part.ParentGroup.ScheduleGroupForTerseUpdate();
99 } 95 }
100 else 96 else
101 { 97 {
102 part.OffsetPosition = Position; 98 if (Position != Vector3.Zero)
99 part.OffsetPosition = Position;
103 part.UpdateRotation(Rotation); 100 part.UpdateRotation(Rotation);
104 part.Resize(Scale); 101 if (Scale != Vector3.Zero)
102 part.Resize(Scale); part.ScheduleTerseUpdate();
103 }
104 part.Undoing = false;
105
106 }
107 }
108 public void PlayfwdState(SceneObjectPart part)
109 {
110 if (part != null)
111 {
112 part.Undoing = true;
113
114 if (part.ParentID == 0)
115 {
116 if (Position != Vector3.Zero)
117 part.ParentGroup.AbsolutePosition = Position;
118 if (Rotation != Quaternion.Identity)
119 part.UpdateRotation(Rotation);
120 if (Scale != Vector3.Zero)
121 part.Resize(Scale);
122 part.ParentGroup.ScheduleGroupForTerseUpdate();
123 }
124 else
125 {
126 if (Position != Vector3.Zero)
127 part.OffsetPosition = Position;
128 if (Rotation != Quaternion.Identity)
129 part.UpdateRotation(Rotation);
130 if (Scale != Vector3.Zero)
131 part.Resize(Scale);
105 part.ScheduleTerseUpdate(); 132 part.ScheduleTerseUpdate();
106 } 133 }
107 part.Undoing = false; 134 part.Undoing = false;
108 135
109 } 136 }
110 } 137 }
138 }
139 public class LandUndoState
140 {
141 public ITerrainModule m_terrainModule;
142 public ITerrainChannel m_terrainChannel;
143
144 public LandUndoState(ITerrainModule terrainModule, ITerrainChannel terrainChannel)
145 {
146 m_terrainModule = terrainModule;
147 m_terrainChannel = terrainChannel;
148 }
149
150 public bool Compare(ITerrainChannel terrainChannel)
151 {
152 if (m_terrainChannel != terrainChannel)
153 return false;
154 else
155 return false;
156 }
111 157
112 public UndoState() 158 public void PlaybackState()
113 { 159 {
160 m_terrainModule.UndoTerrain(m_terrainChannel);
114 } 161 }
115 } 162 }
116} 163}