aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region
diff options
context:
space:
mode:
authorRevolution2010-02-14 15:41:57 -0600
committerMelanie2010-02-14 22:18:46 +0000
commit9821c4f566e11c75c8d87721777480c5b2e2bd4e (patch)
tree04cf7edb4cfe07e1f50ce3ee0ca5d846e6a7a379 /OpenSim/Region
parent* SQLite match code casing with regionsettings table field casing (what's wit... (diff)
downloadopensim-SC-9821c4f566e11c75c8d87721777480c5b2e2bd4e.zip
opensim-SC-9821c4f566e11c75c8d87721777480c5b2e2bd4e.tar.gz
opensim-SC-9821c4f566e11c75c8d87721777480c5b2e2bd4e.tar.bz2
opensim-SC-9821c4f566e11c75c8d87721777480c5b2e2bd4e.tar.xz
Revolution is on the roll again! :)
Fixes: Undo, T-pose of others on login, modifiedBulletX works again, feet now stand on the ground instead of in the ground, adds checks to CombatModule. Adds: Redo, Land Undo, checks to agentUpdate (so one can not fall off of a region), more vehicle parts. Finishes almost all of LSL (1 function left, 2 events). Direct flames and kudos to Revolution, please Signed-off-by: Melanie <melanie@t-data.com>
Diffstat (limited to 'OpenSim/Region')
-rw-r--r--OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs56
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Combat/CombatModule.cs14
-rw-r--r--OpenSim/Region/CoreModules/World/Sound/SoundModule.cs14
-rw-r--r--OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs41
-rw-r--r--OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs2
-rw-r--r--OpenSim/Region/Framework/Interfaces/ISoundModule.cs4
-rw-r--r--OpenSim/Region/Framework/Interfaces/ITerrainModule.cs2
-rw-r--r--OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs13
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.cs47
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneGraph.cs9
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs139
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectPart.cs340
-rw-r--r--OpenSim/Region/Framework/Scenes/ScenePresence.cs89
-rw-r--r--OpenSim/Region/Framework/Scenes/UndoState.cs79
-rw-r--r--OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs2
-rw-r--r--OpenSim/Region/OptionalModules/Scripting/Minimodule/SOPObject.cs2
-rw-r--r--OpenSim/Region/OptionalModules/Scripting/Minimodule/World.cs4
-rw-r--r--OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs2
-rw-r--r--OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsActor.cs5
-rw-r--r--OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETCharacter.cs5
-rw-r--r--OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETPrim.cs5
-rw-r--r--OpenSim/Region/Physics/BulletXPlugin/BulletXPlugin.cs19
-rw-r--r--OpenSim/Region/Physics/Manager/PhysicsActor.cs6
-rw-r--r--OpenSim/Region/Physics/Manager/VehicleConstants.cs12
-rw-r--r--OpenSim/Region/Physics/OdePlugin/ODECharacter.cs5
-rw-r--r--OpenSim/Region/Physics/OdePlugin/ODEDynamics.cs401
-rw-r--r--OpenSim/Region/Physics/OdePlugin/ODEPrim.cs5
-rw-r--r--OpenSim/Region/Physics/POSPlugin/POSCharacter.cs2
-rw-r--r--OpenSim/Region/Physics/POSPlugin/POSPrim.cs2
-rw-r--r--OpenSim/Region/Physics/PhysXPlugin/PhysXPlugin.cs4
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs257
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs8
32 files changed, 1380 insertions, 215 deletions
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
index e39323f..9fe61a7 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
@@ -233,6 +233,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
233 public event ObjectBuy OnObjectBuy; 233 public event ObjectBuy OnObjectBuy;
234 public event BuyObjectInventory OnBuyObjectInventory; 234 public event BuyObjectInventory OnBuyObjectInventory;
235 public event AgentSit OnUndo; 235 public event AgentSit OnUndo;
236 public event AgentSit OnRedo;
237 public event LandUndo OnLandUndo;
236 public event ForceReleaseControls OnForceReleaseControls; 238 public event ForceReleaseControls OnForceReleaseControls;
237 public event GodLandStatRequest OnLandStatRequest; 239 public event GodLandStatRequest OnLandStatRequest;
238 public event RequestObjectPropertiesFamily OnObjectGroupRequest; 240 public event RequestObjectPropertiesFamily OnObjectGroupRequest;
@@ -4667,6 +4669,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
4667 AddLocalPacketHandler(PacketType.ObjectName, HandleObjectName, false); 4669 AddLocalPacketHandler(PacketType.ObjectName, HandleObjectName, false);
4668 AddLocalPacketHandler(PacketType.ObjectPermissions, HandleObjectPermissions, false); 4670 AddLocalPacketHandler(PacketType.ObjectPermissions, HandleObjectPermissions, false);
4669 AddLocalPacketHandler(PacketType.Undo, HandleUndo, false); 4671 AddLocalPacketHandler(PacketType.Undo, HandleUndo, false);
4672 AddLocalPacketHandler(PacketType.UndoLand, HandleLandUndo, false);
4673 AddLocalPacketHandler(PacketType.Redo, HandleRedo, false);
4670 AddLocalPacketHandler(PacketType.ObjectDuplicateOnRay, HandleObjectDuplicateOnRay); 4674 AddLocalPacketHandler(PacketType.ObjectDuplicateOnRay, HandleObjectDuplicateOnRay);
4671 AddLocalPacketHandler(PacketType.RequestObjectPropertiesFamily, HandleRequestObjectPropertiesFamily, false); 4675 AddLocalPacketHandler(PacketType.RequestObjectPropertiesFamily, HandleRequestObjectPropertiesFamily, false);
4672 AddLocalPacketHandler(PacketType.ObjectIncludeInSearch, HandleObjectIncludeInSearch); 4676 AddLocalPacketHandler(PacketType.ObjectIncludeInSearch, HandleObjectIncludeInSearch);
@@ -5836,7 +5840,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
5836 handlerSoundTrigger(soundTriggerPacket.SoundData.SoundID, soundTriggerPacket.SoundData.OwnerID, 5840 handlerSoundTrigger(soundTriggerPacket.SoundData.SoundID, soundTriggerPacket.SoundData.OwnerID,
5837 soundTriggerPacket.SoundData.ObjectID, soundTriggerPacket.SoundData.ParentID, 5841 soundTriggerPacket.SoundData.ObjectID, soundTriggerPacket.SoundData.ParentID,
5838 soundTriggerPacket.SoundData.Gain, soundTriggerPacket.SoundData.Position, 5842 soundTriggerPacket.SoundData.Gain, soundTriggerPacket.SoundData.Position,
5839 soundTriggerPacket.SoundData.Handle); 5843 soundTriggerPacket.SoundData.Handle, 0);
5840 5844
5841 } 5845 }
5842 return true; 5846 return true;
@@ -6734,6 +6738,56 @@ namespace OpenSim.Region.ClientStack.LindenUDP
6734 return true; 6738 return true;
6735 } 6739 }
6736 6740
6741 private bool HandleLandUndo(IClientAPI sender, Packet Pack)
6742 {
6743 UndoLandPacket undolanditem = (UndoLandPacket)Pack;
6744
6745 #region Packet Session and User Check
6746 if (m_checkPackets)
6747 {
6748 if (undolanditem.AgentData.SessionID != SessionId ||
6749 undolanditem.AgentData.AgentID != AgentId)
6750 return true;
6751 }
6752 #endregion
6753
6754 LandUndo handlerOnUndo = OnLandUndo;
6755 if (handlerOnUndo != null)
6756 {
6757 handlerOnUndo(this);
6758 }
6759 return true;
6760 }
6761
6762 private bool HandleRedo(IClientAPI sender, Packet Pack)
6763 {
6764 RedoPacket redoitem = (RedoPacket)Pack;
6765
6766 #region Packet Session and User Check
6767 if (m_checkPackets)
6768 {
6769 if (redoitem.AgentData.SessionID != SessionId ||
6770 redoitem.AgentData.AgentID != AgentId)
6771 return true;
6772 }
6773 #endregion
6774
6775 if (redoitem.ObjectData.Length > 0)
6776 {
6777 for (int i = 0; i < redoitem.ObjectData.Length; i++)
6778 {
6779 UUID objiD = redoitem.ObjectData[i].ObjectID;
6780 AgentSit handlerOnRedo = OnRedo;
6781 if (handlerOnRedo != null)
6782 {
6783 handlerOnRedo(this, objiD);
6784 }
6785
6786 }
6787 }
6788 return true;
6789 }
6790
6737 private bool HandleObjectDuplicateOnRay(IClientAPI sender, Packet Pack) 6791 private bool HandleObjectDuplicateOnRay(IClientAPI sender, Packet Pack)
6738 { 6792 {
6739 ObjectDuplicateOnRayPacket dupeOnRay = (ObjectDuplicateOnRayPacket)Pack; 6793 ObjectDuplicateOnRayPacket dupeOnRay = (ObjectDuplicateOnRayPacket)Pack;
diff --git a/OpenSim/Region/CoreModules/Avatar/Combat/CombatModule.cs b/OpenSim/Region/CoreModules/Avatar/Combat/CombatModule.cs
index 61b6d65..4069991 100644
--- a/OpenSim/Region/CoreModules/Avatar/Combat/CombatModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Combat/CombatModule.cs
@@ -148,13 +148,19 @@ namespace OpenSim.Region.CoreModules.Avatar.Combat.CombatModule
148 private void AvatarEnteringParcel(ScenePresence avatar, int localLandID, UUID regionID) 148 private void AvatarEnteringParcel(ScenePresence avatar, int localLandID, UUID regionID)
149 { 149 {
150 ILandObject obj = avatar.Scene.LandChannel.GetLandObject(avatar.AbsolutePosition.X, avatar.AbsolutePosition.Y); 150 ILandObject obj = avatar.Scene.LandChannel.GetLandObject(avatar.AbsolutePosition.X, avatar.AbsolutePosition.Y);
151 if ((obj.LandData.Flags & (uint)ParcelFlags.AllowDamage) != 0) 151 try
152 { 152 {
153 avatar.Invulnerable = false; 153 if ((obj.LandData.Flags & (uint)ParcelFlags.AllowDamage) != 0)
154 {
155 avatar.Invulnerable = false;
156 }
157 else
158 {
159 avatar.Invulnerable = true;
160 }
154 } 161 }
155 else 162 catch (Exception ex)
156 { 163 {
157 avatar.Invulnerable = true;
158 } 164 }
159 } 165 }
160 } 166 }
diff --git a/OpenSim/Region/CoreModules/World/Sound/SoundModule.cs b/OpenSim/Region/CoreModules/World/Sound/SoundModule.cs
index 37f1f2e..1f5a4ff 100644
--- a/OpenSim/Region/CoreModules/World/Sound/SoundModule.cs
+++ b/OpenSim/Region/CoreModules/World/Sound/SoundModule.cs
@@ -60,7 +60,7 @@ namespace OpenSim.Region.CoreModules.World.Sound
60 } 60 }
61 61
62 public virtual void PlayAttachedSound( 62 public virtual void PlayAttachedSound(
63 UUID soundID, UUID ownerID, UUID objectID, double gain, Vector3 position, byte flags) 63 UUID soundID, UUID ownerID, UUID objectID, double gain, Vector3 position, byte flags, float radius)
64 { 64 {
65 foreach (ScenePresence p in m_scene.GetAvatars()) 65 foreach (ScenePresence p in m_scene.GetAvatars())
66 { 66 {
@@ -69,14 +69,17 @@ namespace OpenSim.Region.CoreModules.World.Sound
69 continue; 69 continue;
70 70
71 // Scale by distance 71 // Scale by distance
72 gain = (float)((double)gain*((100.0 - dis) / 100.0)); 72 if (radius == 0)
73 gain = (float)((double)gain * ((100.0 - dis) / 100.0));
74 else
75 gain = (float)((double)gain * ((radius - dis) / radius));
73 76
74 p.ControllingClient.SendPlayAttachedSound(soundID, objectID, ownerID, (float)gain, flags); 77 p.ControllingClient.SendPlayAttachedSound(soundID, objectID, ownerID, (float)gain, flags);
75 } 78 }
76 } 79 }
77 80
78 public virtual void TriggerSound( 81 public virtual void TriggerSound(
79 UUID soundId, UUID ownerID, UUID objectID, UUID parentID, double gain, Vector3 position, UInt64 handle) 82 UUID soundId, UUID ownerID, UUID objectID, UUID parentID, double gain, Vector3 position, UInt64 handle, float radius)
80 { 83 {
81 foreach (ScenePresence p in m_scene.GetAvatars()) 84 foreach (ScenePresence p in m_scene.GetAvatars())
82 { 85 {
@@ -85,7 +88,10 @@ namespace OpenSim.Region.CoreModules.World.Sound
85 continue; 88 continue;
86 89
87 // Scale by distance 90 // Scale by distance
88 gain = (float)((double)gain*((100.0 - dis) / 100.0)); 91 if (radius == 0)
92 gain = (float)((double)gain * ((100.0 - dis) / 100.0));
93 else
94 gain = (float)((double)gain * ((radius - dis) / radius));
89 95
90 p.ControllingClient.SendTriggeredSound( 96 p.ControllingClient.SendTriggeredSound(
91 soundId, ownerID, objectID, parentID, handle, position, (float)gain); 97 soundId, ownerID, objectID, parentID, handle, position, (float)gain);
diff --git a/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs b/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs
index a40828b..1e7ea7b 100644
--- a/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs
+++ b/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs
@@ -84,6 +84,7 @@ namespace OpenSim.Region.CoreModules.World.Terrain
84 private ITerrainChannel m_revert; 84 private ITerrainChannel m_revert;
85 private Scene m_scene; 85 private Scene m_scene;
86 private volatile bool m_tainted; 86 private volatile bool m_tainted;
87 private readonly UndoStack<LandUndoState> m_undo = new UndoStack<LandUndoState>(5);
87 88
88 #region ICommandableModule Members 89 #region ICommandableModule Members
89 90
@@ -174,6 +175,11 @@ namespace OpenSim.Region.CoreModules.World.Terrain
174 175
175 #region ITerrainModule Members 176 #region ITerrainModule Members
176 177
178 public void UndoTerrain(ITerrainChannel channel)
179 {
180 m_channel = channel;
181 }
182
177 /// <summary> 183 /// <summary>
178 /// Loads a terrain file from disk and installs it in the scene. 184 /// Loads a terrain file from disk and installs it in the scene.
179 /// </summary> 185 /// </summary>
@@ -574,6 +580,7 @@ namespace OpenSim.Region.CoreModules.World.Terrain
574 { 580 {
575 client.OnModifyTerrain += client_OnModifyTerrain; 581 client.OnModifyTerrain += client_OnModifyTerrain;
576 client.OnBakeTerrain += client_OnBakeTerrain; 582 client.OnBakeTerrain += client_OnBakeTerrain;
583 client.OnLandUndo += client_OnLandUndo;
577 } 584 }
578 585
579 /// <summary> 586 /// <summary>
@@ -664,6 +671,19 @@ namespace OpenSim.Region.CoreModules.World.Terrain
664 return changesLimited; 671 return changesLimited;
665 } 672 }
666 673
674 private void client_OnLandUndo(IClientAPI client)
675 {
676 lock (m_undo)
677 {
678 if (m_undo.Count > 0)
679 {
680 LandUndoState goback = m_undo.Pop();
681 if (goback != null)
682 goback.PlaybackState();
683 }
684 }
685 }
686
667 /// <summary> 687 /// <summary>
668 /// Sends a copy of the current terrain to the scenes clients 688 /// Sends a copy of the current terrain to the scenes clients
669 /// </summary> 689 /// </summary>
@@ -718,6 +738,7 @@ namespace OpenSim.Region.CoreModules.World.Terrain
718 } 738 }
719 if (allowed) 739 if (allowed)
720 { 740 {
741 StoreUndoState();
721 m_painteffects[(StandardTerrainEffects) action].PaintEffect( 742 m_painteffects[(StandardTerrainEffects) action].PaintEffect(
722 m_channel, allowMask, west, south, height, size, seconds); 743 m_channel, allowMask, west, south, height, size, seconds);
723 744
@@ -758,6 +779,7 @@ namespace OpenSim.Region.CoreModules.World.Terrain
758 779
759 if (allowed) 780 if (allowed)
760 { 781 {
782 StoreUndoState();
761 m_floodeffects[(StandardTerrainEffects) action].FloodEffect( 783 m_floodeffects[(StandardTerrainEffects) action].FloodEffect(
762 m_channel, fillArea, size); 784 m_channel, fillArea, size);
763 785
@@ -782,6 +804,25 @@ namespace OpenSim.Region.CoreModules.World.Terrain
782 } 804 }
783 } 805 }
784 806
807 private void StoreUndoState()
808 {
809 lock (m_undo)
810 {
811 if (m_undo.Count > 0)
812 {
813 LandUndoState last = m_undo.Peek();
814 if (last != null)
815 {
816 if (last.Compare(m_channel))
817 return;
818 }
819 }
820
821 LandUndoState nUndo = new LandUndoState(this, m_channel);
822 m_undo.Push(nUndo);
823 }
824 }
825
785 #region Console Commands 826 #region Console Commands
786 827
787 private void InterfaceLoadFile(Object[] args) 828 private void InterfaceLoadFile(Object[] args)
diff --git a/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs b/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs
index 0bd1a26..ce9362f 100644
--- a/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs
+++ b/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs
@@ -194,6 +194,8 @@ namespace OpenSim.Region.Examples.SimpleModule
194 public event ObjectBuy OnObjectBuy; 194 public event ObjectBuy OnObjectBuy;
195 public event BuyObjectInventory OnBuyObjectInventory; 195 public event BuyObjectInventory OnBuyObjectInventory;
196 public event AgentSit OnUndo; 196 public event AgentSit OnUndo;
197 public event AgentSit OnRedo;
198 public event LandUndo OnLandUndo;
197 199
198 public event ForceReleaseControls OnForceReleaseControls; 200 public event ForceReleaseControls OnForceReleaseControls;
199 201
diff --git a/OpenSim/Region/Framework/Interfaces/ISoundModule.cs b/OpenSim/Region/Framework/Interfaces/ISoundModule.cs
index 379fabd..6117a80 100644
--- a/OpenSim/Region/Framework/Interfaces/ISoundModule.cs
+++ b/OpenSim/Region/Framework/Interfaces/ISoundModule.cs
@@ -32,9 +32,9 @@ namespace OpenSim.Region.Framework.Interfaces
32{ 32{
33 public interface ISoundModule 33 public interface ISoundModule
34 { 34 {
35 void PlayAttachedSound(UUID soundID, UUID ownerID, UUID objectID, double gain, Vector3 position, byte flags); 35 void PlayAttachedSound(UUID soundID, UUID ownerID, UUID objectID, double gain, Vector3 position, byte flags, float radius);
36 36
37 void TriggerSound( 37 void TriggerSound(
38 UUID soundId, UUID ownerID, UUID objectID, UUID parentID, double gain, Vector3 position, UInt64 handle); 38 UUID soundId, UUID ownerID, UUID objectID, UUID parentID, double gain, Vector3 position, UInt64 handle, float radius);
39 } 39 }
40} \ No newline at end of file 40} \ No newline at end of file
diff --git a/OpenSim/Region/Framework/Interfaces/ITerrainModule.cs b/OpenSim/Region/Framework/Interfaces/ITerrainModule.cs
index 7caac55..5947afb 100644
--- a/OpenSim/Region/Framework/Interfaces/ITerrainModule.cs
+++ b/OpenSim/Region/Framework/Interfaces/ITerrainModule.cs
@@ -62,5 +62,7 @@ namespace OpenSim.Region.Framework.Interfaces
62 void SaveToStream(string filename, Stream stream); 62 void SaveToStream(string filename, Stream stream);
63 63
64 void InstallPlugin(string name, ITerrainEffect plug); 64 void InstallPlugin(string name, ITerrainEffect plug);
65
66 void UndoTerrain(ITerrainChannel channel);
65 } 67 }
66} 68}
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/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 2909311..c7fb32a 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 {
@@ -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..2b13181 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)
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index af46659..fe9dd9b 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 {
@@ -1779,32 +1816,6 @@ namespace OpenSim.Region.Framework.Scenes
1779 } 1816 }
1780 } 1817 }
1781 1818
1782 public void rotLookAt(Quaternion target, float strength, float damping)
1783 {
1784 SceneObjectPart rootpart = m_rootPart;
1785 if (rootpart != null)
1786 {
1787 if (IsAttachment)
1788 {
1789 /*
1790 ScenePresence avatar = m_scene.GetScenePresence(rootpart.AttachedAvatar);
1791 if (avatar != null)
1792 {
1793 Rotate the Av?
1794 } */
1795 }
1796 else
1797 {
1798 if (rootpart.PhysActor != null)
1799 {
1800 rootpart.PhysActor.APIDTarget = new Quaternion(target.X, target.Y, target.Z, target.W);
1801 rootpart.PhysActor.APIDStrength = strength;
1802 rootpart.PhysActor.APIDDamping = damping;
1803 rootpart.PhysActor.APIDActive = true;
1804 }
1805 }
1806 }
1807 }
1808 public void stopLookAt() 1819 public void stopLookAt()
1809 { 1820 {
1810 SceneObjectPart rootpart = m_rootPart; 1821 SceneObjectPart rootpart = m_rootPart;
@@ -1963,6 +1974,8 @@ namespace OpenSim.Region.Framework.Scenes
1963 1974
1964 foreach (SceneObjectPart part in m_parts.Values) 1975 foreach (SceneObjectPart part in m_parts.Values)
1965 { 1976 {
1977 if (!IsSelected)
1978 part.UpdateLookAt();
1966 part.SendScheduledUpdates(); 1979 part.SendScheduledUpdates();
1967 } 1980 }
1968 } 1981 }
@@ -2452,11 +2465,14 @@ namespace OpenSim.Region.Framework.Scenes
2452 { 2465 {
2453 if (m_rootPart.PhysActor.IsPhysical) 2466 if (m_rootPart.PhysActor.IsPhysical)
2454 { 2467 {
2455 Vector3 llmoveforce = pos - AbsolutePosition; 2468 if (!m_rootPart.BlockGrab)
2456 Vector3 grabforce = llmoveforce; 2469 {
2457 grabforce = (grabforce / 10) * m_rootPart.PhysActor.Mass; 2470 Vector3 llmoveforce = pos - AbsolutePosition;
2458 m_rootPart.PhysActor.AddForce(grabforce,true); 2471 Vector3 grabforce = llmoveforce;
2459 m_scene.PhysicsScene.AddPhysicsActorTaint(m_rootPart.PhysActor); 2472 grabforce = (grabforce / 10) * m_rootPart.PhysActor.Mass;
2473 m_rootPart.PhysActor.AddForce(grabforce, true);
2474 m_scene.PhysicsScene.AddPhysicsActorTaint(m_rootPart.PhysActor);
2475 }
2460 } 2476 }
2461 else 2477 else
2462 { 2478 {
@@ -2812,6 +2828,7 @@ namespace OpenSim.Region.Framework.Scenes
2812 SceneObjectPart part = GetChildPart(localID); 2828 SceneObjectPart part = GetChildPart(localID);
2813 if (part != null) 2829 if (part != null)
2814 { 2830 {
2831 part.IgnoreUndoUpdate = true;
2815 if (scale.X > m_scene.m_maxNonphys) 2832 if (scale.X > m_scene.m_maxNonphys)
2816 scale.X = m_scene.m_maxNonphys; 2833 scale.X = m_scene.m_maxNonphys;
2817 if (scale.Y > m_scene.m_maxNonphys) 2834 if (scale.Y > m_scene.m_maxNonphys)
@@ -2839,6 +2856,7 @@ namespace OpenSim.Region.Framework.Scenes
2839 { 2856 {
2840 if (obPart.UUID != m_rootPart.UUID) 2857 if (obPart.UUID != m_rootPart.UUID)
2841 { 2858 {
2859 obPart.IgnoreUndoUpdate = true;
2842 Vector3 oldSize = new Vector3(obPart.Scale); 2860 Vector3 oldSize = new Vector3(obPart.Scale);
2843 2861
2844 float f = 1.0f; 2862 float f = 1.0f;
@@ -2898,6 +2916,8 @@ namespace OpenSim.Region.Framework.Scenes
2898 z *= a; 2916 z *= a;
2899 } 2917 }
2900 } 2918 }
2919 obPart.IgnoreUndoUpdate = false;
2920 obPart.StoreUndoState();
2901 } 2921 }
2902 } 2922 }
2903 } 2923 }
@@ -2913,6 +2933,7 @@ namespace OpenSim.Region.Framework.Scenes
2913 { 2933 {
2914 foreach (SceneObjectPart obPart in m_parts.Values) 2934 foreach (SceneObjectPart obPart in m_parts.Values)
2915 { 2935 {
2936 obPart.IgnoreUndoUpdate = true;
2916 if (obPart.UUID != m_rootPart.UUID) 2937 if (obPart.UUID != m_rootPart.UUID)
2917 { 2938 {
2918 Vector3 currentpos = new Vector3(obPart.OffsetPosition); 2939 Vector3 currentpos = new Vector3(obPart.OffsetPosition);
@@ -2926,6 +2947,8 @@ namespace OpenSim.Region.Framework.Scenes
2926 obPart.Resize(newSize); 2947 obPart.Resize(newSize);
2927 obPart.UpdateOffSet(currentpos); 2948 obPart.UpdateOffSet(currentpos);
2928 } 2949 }
2950 obPart.IgnoreUndoUpdate = false;
2951 obPart.StoreUndoState();
2929 } 2952 }
2930 } 2953 }
2931 2954
@@ -2935,6 +2958,8 @@ namespace OpenSim.Region.Framework.Scenes
2935 m_scene.PhysicsScene.AddPhysicsActorTaint(part.PhysActor); 2958 m_scene.PhysicsScene.AddPhysicsActorTaint(part.PhysActor);
2936 } 2959 }
2937 2960
2961 part.IgnoreUndoUpdate = false;
2962 part.StoreUndoState();
2938 HasGroupChanged = true; 2963 HasGroupChanged = true;
2939 ScheduleGroupForTerseUpdate(); 2964 ScheduleGroupForTerseUpdate();
2940 } 2965 }
@@ -2950,13 +2975,26 @@ namespace OpenSim.Region.Framework.Scenes
2950 /// <param name="pos"></param> 2975 /// <param name="pos"></param>
2951 public void UpdateGroupPosition(Vector3 pos) 2976 public void UpdateGroupPosition(Vector3 pos)
2952 { 2977 {
2978 foreach (SceneObjectPart part in Children.Values)
2979 {
2980 part.StoreUndoState();
2981 }
2953 if (m_scene.EventManager.TriggerGroupMove(UUID, pos)) 2982 if (m_scene.EventManager.TriggerGroupMove(UUID, pos))
2954 { 2983 {
2955 if (IsAttachment) 2984 if (IsAttachment)
2956 { 2985 {
2957 m_rootPart.AttachedPos = pos; 2986 m_rootPart.AttachedPos = pos;
2958 } 2987 }
2959 2988 if (RootPart.GetStatusSandbox())
2989 {
2990 if (Util.GetDistanceTo(RootPart.StatusSandboxPos, pos) > 10)
2991 {
2992 RootPart.ScriptSetPhysicsStatus(false);
2993 pos = AbsolutePosition;
2994 Scene.SimChat(Utils.StringToBytes("Hit Sandbox Limit"),
2995 ChatTypeEnum.DebugChannel, 0x7FFFFFFF, RootPart.AbsolutePosition, Name, UUID, false);
2996 }
2997 }
2960 AbsolutePosition = pos; 2998 AbsolutePosition = pos;
2961 2999
2962 HasGroupChanged = true; 3000 HasGroupChanged = true;
@@ -2975,7 +3013,10 @@ namespace OpenSim.Region.Framework.Scenes
2975 public void UpdateSinglePosition(Vector3 pos, uint localID) 3013 public void UpdateSinglePosition(Vector3 pos, uint localID)
2976 { 3014 {
2977 SceneObjectPart part = GetChildPart(localID); 3015 SceneObjectPart part = GetChildPart(localID);
2978 3016 foreach (SceneObjectPart parts in Children.Values)
3017 {
3018 parts.StoreUndoState();
3019 }
2979 if (part != null) 3020 if (part != null)
2980 { 3021 {
2981 if (part.UUID == m_rootPart.UUID) 3022 if (part.UUID == m_rootPart.UUID)
@@ -2997,6 +3038,10 @@ namespace OpenSim.Region.Framework.Scenes
2997 /// <param name="pos"></param> 3038 /// <param name="pos"></param>
2998 private void UpdateRootPosition(Vector3 pos) 3039 private void UpdateRootPosition(Vector3 pos)
2999 { 3040 {
3041 foreach (SceneObjectPart part in Children.Values)
3042 {
3043 part.StoreUndoState();
3044 }
3000 Vector3 newPos = new Vector3(pos.X, pos.Y, pos.Z); 3045 Vector3 newPos = new Vector3(pos.X, pos.Y, pos.Z);
3001 Vector3 oldPos = 3046 Vector3 oldPos =
3002 new Vector3(AbsolutePosition.X + m_rootPart.OffsetPosition.X, 3047 new Vector3(AbsolutePosition.X + m_rootPart.OffsetPosition.X,
@@ -3040,6 +3085,10 @@ namespace OpenSim.Region.Framework.Scenes
3040 /// <param name="rot"></param> 3085 /// <param name="rot"></param>
3041 public void UpdateGroupRotationR(Quaternion rot) 3086 public void UpdateGroupRotationR(Quaternion rot)
3042 { 3087 {
3088 foreach (SceneObjectPart parts in Children.Values)
3089 {
3090 parts.StoreUndoState();
3091 }
3043 m_rootPart.UpdateRotation(rot); 3092 m_rootPart.UpdateRotation(rot);
3044 3093
3045 PhysicsActor actor = m_rootPart.PhysActor; 3094 PhysicsActor actor = m_rootPart.PhysActor;
@@ -3060,6 +3109,10 @@ namespace OpenSim.Region.Framework.Scenes
3060 /// <param name="rot"></param> 3109 /// <param name="rot"></param>
3061 public void UpdateGroupRotationPR(Vector3 pos, Quaternion rot) 3110 public void UpdateGroupRotationPR(Vector3 pos, Quaternion rot)
3062 { 3111 {
3112 foreach (SceneObjectPart parts in Children.Values)
3113 {
3114 parts.StoreUndoState();
3115 }
3063 m_rootPart.UpdateRotation(rot); 3116 m_rootPart.UpdateRotation(rot);
3064 3117
3065 PhysicsActor actor = m_rootPart.PhysActor; 3118 PhysicsActor actor = m_rootPart.PhysActor;
@@ -3083,6 +3136,10 @@ namespace OpenSim.Region.Framework.Scenes
3083 public void UpdateSingleRotation(Quaternion rot, uint localID) 3136 public void UpdateSingleRotation(Quaternion rot, uint localID)
3084 { 3137 {
3085 SceneObjectPart part = GetChildPart(localID); 3138 SceneObjectPart part = GetChildPart(localID);
3139 foreach (SceneObjectPart parts in Children.Values)
3140 {
3141 parts.StoreUndoState();
3142 }
3086 if (part != null) 3143 if (part != null)
3087 { 3144 {
3088 if (part.UUID == m_rootPart.UUID) 3145 if (part.UUID == m_rootPart.UUID)
@@ -3113,8 +3170,11 @@ namespace OpenSim.Region.Framework.Scenes
3113 } 3170 }
3114 else 3171 else
3115 { 3172 {
3173 part.IgnoreUndoUpdate = true;
3116 part.UpdateRotation(rot); 3174 part.UpdateRotation(rot);
3117 part.OffsetPosition = pos; 3175 part.OffsetPosition = pos;
3176 part.IgnoreUndoUpdate = false;
3177 part.StoreUndoState();
3118 } 3178 }
3119 } 3179 }
3120 } 3180 }
@@ -3128,6 +3188,7 @@ namespace OpenSim.Region.Framework.Scenes
3128 Quaternion axRot = rot; 3188 Quaternion axRot = rot;
3129 Quaternion oldParentRot = m_rootPart.RotationOffset; 3189 Quaternion oldParentRot = m_rootPart.RotationOffset;
3130 3190
3191 m_rootPart.StoreUndoState();
3131 m_rootPart.UpdateRotation(rot); 3192 m_rootPart.UpdateRotation(rot);
3132 if (m_rootPart.PhysActor != null) 3193 if (m_rootPart.PhysActor != null)
3133 { 3194 {
@@ -3141,6 +3202,7 @@ namespace OpenSim.Region.Framework.Scenes
3141 { 3202 {
3142 if (prim.UUID != m_rootPart.UUID) 3203 if (prim.UUID != m_rootPart.UUID)
3143 { 3204 {
3205 prim.IgnoreUndoUpdate = true;
3144 Vector3 axPos = prim.OffsetPosition; 3206 Vector3 axPos = prim.OffsetPosition;
3145 axPos *= oldParentRot; 3207 axPos *= oldParentRot;
3146 axPos *= Quaternion.Inverse(axRot); 3208 axPos *= Quaternion.Inverse(axRot);
@@ -3153,7 +3215,14 @@ namespace OpenSim.Region.Framework.Scenes
3153 } 3215 }
3154 } 3216 }
3155 } 3217 }
3156 3218 foreach (SceneObjectPart childpart in Children.Values)
3219 {
3220 if (childpart != m_rootPart)
3221 {
3222 childpart.IgnoreUndoUpdate = false;
3223 childpart.StoreUndoState();
3224 }
3225 }
3157 m_rootPart.ScheduleTerseUpdate(); 3226 m_rootPart.ScheduleTerseUpdate();
3158 } 3227 }
3159 3228
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index dd797fc..d339208 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();
@@ -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/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 9c7559b..675fb69 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;
@@ -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)
@@ -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}",
@@ -1193,6 +1226,14 @@ namespace OpenSim.Region.Framework.Scenes
1193 } 1226 }
1194 else 1227 else
1195 { 1228 {
1229 if (m_pos.X < 0)
1230 m_pos.X = 128;
1231 if (m_pos.Y < 0)
1232 m_pos.Y = 128;
1233 if (m_pos.X > Scene.WestBorders[0].BorderLine.X)
1234 m_pos.X = 128;
1235 if (m_pos.Y > Scene.NorthBorders[0].BorderLine.Y)
1236 m_pos.Y = 128;
1196 m_LastFinitePos = m_pos; 1237 m_LastFinitePos = m_pos;
1197 } 1238 }
1198 1239
@@ -2704,36 +2745,72 @@ namespace OpenSim.Region.Framework.Scenes
2704 { 2745 {
2705 // Checks if where it's headed exists a region 2746 // Checks if where it's headed exists a region
2706 2747
2748 bool needsTransit = false;
2707 if (m_scene.TestBorderCross(pos2, Cardinals.W)) 2749 if (m_scene.TestBorderCross(pos2, Cardinals.W))
2708 { 2750 {
2709 if (m_scene.TestBorderCross(pos2, Cardinals.S)) 2751 if (m_scene.TestBorderCross(pos2, Cardinals.S))
2752 {
2753 needsTransit = true;
2710 neighbor = HaveNeighbor(Cardinals.SW, ref fix); 2754 neighbor = HaveNeighbor(Cardinals.SW, ref fix);
2755 }
2711 else if (m_scene.TestBorderCross(pos2, Cardinals.N)) 2756 else if (m_scene.TestBorderCross(pos2, Cardinals.N))
2757 {
2758 needsTransit = true;
2712 neighbor = HaveNeighbor(Cardinals.NW, ref fix); 2759 neighbor = HaveNeighbor(Cardinals.NW, ref fix);
2760 }
2713 else 2761 else
2762 {
2763 needsTransit = true;
2714 neighbor = HaveNeighbor(Cardinals.W, ref fix); 2764 neighbor = HaveNeighbor(Cardinals.W, ref fix);
2765 }
2715 } 2766 }
2716 else if (m_scene.TestBorderCross(pos2, Cardinals.E)) 2767 else if (m_scene.TestBorderCross(pos2, Cardinals.E))
2717 { 2768 {
2718 if (m_scene.TestBorderCross(pos2, Cardinals.S)) 2769 if (m_scene.TestBorderCross(pos2, Cardinals.S))
2770 {
2771 needsTransit = true;
2719 neighbor = HaveNeighbor(Cardinals.SE, ref fix); 2772 neighbor = HaveNeighbor(Cardinals.SE, ref fix);
2773 }
2720 else if (m_scene.TestBorderCross(pos2, Cardinals.N)) 2774 else if (m_scene.TestBorderCross(pos2, Cardinals.N))
2775 {
2776 needsTransit = true;
2721 neighbor = HaveNeighbor(Cardinals.NE, ref fix); 2777 neighbor = HaveNeighbor(Cardinals.NE, ref fix);
2778 }
2722 else 2779 else
2780 {
2781 needsTransit = true;
2723 neighbor = HaveNeighbor(Cardinals.E, ref fix); 2782 neighbor = HaveNeighbor(Cardinals.E, ref fix);
2783 }
2724 } 2784 }
2725 else if (m_scene.TestBorderCross(pos2, Cardinals.S)) 2785 else if (m_scene.TestBorderCross(pos2, Cardinals.S))
2786 {
2787 needsTransit = true;
2726 neighbor = HaveNeighbor(Cardinals.S, ref fix); 2788 neighbor = HaveNeighbor(Cardinals.S, ref fix);
2789 }
2727 else if (m_scene.TestBorderCross(pos2, Cardinals.N)) 2790 else if (m_scene.TestBorderCross(pos2, Cardinals.N))
2791 {
2792 needsTransit = true;
2728 neighbor = HaveNeighbor(Cardinals.N, ref fix); 2793 neighbor = HaveNeighbor(Cardinals.N, ref fix);
2794 }
2795
2729 2796
2730
2731 // Makes sure avatar does not end up outside region 2797 // Makes sure avatar does not end up outside region
2732 if (neighbor < 0) 2798 if (neighbor <= 0)
2733 AbsolutePosition = new Vector3( 2799 {
2734 AbsolutePosition.X + 3*fix[0], 2800 if (!needsTransit)
2735 AbsolutePosition.Y + 3*fix[1], 2801 {
2736 AbsolutePosition.Z); 2802 Vector3 pos = AbsolutePosition;
2803 if (AbsolutePosition.X < 0)
2804 pos.X += Velocity.Y;
2805 else if (AbsolutePosition.X > Constants.RegionSize)
2806 pos.X -= Velocity.Y;
2807 if (AbsolutePosition.Y < 0)
2808 pos.Y += Velocity.Y;
2809 else if (AbsolutePosition.Y > Constants.RegionSize)
2810 pos.Y -= Velocity.Y;
2811 AbsolutePosition = pos;
2812 }
2813 }
2737 else if (neighbor > 0) 2814 else if (neighbor > 0)
2738 CrossToNewRegion(); 2815 CrossToNewRegion();
2739 } 2816 }
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}
diff --git a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs
index b421623..009dd37 100644
--- a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs
+++ b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs
@@ -774,6 +774,8 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server
774 public event UUIDNameRequest OnTeleportHomeRequest; 774 public event UUIDNameRequest OnTeleportHomeRequest;
775 public event ScriptAnswer OnScriptAnswer; 775 public event ScriptAnswer OnScriptAnswer;
776 public event AgentSit OnUndo; 776 public event AgentSit OnUndo;
777 public event AgentSit OnRedo;
778 public event LandUndo OnLandUndo;
777 public event ForceReleaseControls OnForceReleaseControls; 779 public event ForceReleaseControls OnForceReleaseControls;
778 public event GodLandStatRequest OnLandStatRequest; 780 public event GodLandStatRequest OnLandStatRequest;
779 public event DetailedEstateDataRequest OnDetailedEstateDataRequest; 781 public event DetailedEstateDataRequest OnDetailedEstateDataRequest;
diff --git a/OpenSim/Region/OptionalModules/Scripting/Minimodule/SOPObject.cs b/OpenSim/Region/OptionalModules/Scripting/Minimodule/SOPObject.cs
index 31f28e0..5bfe4be 100644
--- a/OpenSim/Region/OptionalModules/Scripting/Minimodule/SOPObject.cs
+++ b/OpenSim/Region/OptionalModules/Scripting/Minimodule/SOPObject.cs
@@ -767,7 +767,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
767 if (!CanEdit()) 767 if (!CanEdit())
768 return; 768 return;
769 769
770 GetSOP().SendSound(asset.ToString(), volume, true, 0); 770 GetSOP().SendSound(asset.ToString(), volume, true, 0, 0, false, false);
771 } 771 }
772 772
773 #endregion 773 #endregion
diff --git a/OpenSim/Region/OptionalModules/Scripting/Minimodule/World.cs b/OpenSim/Region/OptionalModules/Scripting/Minimodule/World.cs
index c7cd37b..45bb005 100644
--- a/OpenSim/Region/OptionalModules/Scripting/Minimodule/World.cs
+++ b/OpenSim/Region/OptionalModules/Scripting/Minimodule/World.cs
@@ -231,7 +231,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
231 if (soundModule != null) 231 if (soundModule != null)
232 { 232 {
233 soundModule.TriggerSound(audio, UUID.Zero, UUID.Zero, UUID.Zero, volume, position, 233 soundModule.TriggerSound(audio, UUID.Zero, UUID.Zero, UUID.Zero, volume, position,
234 m_internalScene.RegionInfo.RegionHandle); 234 m_internalScene.RegionInfo.RegionHandle, 0);
235 } 235 }
236 } 236 }
237 237
@@ -241,7 +241,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
241 if (soundModule != null) 241 if (soundModule != null)
242 { 242 {
243 soundModule.TriggerSound(audio, UUID.Zero, UUID.Zero, UUID.Zero, 1.0, position, 243 soundModule.TriggerSound(audio, UUID.Zero, UUID.Zero, UUID.Zero, 1.0, position,
244 m_internalScene.RegionInfo.RegionHandle); 244 m_internalScene.RegionInfo.RegionHandle, 0);
245 } 245 }
246 } 246 }
247 247
diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs
index 1d15552..b331001 100644
--- a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs
+++ b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs
@@ -298,6 +298,8 @@ namespace OpenSim.Region.OptionalModules.World.NPC
298 public event ObjectBuy OnObjectBuy; 298 public event ObjectBuy OnObjectBuy;
299 public event BuyObjectInventory OnBuyObjectInventory; 299 public event BuyObjectInventory OnBuyObjectInventory;
300 public event AgentSit OnUndo; 300 public event AgentSit OnUndo;
301 public event AgentSit OnRedo;
302 public event LandUndo OnLandUndo;
301 303
302 public event ForceReleaseControls OnForceReleaseControls; 304 public event ForceReleaseControls OnForceReleaseControls;
303 public event GodLandStatRequest OnLandStatRequest; 305 public event GodLandStatRequest OnLandStatRequest;
diff --git a/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsActor.cs b/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsActor.cs
index 31366db..5e2eeeb 100644
--- a/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsActor.cs
+++ b/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsActor.cs
@@ -185,6 +185,11 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin
185 185
186 } 186 }
187 187
188 public override void VehicleFlags(int param, bool remove)
189 {
190
191 }
192
188 public override void SetVolumeDetect(int param) 193 public override void SetVolumeDetect(int param)
189 { 194 {
190 195
diff --git a/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETCharacter.cs b/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETCharacter.cs
index 97eb6a2..6a54705 100644
--- a/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETCharacter.cs
+++ b/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETCharacter.cs
@@ -362,6 +362,11 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin
362 362
363 } 363 }
364 364
365 public override void VehicleFlags(int param, bool remove)
366 {
367
368 }
369
365 public override void SetVolumeDetect(int param) 370 public override void SetVolumeDetect(int param)
366 { 371 {
367 372
diff --git a/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETPrim.cs b/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETPrim.cs
index 9603ea4..920ed96 100644
--- a/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETPrim.cs
+++ b/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETPrim.cs
@@ -397,6 +397,11 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin
397 //TODO: 397 //TODO:
398 } 398 }
399 399
400 public override void VehicleFlags(int param, bool remove)
401 {
402
403 }
404
400 public override void SetVolumeDetect(int param) 405 public override void SetVolumeDetect(int param)
401 { 406 {
402 //TODO: GhostObject 407 //TODO: GhostObject
diff --git a/OpenSim/Region/Physics/BulletXPlugin/BulletXPlugin.cs b/OpenSim/Region/Physics/BulletXPlugin/BulletXPlugin.cs
index d5d146e..e2a6a2e 100644
--- a/OpenSim/Region/Physics/BulletXPlugin/BulletXPlugin.cs
+++ b/OpenSim/Region/Physics/BulletXPlugin/BulletXPlugin.cs
@@ -500,6 +500,18 @@ namespace OpenSim.Region.Physics.BulletXPlugin
500 public BulletXScene(String sceneIdentifier) 500 public BulletXScene(String sceneIdentifier)
501 { 501 {
502 //identifier = sceneIdentifier; 502 //identifier = sceneIdentifier;
503 cDispatcher = new CollisionDispatcherLocal(this);
504 Vector3 worldMinDim = new Vector3((float)minXY, (float)minXY, (float)minZ);
505 Vector3 worldMaxDim = new Vector3((float)maxXY, (float)maxXY, (float)maxZ);
506 opCache = new AxisSweep3(worldMinDim, worldMaxDim, maxHandles);
507 sicSolver = new SequentialImpulseConstraintSolver();
508
509 lock (BulletXLock)
510 {
511 ddWorld = new DiscreteDynamicsWorld(cDispatcher, opCache, sicSolver);
512 ddWorld.Gravity = new Vector3(0, 0, -gravity);
513 }
514 //this._heightmap = new float[65536];
503 } 515 }
504 516
505 public static float Gravity 517 public static float Gravity
@@ -582,12 +594,12 @@ namespace OpenSim.Region.Physics.BulletXPlugin
582 pos.Y = position.Y; 594 pos.Y = position.Y;
583 pos.Z = position.Z + 20; 595 pos.Z = position.Z + 20;
584 BulletXCharacter newAv = null; 596 BulletXCharacter newAv = null;
585 newAv.Flying = isFlying;
586 lock (BulletXLock) 597 lock (BulletXLock)
587 { 598 {
588 newAv = new BulletXCharacter(avName, this, pos); 599 newAv = new BulletXCharacter(avName, this, pos);
589 _characters.Add(newAv.RigidBody, newAv); 600 _characters.Add(newAv.RigidBody, newAv);
590 } 601 }
602 newAv.Flying = isFlying;
591 return newAv; 603 return newAv;
592 } 604 }
593 605
@@ -984,6 +996,11 @@ namespace OpenSim.Region.Physics.BulletXPlugin
984 { 996 {
985 997
986 } 998 }
999
1000 public override void VehicleFlags(int param, bool remove)
1001 {
1002
1003 }
987 1004
988 public override void SetVolumeDetect(int param) 1005 public override void SetVolumeDetect(int param)
989 { 1006 {
diff --git a/OpenSim/Region/Physics/Manager/PhysicsActor.cs b/OpenSim/Region/Physics/Manager/PhysicsActor.cs
index 9c192ed..880c3ea 100644
--- a/OpenSim/Region/Physics/Manager/PhysicsActor.cs
+++ b/OpenSim/Region/Physics/Manager/PhysicsActor.cs
@@ -208,6 +208,7 @@ namespace OpenSim.Region.Physics.Manager
208 public abstract void VehicleFloatParam(int param, float value); 208 public abstract void VehicleFloatParam(int param, float value);
209 public abstract void VehicleVectorParam(int param, Vector3 value); 209 public abstract void VehicleVectorParam(int param, Vector3 value);
210 public abstract void VehicleRotationParam(int param, Quaternion rotation); 210 public abstract void VehicleRotationParam(int param, Quaternion rotation);
211 public abstract void VehicleFlags(int param, bool remove);
211 212
212 public abstract void SetVolumeDetect(int param); // Allows the detection of collisions with inherently non-physical prims. see llVolumeDetect for more 213 public abstract void SetVolumeDetect(int param); // Allows the detection of collisions with inherently non-physical prims. see llVolumeDetect for more
213 214
@@ -352,6 +353,11 @@ namespace OpenSim.Region.Physics.Manager
352 353
353 } 354 }
354 355
356 public override void VehicleFlags(int param, bool remove)
357 {
358
359 }
360
355 public override void SetVolumeDetect(int param) 361 public override void SetVolumeDetect(int param)
356 { 362 {
357 363
diff --git a/OpenSim/Region/Physics/Manager/VehicleConstants.cs b/OpenSim/Region/Physics/Manager/VehicleConstants.cs
index 532e55e..f0775c1 100644
--- a/OpenSim/Region/Physics/Manager/VehicleConstants.cs
+++ b/OpenSim/Region/Physics/Manager/VehicleConstants.cs
@@ -91,7 +91,9 @@ namespace OpenSim.Region.Physics.Manager
91 BANKING_EFFICIENCY = 38, 91 BANKING_EFFICIENCY = 38,
92 BANKING_MIX = 39, 92 BANKING_MIX = 39,
93 BANKING_TIMESCALE = 40, 93 BANKING_TIMESCALE = 40,
94 REFERENCE_FRAME = 44 94 REFERENCE_FRAME = 44,
95 BLOCK_EXIT = 45,
96 ROLL_FRAME = 46
95 97
96 } 98 }
97 99
@@ -107,7 +109,13 @@ namespace OpenSim.Region.Physics.Manager
107 LIMIT_MOTOR_UP = 64, 109 LIMIT_MOTOR_UP = 64,
108 MOUSELOOK_STEER = 128, 110 MOUSELOOK_STEER = 128,
109 MOUSELOOK_BANK = 256, 111 MOUSELOOK_BANK = 256,
110 CAMERA_DECOUPLED = 512 112 CAMERA_DECOUPLED = 512,
113 NO_X = 1024,
114 NO_Y = 2048,
115 NO_Z = 4096,
116 LOCK_HOVER_HEIGHT = 8192,
117 NO_DEFLECTION = 16392,
118 LOCK_ROTATION = 32784
111 } 119 }
112 120
113} 121}
diff --git a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs
index 06ed8fb..a2229e8 100644
--- a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs
+++ b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs
@@ -734,6 +734,11 @@ namespace OpenSim.Region.Physics.OdePlugin
734 734
735 } 735 }
736 736
737 public override void VehicleFlags(int param, bool remove)
738 {
739
740 }
741
737 public override void SetVolumeDetect(int param) 742 public override void SetVolumeDetect(int param)
738 { 743 {
739 744
diff --git a/OpenSim/Region/Physics/OdePlugin/ODEDynamics.cs b/OpenSim/Region/Physics/OdePlugin/ODEDynamics.cs
index 008070b..6ae0c8a 100644
--- a/OpenSim/Region/Physics/OdePlugin/ODEDynamics.cs
+++ b/OpenSim/Region/Physics/OdePlugin/ODEDynamics.cs
@@ -82,7 +82,9 @@ namespace OpenSim.Region.Physics.OdePlugin
82 // HOVER_UP_ONLY 82 // HOVER_UP_ONLY
83 // LIMIT_MOTOR_UP 83 // LIMIT_MOTOR_UP
84 // LIMIT_ROLL_ONLY 84 // LIMIT_ROLL_ONLY
85 85 private VehicleFlag m_Hoverflags = (VehicleFlag)0;
86 private Vector3 m_BlockingEndPoint = Vector3.Zero;
87 private Quaternion m_RollreferenceFrame = Quaternion.Identity;
86 // Linear properties 88 // Linear properties
87 private Vector3 m_linearMotorDirection = Vector3.Zero; // velocity requested by LSL, decayed by time 89 private Vector3 m_linearMotorDirection = Vector3.Zero; // velocity requested by LSL, decayed by time
88 private Vector3 m_linearMotorDirectionLASTSET = Vector3.Zero; // velocity requested by LSL 90 private Vector3 m_linearMotorDirectionLASTSET = Vector3.Zero; // velocity requested by LSL
@@ -91,6 +93,7 @@ namespace OpenSim.Region.Physics.OdePlugin
91 private float m_linearMotorDecayTimescale = 0; 93 private float m_linearMotorDecayTimescale = 0;
92 private float m_linearMotorTimescale = 0; 94 private float m_linearMotorTimescale = 0;
93 private Vector3 m_lastLinearVelocityVector = Vector3.Zero; 95 private Vector3 m_lastLinearVelocityVector = Vector3.Zero;
96 private d.Vector3 m_lastPositionVector = new d.Vector3();
94 // private bool m_LinearMotorSetLastFrame = false; 97 // private bool m_LinearMotorSetLastFrame = false;
95 // private Vector3 m_linearMotorOffset = Vector3.Zero; 98 // private Vector3 m_linearMotorOffset = Vector3.Zero;
96 99
@@ -255,6 +258,9 @@ namespace OpenSim.Region.Physics.OdePlugin
255 case Vehicle.LINEAR_MOTOR_OFFSET: 258 case Vehicle.LINEAR_MOTOR_OFFSET:
256 // m_linearMotorOffset = new Vector3(pValue.X, pValue.Y, pValue.Z); 259 // m_linearMotorOffset = new Vector3(pValue.X, pValue.Y, pValue.Z);
257 break; 260 break;
261 case Vehicle.BLOCK_EXIT:
262 m_BlockingEndPoint = new Vector3(pValue.X, pValue.Y, pValue.Z);
263 break;
258 } 264 }
259 }//end ProcessVectorVehicleParam 265 }//end ProcessVectorVehicleParam
260 266
@@ -265,15 +271,189 @@ namespace OpenSim.Region.Physics.OdePlugin
265 case Vehicle.REFERENCE_FRAME: 271 case Vehicle.REFERENCE_FRAME:
266 // m_referenceFrame = pValue; 272 // m_referenceFrame = pValue;
267 break; 273 break;
274 case Vehicle.ROLL_FRAME:
275 m_RollreferenceFrame = pValue;
276 break;
268 } 277 }
269 }//end ProcessRotationVehicleParam 278 }//end ProcessRotationVehicleParam
270 279
280 internal void ProcessVehicleFlags(int pParam, bool remove)
281 {
282 if (remove)
283 {
284 if (pParam == -1)
285 {
286 m_flags = (VehicleFlag)0;
287 m_Hoverflags = (VehicleFlag)0;
288 return;
289 }
290 if ((pParam & (int)VehicleFlag.HOVER_GLOBAL_HEIGHT) == (int)VehicleFlag.HOVER_GLOBAL_HEIGHT)
291 {
292 if ((m_Hoverflags & VehicleFlag.HOVER_GLOBAL_HEIGHT) != (VehicleFlag)0)
293 m_Hoverflags &= ~(VehicleFlag.HOVER_GLOBAL_HEIGHT);
294 }
295 if ((pParam & (int)VehicleFlag.HOVER_TERRAIN_ONLY) == (int)VehicleFlag.HOVER_TERRAIN_ONLY)
296 {
297 if ((m_Hoverflags & VehicleFlag.HOVER_TERRAIN_ONLY) != (VehicleFlag)0)
298 m_Hoverflags &= ~(VehicleFlag.HOVER_TERRAIN_ONLY);
299 }
300 if ((pParam & (int)VehicleFlag.HOVER_UP_ONLY) == (int)VehicleFlag.HOVER_UP_ONLY)
301 {
302 if ((m_Hoverflags & VehicleFlag.HOVER_UP_ONLY) != (VehicleFlag)0)
303 m_Hoverflags &= ~(VehicleFlag.HOVER_UP_ONLY);
304 }
305 if ((pParam & (int)VehicleFlag.HOVER_WATER_ONLY) == (int)VehicleFlag.HOVER_WATER_ONLY)
306 {
307 if ((m_Hoverflags & VehicleFlag.HOVER_WATER_ONLY) != (VehicleFlag)0)
308 m_Hoverflags &= ~(VehicleFlag.HOVER_WATER_ONLY);
309 }
310 if ((pParam & (int)VehicleFlag.LIMIT_MOTOR_UP) == (int)VehicleFlag.LIMIT_MOTOR_UP)
311 {
312 if ((m_flags & VehicleFlag.LIMIT_MOTOR_UP) != (VehicleFlag)0)
313 m_flags &= ~(VehicleFlag.LIMIT_MOTOR_UP);
314 }
315 if ((pParam & (int)VehicleFlag.LIMIT_ROLL_ONLY) == (int)VehicleFlag.LIMIT_ROLL_ONLY)
316 {
317 if ((m_flags & VehicleFlag.LIMIT_ROLL_ONLY) != (VehicleFlag)0)
318 m_flags &= ~(VehicleFlag.LIMIT_ROLL_ONLY);
319 }
320 if ((pParam & (int)VehicleFlag.MOUSELOOK_BANK) == (int)VehicleFlag.MOUSELOOK_BANK)
321 {
322 if ((m_flags & VehicleFlag.MOUSELOOK_BANK) != (VehicleFlag)0)
323 m_flags &= ~(VehicleFlag.MOUSELOOK_BANK);
324 }
325 if ((pParam & (int)VehicleFlag.MOUSELOOK_STEER) == (int)VehicleFlag.MOUSELOOK_STEER)
326 {
327 if ((m_flags & VehicleFlag.MOUSELOOK_STEER) != (VehicleFlag)0)
328 m_flags &= ~(VehicleFlag.MOUSELOOK_STEER);
329 }
330 if ((pParam & (int)VehicleFlag.NO_DEFLECTION_UP) == (int)VehicleFlag.NO_DEFLECTION_UP)
331 {
332 if ((m_flags & VehicleFlag.NO_DEFLECTION_UP) != (VehicleFlag)0)
333 m_flags &= ~(VehicleFlag.NO_DEFLECTION_UP);
334 }
335 if ((pParam & (int)VehicleFlag.CAMERA_DECOUPLED) == (int)VehicleFlag.CAMERA_DECOUPLED)
336 {
337 if ((m_flags & VehicleFlag.CAMERA_DECOUPLED) != (VehicleFlag)0)
338 m_flags &= ~(VehicleFlag.CAMERA_DECOUPLED);
339 }
340 if ((pParam & (int)VehicleFlag.NO_X) == (int)VehicleFlag.NO_X)
341 {
342 if ((m_flags & VehicleFlag.NO_X) != (VehicleFlag)0)
343 m_flags &= ~(VehicleFlag.NO_X);
344 }
345 if ((pParam & (int)VehicleFlag.NO_Y) == (int)VehicleFlag.NO_Y)
346 {
347 if ((m_flags & VehicleFlag.NO_Y) != (VehicleFlag)0)
348 m_flags &= ~(VehicleFlag.NO_Y);
349 }
350 if ((pParam & (int)VehicleFlag.NO_Z) == (int)VehicleFlag.NO_Z)
351 {
352 if ((m_flags & VehicleFlag.NO_Z) != (VehicleFlag)0)
353 m_flags &= ~(VehicleFlag.NO_Z);
354 }
355 if ((pParam & (int)VehicleFlag.LOCK_HOVER_HEIGHT) == (int)VehicleFlag.LOCK_HOVER_HEIGHT)
356 {
357 if ((m_Hoverflags & VehicleFlag.LOCK_HOVER_HEIGHT) != (VehicleFlag)0)
358 m_Hoverflags &= ~(VehicleFlag.LOCK_HOVER_HEIGHT);
359 }
360 if ((pParam & (int)VehicleFlag.NO_DEFLECTION) == (int)VehicleFlag.NO_DEFLECTION)
361 {
362 if ((m_flags & VehicleFlag.NO_DEFLECTION) != (VehicleFlag)0)
363 m_flags &= ~(VehicleFlag.NO_DEFLECTION);
364 }
365 if ((pParam & (int)VehicleFlag.LOCK_ROTATION) == (int)VehicleFlag.LOCK_ROTATION)
366 {
367 if ((m_flags & VehicleFlag.LOCK_ROTATION) != (VehicleFlag)0)
368 m_flags &= ~(VehicleFlag.LOCK_ROTATION);
369 }
370 }
371 else
372 {
373 if ((pParam & (int)VehicleFlag.HOVER_GLOBAL_HEIGHT) == (int)VehicleFlag.HOVER_GLOBAL_HEIGHT)
374 {
375 m_Hoverflags |= (VehicleFlag.HOVER_GLOBAL_HEIGHT | m_flags);
376 }
377 if ((pParam & (int)VehicleFlag.HOVER_TERRAIN_ONLY) == (int)VehicleFlag.HOVER_TERRAIN_ONLY)
378 {
379 m_Hoverflags |= (VehicleFlag.HOVER_TERRAIN_ONLY | m_flags);
380 }
381 if ((pParam & (int)VehicleFlag.HOVER_UP_ONLY) == (int)VehicleFlag.HOVER_UP_ONLY)
382 {
383 m_Hoverflags |= (VehicleFlag.HOVER_UP_ONLY | m_flags);
384 }
385 if ((pParam & (int)VehicleFlag.HOVER_WATER_ONLY) == (int)VehicleFlag.HOVER_WATER_ONLY)
386 {
387 m_Hoverflags |= (VehicleFlag.HOVER_WATER_ONLY | m_flags);
388 }
389 if ((pParam & (int)VehicleFlag.LIMIT_MOTOR_UP) == (int)VehicleFlag.LIMIT_MOTOR_UP)
390 {
391 m_flags |= (VehicleFlag.LIMIT_MOTOR_UP | m_flags);
392 }
393 if ((pParam & (int)VehicleFlag.MOUSELOOK_BANK) == (int)VehicleFlag.MOUSELOOK_BANK)
394 {
395 m_flags |= (VehicleFlag.MOUSELOOK_BANK | m_flags);
396 }
397 if ((pParam & (int)VehicleFlag.MOUSELOOK_STEER) == (int)VehicleFlag.MOUSELOOK_STEER)
398 {
399 m_flags |= (VehicleFlag.MOUSELOOK_STEER | m_flags);
400 }
401 if ((pParam & (int)VehicleFlag.NO_DEFLECTION_UP) == (int)VehicleFlag.NO_DEFLECTION_UP)
402 {
403 m_flags |= (VehicleFlag.NO_DEFLECTION_UP | m_flags);
404 }
405 if ((pParam & (int)VehicleFlag.CAMERA_DECOUPLED) == (int)VehicleFlag.CAMERA_DECOUPLED)
406 {
407 m_flags |= (VehicleFlag.CAMERA_DECOUPLED | m_flags);
408 }
409 if ((pParam & (int)VehicleFlag.NO_X) == (int)VehicleFlag.NO_X)
410 {
411 m_flags |= (VehicleFlag.NO_X);
412 }
413 if ((pParam & (int)VehicleFlag.NO_Y) == (int)VehicleFlag.NO_Y)
414 {
415 m_flags |= (VehicleFlag.NO_Y);
416 }
417 if ((pParam & (int)VehicleFlag.NO_Z) == (int)VehicleFlag.NO_Z)
418 {
419 m_flags |= (VehicleFlag.NO_Z);
420 }
421 if ((pParam & (int)VehicleFlag.LOCK_HOVER_HEIGHT) == (int)VehicleFlag.LOCK_HOVER_HEIGHT)
422 {
423 m_Hoverflags |= (VehicleFlag.LOCK_HOVER_HEIGHT);
424 }
425 if ((pParam & (int)VehicleFlag.NO_DEFLECTION) == (int)VehicleFlag.NO_DEFLECTION)
426 {
427 m_flags |= (VehicleFlag.NO_DEFLECTION);
428 }
429 if ((pParam & (int)VehicleFlag.LOCK_ROTATION) == (int)VehicleFlag.LOCK_ROTATION)
430 {
431 m_flags |= (VehicleFlag.LOCK_ROTATION);
432 }
433 }
434 }//end ProcessVehicleFlags
435
271 internal void ProcessTypeChange(Vehicle pType) 436 internal void ProcessTypeChange(Vehicle pType)
272 { 437 {
273 // Set Defaults For Type 438 // Set Defaults For Type
274 m_type = pType; 439 m_type = pType;
275 switch (pType) 440 switch (pType)
276 { 441 {
442 case Vehicle.TYPE_NONE:
443 m_linearFrictionTimescale = new Vector3(0, 0, 0);
444 m_angularFrictionTimescale = new Vector3(0, 0, 0);
445 m_linearMotorDirection = Vector3.Zero;
446 m_linearMotorTimescale = 0;
447 m_linearMotorDecayTimescale = 0;
448 m_angularMotorDirection = Vector3.Zero;
449 m_angularMotorTimescale = 0;
450 m_angularMotorDecayTimescale = 0;
451 m_VhoverHeight = 0;
452 m_VhoverTimescale = 0;
453 m_VehicleBuoyancy = 0;
454 m_flags = (VehicleFlag)0;
455 break;
456
277 case Vehicle.TYPE_SLED: 457 case Vehicle.TYPE_SLED:
278 m_linearFrictionTimescale = new Vector3(30, 1, 1000); 458 m_linearFrictionTimescale = new Vector3(30, 1, 1000);
279 m_angularFrictionTimescale = new Vector3(1000, 1000, 1000); 459 m_angularFrictionTimescale = new Vector3(1000, 1000, 1000);
@@ -295,9 +475,9 @@ namespace OpenSim.Region.Physics.OdePlugin
295 // m_bankingMix = 1; 475 // m_bankingMix = 1;
296 // m_bankingTimescale = 10; 476 // m_bankingTimescale = 10;
297 // m_referenceFrame = Quaternion.Identity; 477 // m_referenceFrame = Quaternion.Identity;
298 m_flags &= 478 m_Hoverflags &=
299 ~(VehicleFlag.HOVER_WATER_ONLY | VehicleFlag.HOVER_TERRAIN_ONLY | 479 ~(VehicleFlag.HOVER_WATER_ONLY | VehicleFlag.HOVER_TERRAIN_ONLY |
300 VehicleFlag.HOVER_GLOBAL_HEIGHT | VehicleFlag.HOVER_UP_ONLY); 480 VehicleFlag.HOVER_GLOBAL_HEIGHT | VehicleFlag.HOVER_UP_ONLY);
301 m_flags |= (VehicleFlag.NO_DEFLECTION_UP | VehicleFlag.LIMIT_ROLL_ONLY | VehicleFlag.LIMIT_MOTOR_UP); 481 m_flags |= (VehicleFlag.NO_DEFLECTION_UP | VehicleFlag.LIMIT_ROLL_ONLY | VehicleFlag.LIMIT_MOTOR_UP);
302 break; 482 break;
303 case Vehicle.TYPE_CAR: 483 case Vehicle.TYPE_CAR:
@@ -323,9 +503,10 @@ namespace OpenSim.Region.Physics.OdePlugin
323 // m_bankingMix = 1; 503 // m_bankingMix = 1;
324 // m_bankingTimescale = 1; 504 // m_bankingTimescale = 1;
325 // m_referenceFrame = Quaternion.Identity; 505 // m_referenceFrame = Quaternion.Identity;
326 m_flags &= ~(VehicleFlag.HOVER_WATER_ONLY | VehicleFlag.HOVER_TERRAIN_ONLY | VehicleFlag.HOVER_GLOBAL_HEIGHT); 506 m_Hoverflags &= ~(VehicleFlag.HOVER_WATER_ONLY | VehicleFlag.HOVER_TERRAIN_ONLY | VehicleFlag.HOVER_GLOBAL_HEIGHT);
327 m_flags |= (VehicleFlag.NO_DEFLECTION_UP | VehicleFlag.LIMIT_ROLL_ONLY | VehicleFlag.HOVER_UP_ONLY | 507 m_flags |= (VehicleFlag.NO_DEFLECTION_UP | VehicleFlag.LIMIT_ROLL_ONLY |
328 VehicleFlag.LIMIT_MOTOR_UP); 508 VehicleFlag.LIMIT_MOTOR_UP);
509 m_Hoverflags |= (VehicleFlag.HOVER_UP_ONLY);
329 break; 510 break;
330 case Vehicle.TYPE_BOAT: 511 case Vehicle.TYPE_BOAT:
331 m_linearFrictionTimescale = new Vector3(10, 3, 2); 512 m_linearFrictionTimescale = new Vector3(10, 3, 2);
@@ -350,10 +531,12 @@ namespace OpenSim.Region.Physics.OdePlugin
350 // m_bankingMix = 0.8f; 531 // m_bankingMix = 0.8f;
351 // m_bankingTimescale = 1; 532 // m_bankingTimescale = 1;
352 // m_referenceFrame = Quaternion.Identity; 533 // m_referenceFrame = Quaternion.Identity;
353 m_flags &= ~(VehicleFlag.HOVER_TERRAIN_ONLY | VehicleFlag.LIMIT_ROLL_ONLY | 534 m_Hoverflags &= ~(VehicleFlag.HOVER_TERRAIN_ONLY |
354 VehicleFlag.HOVER_GLOBAL_HEIGHT | VehicleFlag.HOVER_UP_ONLY); 535 VehicleFlag.HOVER_GLOBAL_HEIGHT | VehicleFlag.HOVER_UP_ONLY);
355 m_flags |= (VehicleFlag.NO_DEFLECTION_UP | VehicleFlag.HOVER_WATER_ONLY | 536 m_flags &= ~(VehicleFlag.LIMIT_ROLL_ONLY);
537 m_flags |= (VehicleFlag.NO_DEFLECTION_UP |
356 VehicleFlag.LIMIT_MOTOR_UP); 538 VehicleFlag.LIMIT_MOTOR_UP);
539 m_Hoverflags |= (VehicleFlag.HOVER_WATER_ONLY);
357 break; 540 break;
358 case Vehicle.TYPE_AIRPLANE: 541 case Vehicle.TYPE_AIRPLANE:
359 m_linearFrictionTimescale = new Vector3(200, 10, 5); 542 m_linearFrictionTimescale = new Vector3(200, 10, 5);
@@ -378,8 +561,9 @@ namespace OpenSim.Region.Physics.OdePlugin
378 // m_bankingMix = 0.7f; 561 // m_bankingMix = 0.7f;
379 // m_bankingTimescale = 2; 562 // m_bankingTimescale = 2;
380 // m_referenceFrame = Quaternion.Identity; 563 // m_referenceFrame = Quaternion.Identity;
381 m_flags &= ~(VehicleFlag.NO_DEFLECTION_UP | VehicleFlag.HOVER_WATER_ONLY | VehicleFlag.HOVER_TERRAIN_ONLY | 564 m_Hoverflags &= ~(VehicleFlag.HOVER_WATER_ONLY | VehicleFlag.HOVER_TERRAIN_ONLY |
382 VehicleFlag.HOVER_GLOBAL_HEIGHT | VehicleFlag.HOVER_UP_ONLY | VehicleFlag.LIMIT_MOTOR_UP); 565 VehicleFlag.HOVER_GLOBAL_HEIGHT | VehicleFlag.HOVER_UP_ONLY);
566 m_flags &= ~(VehicleFlag.NO_DEFLECTION_UP | VehicleFlag.LIMIT_MOTOR_UP);
383 m_flags |= (VehicleFlag.LIMIT_ROLL_ONLY); 567 m_flags |= (VehicleFlag.LIMIT_ROLL_ONLY);
384 break; 568 break;
385 case Vehicle.TYPE_BALLOON: 569 case Vehicle.TYPE_BALLOON:
@@ -405,9 +589,11 @@ namespace OpenSim.Region.Physics.OdePlugin
405 // m_bankingMix = 0.7f; 589 // m_bankingMix = 0.7f;
406 // m_bankingTimescale = 5; 590 // m_bankingTimescale = 5;
407 // m_referenceFrame = Quaternion.Identity; 591 // m_referenceFrame = Quaternion.Identity;
408 m_flags &= ~(VehicleFlag.NO_DEFLECTION_UP | VehicleFlag.HOVER_WATER_ONLY | VehicleFlag.HOVER_TERRAIN_ONLY | 592 m_Hoverflags &= ~(VehicleFlag.HOVER_WATER_ONLY | VehicleFlag.HOVER_TERRAIN_ONLY |
409 VehicleFlag.HOVER_UP_ONLY | VehicleFlag.LIMIT_MOTOR_UP); 593 VehicleFlag.HOVER_UP_ONLY);
410 m_flags |= (VehicleFlag.LIMIT_ROLL_ONLY | VehicleFlag.HOVER_GLOBAL_HEIGHT); 594 m_flags &= ~(VehicleFlag.NO_DEFLECTION_UP | VehicleFlag.LIMIT_MOTOR_UP);
595 m_flags |= (VehicleFlag.LIMIT_ROLL_ONLY);
596 m_Hoverflags |= (VehicleFlag.HOVER_GLOBAL_HEIGHT);
411 break; 597 break;
412 598
413 } 599 }
@@ -431,6 +617,7 @@ namespace OpenSim.Region.Physics.OdePlugin
431 617
432 MoveLinear(pTimestep, pParentScene); 618 MoveLinear(pTimestep, pParentScene);
433 MoveAngular(pTimestep); 619 MoveAngular(pTimestep);
620 LimitRotation(pTimestep);
434 }// end Step 621 }// end Step
435 622
436 private void MoveLinear(float pTimestep, OdeScene _pParentScene) 623 private void MoveLinear(float pTimestep, OdeScene _pParentScene)
@@ -477,61 +664,152 @@ namespace OpenSim.Region.Physics.OdePlugin
477 // .Z velocity and gravity. Therefore only 0g will used script-requested 664 // .Z velocity and gravity. Therefore only 0g will used script-requested
478 // .Z velocity. >0g (m_VehicleBuoyancy < 1) will used modified gravity only. 665 // .Z velocity. >0g (m_VehicleBuoyancy < 1) will used modified gravity only.
479 Vector3 grav = Vector3.Zero; 666 Vector3 grav = Vector3.Zero;
480 if (m_VehicleBuoyancy < 1.0f) 667 // There is some gravity, make a gravity force vector
668 // that is applied after object velocity.
669 d.Mass objMass;
670 d.BodyGetMass(Body, out objMass);
671 // m_VehicleBuoyancy: -1=2g; 0=1g; 1=0g;
672 grav.Z = _pParentScene.gravityz * objMass.mass * (1f - m_VehicleBuoyancy);
673 // Preserve the current Z velocity
674 d.Vector3 vel_now = d.BodyGetLinearVel(Body);
675 m_dir.Z = vel_now.Z; // Preserve the accumulated falling velocity
676
677 d.Vector3 pos = d.BodyGetPosition(Body);
678 Vector3 accel = new Vector3(-(m_dir.X - m_lastLinearVelocityVector.X / 0.1f), -(m_dir.Y - m_lastLinearVelocityVector.Y / 0.1f), m_dir.Z - m_lastLinearVelocityVector.Z / 0.1f);
679 Vector3 posChange = new Vector3();
680 posChange.X = pos.X - m_lastPositionVector.X;
681 posChange.Y = pos.Y - m_lastPositionVector.Y;
682 posChange.Z = pos.Z - m_lastPositionVector.Z;
683 double Zchange = Math.Abs(posChange.Z);
684 if (m_BlockingEndPoint != Vector3.Zero)
685 {
686 if (pos.X >= (m_BlockingEndPoint.X - (float)1))
687 {
688 pos.X -= posChange.X + 1;
689 d.BodySetPosition(Body, pos.X, pos.Y, pos.Z);
690 }
691 if (pos.Y >= (m_BlockingEndPoint.Y - (float)1))
692 {
693 pos.Y -= posChange.Y + 1;
694 d.BodySetPosition(Body, pos.X, pos.Y, pos.Z);
695 }
696 if (pos.Z >= (m_BlockingEndPoint.Z - (float)1))
697 {
698 pos.Z -= posChange.Z + 1;
699 d.BodySetPosition(Body, pos.X, pos.Y, pos.Z);
700 }
701 if (pos.X <= 0)
702 {
703 pos.X += posChange.X + 1;
704 d.BodySetPosition(Body, pos.X, pos.Y, pos.Z);
705 }
706 if (pos.Y <= 0)
707 {
708 pos.Y += posChange.Y + 1;
709 d.BodySetPosition(Body, pos.X, pos.Y, pos.Z);
710 }
711 }
712 if (pos.Z < _pParentScene.GetTerrainHeightAtXY(pos.X, pos.Y))
481 { 713 {
482 // There is some gravity, make a gravity force vector 714 pos.Z = _pParentScene.GetTerrainHeightAtXY(pos.X, pos.Y) + 2;
483 // that is applied after object velocity. 715 d.BodySetPosition(Body, pos.X, pos.Y, pos.Z);
484 d.Mass objMass; 716 }
485 d.BodyGetMass(Body, out objMass);
486 // m_VehicleBuoyancy: -1=2g; 0=1g; 1=0g;
487 grav.Z = _pParentScene.gravityz * objMass.mass * (1f - m_VehicleBuoyancy);
488 // Preserve the current Z velocity
489 d.Vector3 vel_now = d.BodyGetLinearVel(Body);
490 m_dir.Z = vel_now.Z; // Preserve the accumulated falling velocity
491 } // else its 1.0, no gravity.
492 717
493 // Check if hovering 718 // Check if hovering
494 if ((m_flags & (VehicleFlag.HOVER_WATER_ONLY | VehicleFlag.HOVER_TERRAIN_ONLY | VehicleFlag.HOVER_GLOBAL_HEIGHT)) != 0) 719 if ((m_Hoverflags & (VehicleFlag.HOVER_WATER_ONLY | VehicleFlag.HOVER_TERRAIN_ONLY | VehicleFlag.HOVER_GLOBAL_HEIGHT)) != 0)
495 { 720 {
496 // We should hover, get the target height 721 // We should hover, get the target height
497 d.Vector3 pos = d.BodyGetPosition(Body); 722 if ((m_Hoverflags & VehicleFlag.HOVER_WATER_ONLY) != 0)
498 if ((m_flags & VehicleFlag.HOVER_WATER_ONLY) == VehicleFlag.HOVER_WATER_ONLY)
499 { 723 {
500 m_VhoverTargetHeight = _pParentScene.GetWaterLevel() + m_VhoverHeight; 724 m_VhoverTargetHeight = _pParentScene.GetWaterLevel() + m_VhoverHeight;
501 } 725 }
502 else if ((m_flags & VehicleFlag.HOVER_TERRAIN_ONLY) == VehicleFlag.HOVER_TERRAIN_ONLY) 726 if ((m_Hoverflags & VehicleFlag.HOVER_TERRAIN_ONLY) != 0)
503 { 727 {
504 m_VhoverTargetHeight = _pParentScene.GetTerrainHeightAtXY(pos.X, pos.Y) + m_VhoverHeight; 728 m_VhoverTargetHeight = _pParentScene.GetTerrainHeightAtXY(pos.X, pos.Y) + m_VhoverHeight;
505 } 729 }
506 else if ((m_flags & VehicleFlag.HOVER_GLOBAL_HEIGHT) == VehicleFlag.HOVER_GLOBAL_HEIGHT) 730 if ((m_Hoverflags & VehicleFlag.HOVER_GLOBAL_HEIGHT) != 0)
507 { 731 {
508 m_VhoverTargetHeight = m_VhoverHeight; 732 m_VhoverTargetHeight = m_VhoverHeight;
509 } 733 }
510 734
511 if ((m_flags & VehicleFlag.HOVER_UP_ONLY) == VehicleFlag.HOVER_UP_ONLY) 735 if ((m_Hoverflags & VehicleFlag.HOVER_UP_ONLY) != 0)
512 { 736 {
513 // If body is aready heigher, use its height as target height 737 // If body is aready heigher, use its height as target height
514 if (pos.Z > m_VhoverTargetHeight) m_VhoverTargetHeight = pos.Z; 738 if (pos.Z > m_VhoverTargetHeight) m_VhoverTargetHeight = pos.Z;
515 } 739 }
740 if ((m_Hoverflags & VehicleFlag.LOCK_HOVER_HEIGHT) != 0)
741 {
742 if ((pos.Z - m_VhoverTargetHeight) > .2 || (pos.Z - m_VhoverTargetHeight) < -.2)
743 {
744 d.BodySetPosition(Body, pos.X, pos.Y, m_VhoverTargetHeight);
745 }
746 }
747 else
748 {
749 float herr0 = pos.Z - m_VhoverTargetHeight;
750 // Replace Vertical speed with correction figure if significant
751 if (Math.Abs(herr0) > 0.01f)
752 {
753 m_dir.Z = -((herr0 * pTimestep * 50.0f) / m_VhoverTimescale);
754 //KF: m_VhoverEfficiency is not yet implemented
755 }
756 else
757 {
758 m_dir.Z = 0f;
759 }
760 }
516 761
517// m_VhoverEfficiency = 0f; // 0=boucy, 1=Crit.damped 762// m_VhoverEfficiency = 0f; // 0=boucy, 1=Crit.damped
518// m_VhoverTimescale = 0f; // time to acheive height 763// m_VhoverTimescale = 0f; // time to acheive height
519// pTimestep is time since last frame,in secs 764// pTimestep is time since last frame,in secs
520 float herr0 = pos.Z - m_VhoverTargetHeight; 765 }
521 // Replace Vertical speed with correction figure if significant 766
522 if (Math.Abs(herr0) > 0.01f) 767 if ((m_flags & (VehicleFlag.LIMIT_MOTOR_UP)) != 0)
768 {
769 //Start Experimental Values
770 if (Zchange > .3)
523 { 771 {
524 d.Mass objMass; 772 grav.Z = (float)(grav.Z * 3);
525 d.BodyGetMass(Body, out objMass);
526 m_dir.Z = - ((herr0 * pTimestep * 50.0f) / m_VhoverTimescale);
527 //KF: m_VhoverEfficiency is not yet implemented
528 } 773 }
529 else 774 if (Zchange > .15)
775 {
776 grav.Z = (float)(grav.Z * 2);
777 }
778 if (Zchange > .75)
779 {
780 grav.Z = (float)(grav.Z * 1.5);
781 }
782 if (Zchange > .05)
783 {
784 grav.Z = (float)(grav.Z * 1.25);
785 }
786 if (Zchange > .025)
787 {
788 grav.Z = (float)(grav.Z * 1.125);
789 }
790 float terraintemp = _pParentScene.GetTerrainHeightAtXY(pos.X, pos.Y);
791 float postemp = (pos.Z - terraintemp);
792 if (postemp > 2.5f)
530 { 793 {
531 m_dir.Z = 0f; 794 grav.Z = (float)(grav.Z * 1.037125);
532 } 795 }
796 //End Experimental Values
797 }
798 if ((m_flags & (VehicleFlag.NO_X)) != 0)
799 {
800 m_dir.X = 0;
801 }
802 if ((m_flags & (VehicleFlag.NO_Y)) != 0)
803 {
804 m_dir.Y = 0;
805 }
806 if ((m_flags & (VehicleFlag.NO_Z)) != 0)
807 {
808 m_dir.Z = 0;
533 } 809 }
534 810
811 m_lastPositionVector = d.BodyGetPosition(Body);
812
535 // Apply velocity 813 // Apply velocity
536 d.BodySetLinearVel(Body, m_dir.X, m_dir.Y, m_dir.Z); 814 d.BodySetLinearVel(Body, m_dir.X, m_dir.Y, m_dir.Z);
537 // apply gravity force 815 // apply gravity force
@@ -629,6 +907,12 @@ namespace OpenSim.Region.Physics.OdePlugin
629 907
630 // Sum velocities 908 // Sum velocities
631 m_lastAngularVelocity = m_angularMotorVelocity + vertattr; // + bank + deflection 909 m_lastAngularVelocity = m_angularMotorVelocity + vertattr; // + bank + deflection
910
911 if ((m_flags & (VehicleFlag.NO_DEFLECTION_UP)) != 0)
912 {
913 m_lastAngularVelocity.X = 0;
914 m_lastAngularVelocity.Y = 0;
915 }
632 916
633 if (!m_lastAngularVelocity.ApproxEquals(Vector3.Zero, 0.01f)) 917 if (!m_lastAngularVelocity.ApproxEquals(Vector3.Zero, 0.01f))
634 { 918 {
@@ -647,5 +931,44 @@ namespace OpenSim.Region.Physics.OdePlugin
647 d.BodySetAngularVel (Body, m_lastAngularVelocity.X, m_lastAngularVelocity.Y, m_lastAngularVelocity.Z); 931 d.BodySetAngularVel (Body, m_lastAngularVelocity.X, m_lastAngularVelocity.Y, m_lastAngularVelocity.Z);
648 932
649 } //end MoveAngular 933 } //end MoveAngular
934 internal void LimitRotation(float timestep)
935 {
936 d.Quaternion rot = d.BodyGetQuaternion(Body);
937 Quaternion rotq = new Quaternion(rot.X, rot.Y, rot.Z, rot.W); // rotq = rotation of object
938 d.Quaternion m_rot = new d.Quaternion();
939 bool changed = false;
940 m_rot.X = rotq.X;
941 m_rot.Y = rotq.Y;
942 m_rot.Z = rotq.Z;
943 m_rot.W = rotq.W;
944 if (m_RollreferenceFrame != Quaternion.Identity)
945 {
946 if (rotq.X >= m_RollreferenceFrame.X)
947 {
948 m_rot.X = rotq.X - (m_RollreferenceFrame.X / 2);
949 }
950 if (rotq.Y >= m_RollreferenceFrame.Y)
951 {
952 m_rot.Y = rotq.Y - (m_RollreferenceFrame.Y / 2);
953 }
954 if (rotq.X <= -m_RollreferenceFrame.X)
955 {
956 m_rot.X = rotq.X + (m_RollreferenceFrame.X / 2);
957 }
958 if (rotq.Y <= -m_RollreferenceFrame.Y)
959 {
960 m_rot.Y = rotq.Y + (m_RollreferenceFrame.Y / 2);
961 }
962 changed = true;
963 }
964 if ((m_flags & VehicleFlag.LOCK_ROTATION) != 0)
965 {
966 m_rot.X = 0;
967 m_rot.Y = 0;
968 changed = true;
969 }
970 if (changed)
971 d.BodySetQuaternion(Body, ref m_rot);
972 }
650 } 973 }
651} 974}
diff --git a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
index 44b2727..03736d1 100644
--- a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
+++ b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
@@ -2355,6 +2355,11 @@ Console.WriteLine(" JointCreateFixed");
2355 m_vehicle.ProcessRotationVehicleParam((Vehicle) param, rotation); 2355 m_vehicle.ProcessRotationVehicleParam((Vehicle) param, rotation);
2356 } 2356 }
2357 2357
2358 public override void VehicleFlags(int param, bool remove)
2359 {
2360 m_vehicle.ProcessVehicleFlags(param, remove);
2361 }
2362
2358 public override void SetVolumeDetect(int param) 2363 public override void SetVolumeDetect(int param)
2359 { 2364 {
2360 lock (_parent_scene.OdeLock) 2365 lock (_parent_scene.OdeLock)
diff --git a/OpenSim/Region/Physics/POSPlugin/POSCharacter.cs b/OpenSim/Region/Physics/POSPlugin/POSCharacter.cs
index 566b4e7..a70179b 100644
--- a/OpenSim/Region/Physics/POSPlugin/POSCharacter.cs
+++ b/OpenSim/Region/Physics/POSPlugin/POSCharacter.cs
@@ -182,6 +182,8 @@ namespace OpenSim.Region.Physics.POSPlugin
182 182
183 } 183 }
184 184
185 public override void VehicleFlags(int param, bool remove) { }
186
185 public override void SetVolumeDetect(int param) 187 public override void SetVolumeDetect(int param)
186 { 188 {
187 189
diff --git a/OpenSim/Region/Physics/POSPlugin/POSPrim.cs b/OpenSim/Region/Physics/POSPlugin/POSPrim.cs
index 7447f76..91ec3df 100644
--- a/OpenSim/Region/Physics/POSPlugin/POSPrim.cs
+++ b/OpenSim/Region/Physics/POSPlugin/POSPrim.cs
@@ -139,6 +139,8 @@ namespace OpenSim.Region.Physics.POSPlugin
139 139
140 } 140 }
141 141
142 public override void VehicleFlags(int param, bool remove) { }
143
142 public override void SetVolumeDetect(int param) 144 public override void SetVolumeDetect(int param)
143 { 145 {
144 146
diff --git a/OpenSim/Region/Physics/PhysXPlugin/PhysXPlugin.cs b/OpenSim/Region/Physics/PhysXPlugin/PhysXPlugin.cs
index 24eb6b1..dd2c686 100644
--- a/OpenSim/Region/Physics/PhysXPlugin/PhysXPlugin.cs
+++ b/OpenSim/Region/Physics/PhysXPlugin/PhysXPlugin.cs
@@ -371,6 +371,8 @@ namespace OpenSim.Region.Physics.PhysXPlugin
371 371
372 } 372 }
373 373
374 public override void VehicleFlags(int param, bool remove) { }
375
374 public override void SetVolumeDetect(int param) 376 public override void SetVolumeDetect(int param)
375 { 377 {
376 378
@@ -775,6 +777,8 @@ namespace OpenSim.Region.Physics.PhysXPlugin
775 777
776 } 778 }
777 779
780 public override void VehicleFlags(int param, bool remove) { }
781
778 public override void SetVolumeDetect(int param) 782 public override void SetVolumeDetect(int param)
779 { 783 {
780 784
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index a1db77e..eab4754 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -1181,7 +1181,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1181 1181
1182 if ((status & ScriptBaseClass.STATUS_BLOCK_GRAB) == ScriptBaseClass.STATUS_BLOCK_GRAB) 1182 if ((status & ScriptBaseClass.STATUS_BLOCK_GRAB) == ScriptBaseClass.STATUS_BLOCK_GRAB)
1183 { 1183 {
1184 NotImplemented("llSetStatus - STATUS_BLOCK_GRAB"); 1184 if (value != 0)
1185 m_host.SetBlockGrab(true);
1186 else
1187 m_host.SetBlockGrab(false);
1185 } 1188 }
1186 1189
1187 if ((status & ScriptBaseClass.STATUS_DIE_AT_EDGE) == ScriptBaseClass.STATUS_DIE_AT_EDGE) 1190 if ((status & ScriptBaseClass.STATUS_DIE_AT_EDGE) == ScriptBaseClass.STATUS_DIE_AT_EDGE)
@@ -1194,12 +1197,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1194 1197
1195 if ((status & ScriptBaseClass.STATUS_RETURN_AT_EDGE) == ScriptBaseClass.STATUS_RETURN_AT_EDGE) 1198 if ((status & ScriptBaseClass.STATUS_RETURN_AT_EDGE) == ScriptBaseClass.STATUS_RETURN_AT_EDGE)
1196 { 1199 {
1197 NotImplemented("llSetStatus - STATUS_RETURN_AT_EDGE"); 1200 if (value != 0)
1201 m_host.SetReturnAtEdge(true);
1202 else
1203 m_host.SetReturnAtEdge(false);
1198 } 1204 }
1199 1205
1200 if ((status & ScriptBaseClass.STATUS_SANDBOX) == ScriptBaseClass.STATUS_SANDBOX) 1206 if ((status & ScriptBaseClass.STATUS_SANDBOX) == ScriptBaseClass.STATUS_SANDBOX)
1201 { 1207 {
1202 NotImplemented("llSetStatus - STATUS_SANDBOX"); 1208 if (value != 0)
1209 m_host.SetStatusSandbox(true);
1210 else
1211 m_host.SetStatusSandbox(false);
1203 } 1212 }
1204 1213
1205 if (statusrotationaxis != 0) 1214 if (statusrotationaxis != 0)
@@ -1236,8 +1245,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1236 return 0; 1245 return 0;
1237 1246
1238 case ScriptBaseClass.STATUS_BLOCK_GRAB: 1247 case ScriptBaseClass.STATUS_BLOCK_GRAB:
1239 NotImplemented("llGetStatus - STATUS_BLOCK_GRAB"); 1248 if (m_host.GetBlockGrab())
1240 return 0; 1249 return 1;
1250 else
1251 return 0;
1241 1252
1242 case ScriptBaseClass.STATUS_DIE_AT_EDGE: 1253 case ScriptBaseClass.STATUS_DIE_AT_EDGE:
1243 if (m_host.GetDieAtEdge()) 1254 if (m_host.GetDieAtEdge())
@@ -1246,24 +1257,34 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1246 return 0; 1257 return 0;
1247 1258
1248 case ScriptBaseClass.STATUS_RETURN_AT_EDGE: 1259 case ScriptBaseClass.STATUS_RETURN_AT_EDGE:
1249 NotImplemented("llGetStatus - STATUS_RETURN_AT_EDGE"); 1260 if (m_host.GetReturnAtEdge())
1250 return 0; 1261 return 1;
1262 else
1263 return 0;
1251 1264
1252 case ScriptBaseClass.STATUS_ROTATE_X: 1265 case ScriptBaseClass.STATUS_ROTATE_X:
1253 NotImplemented("llGetStatus - STATUS_ROTATE_X"); 1266 if (m_host.GetAxisRotation(2) == 2)
1254 return 0; 1267 return 1;
1268 else
1269 return 0;
1255 1270
1256 case ScriptBaseClass.STATUS_ROTATE_Y: 1271 case ScriptBaseClass.STATUS_ROTATE_Y:
1257 NotImplemented("llGetStatus - STATUS_ROTATE_Y"); 1272 if (m_host.GetAxisRotation(4) == 4)
1258 return 0; 1273 return 1;
1274 else
1275 return 0;
1259 1276
1260 case ScriptBaseClass.STATUS_ROTATE_Z: 1277 case ScriptBaseClass.STATUS_ROTATE_Z:
1261 NotImplemented("llGetStatus - STATUS_ROTATE_Z"); 1278 if (m_host.GetAxisRotation(8) == 8)
1262 return 0; 1279 return 1;
1280 else
1281 return 0;
1263 1282
1264 case ScriptBaseClass.STATUS_SANDBOX: 1283 case ScriptBaseClass.STATUS_SANDBOX:
1265 NotImplemented("llGetStatus - STATUS_SANDBOX"); 1284 if (m_host.GetStatusSandbox())
1266 return 0; 1285 return 1;
1286 else
1287 return 0;
1267 } 1288 }
1268 return 0; 1289 return 0;
1269 } 1290 }
@@ -2201,7 +2222,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2201 m_host.AddScriptLPS(1); 2222 m_host.AddScriptLPS(1);
2202 2223
2203 // send the sound, once, to all clients in range 2224 // send the sound, once, to all clients in range
2204 m_host.SendSound(KeyOrName(sound).ToString(), volume, false, 0); 2225 m_host.SendSound(KeyOrName(sound).ToString(), volume, false, 0, 0, false, false);
2205 } 2226 }
2206 2227
2207 // Xantor 20080528 we should do this differently. 2228 // Xantor 20080528 we should do this differently.
@@ -2231,42 +2252,98 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2231 public void llLoopSoundMaster(string sound, double volume) 2252 public void llLoopSoundMaster(string sound, double volume)
2232 { 2253 {
2233 m_host.AddScriptLPS(1); 2254 m_host.AddScriptLPS(1);
2234 NotImplemented("llLoopSoundMaster"); 2255 m_host.ParentGroup.LoopSoundMasterPrim = m_host;
2256 lock (m_host.ParentGroup.LoopSoundSlavePrims)
2257 {
2258 foreach (SceneObjectPart prim in m_host.ParentGroup.LoopSoundSlavePrims)
2259 {
2260 if (prim.Sound != UUID.Zero)
2261 llStopSound();
2262
2263 prim.Sound = KeyOrName(sound);
2264 prim.SoundGain = volume;
2265 prim.SoundFlags = 1; // looping
2266 prim.SoundRadius = 20; // Magic number, 20 seems reasonable. Make configurable?
2267
2268 prim.ScheduleFullUpdate();
2269 prim.SendFullUpdateToAllClients();
2270 }
2271 }
2272 if (m_host.Sound != UUID.Zero)
2273 llStopSound();
2274
2275 m_host.Sound = KeyOrName(sound);
2276 m_host.SoundGain = volume;
2277 m_host.SoundFlags = 1; // looping
2278 m_host.SoundRadius = 20; // Magic number, 20 seems reasonable. Make configurable?
2279
2280 m_host.ScheduleFullUpdate();
2281 m_host.SendFullUpdateToAllClients();
2235 } 2282 }
2236 2283
2237 public void llLoopSoundSlave(string sound, double volume) 2284 public void llLoopSoundSlave(string sound, double volume)
2238 { 2285 {
2239 m_host.AddScriptLPS(1); 2286 m_host.AddScriptLPS(1);
2240 NotImplemented("llLoopSoundSlave"); 2287 lock (m_host.ParentGroup.LoopSoundSlavePrims)
2288 {
2289 m_host.ParentGroup.LoopSoundSlavePrims.Add(m_host);
2290 }
2241 } 2291 }
2242 2292
2243 public void llPlaySoundSlave(string sound, double volume) 2293 public void llPlaySoundSlave(string sound, double volume)
2244 { 2294 {
2245 m_host.AddScriptLPS(1); 2295 m_host.AddScriptLPS(1);
2246 NotImplemented("llPlaySoundSlave"); 2296
2297 // send the sound, once, to all clients in range
2298 m_host.SendSound(KeyOrName(sound).ToString(), volume, false, 0, 0, true, false);
2247 } 2299 }
2248 2300
2249 public void llTriggerSound(string sound, double volume) 2301 public void llTriggerSound(string sound, double volume)
2250 { 2302 {
2251 m_host.AddScriptLPS(1); 2303 m_host.AddScriptLPS(1);
2252 // send the sound, once, to all clients in range 2304 // send the sound, once, to all clients in range
2253 m_host.SendSound(KeyOrName(sound).ToString(), volume, true, 0); 2305 m_host.SendSound(KeyOrName(sound).ToString(), volume, true, 0, 0, false, false);
2254 } 2306 }
2255 2307
2256 // Xantor 20080528: Clear prim data of sound instead 2308 // Xantor 20080528: Clear prim data of sound instead
2257 public void llStopSound() 2309 public void llStopSound()
2258 { 2310 {
2259 m_host.AddScriptLPS(1); 2311 m_host.AddScriptLPS(1);
2260 2312 if (m_host.ParentGroup.LoopSoundSlavePrims.Contains(m_host))
2261 m_host.Sound = UUID.Zero; 2313 {
2262 m_host.SoundGain = 0; 2314 if (m_host.ParentGroup.LoopSoundMasterPrim == m_host)
2263 m_host.SoundFlags = 0; 2315 {
2264 m_host.SoundRadius = 0; 2316 foreach (SceneObjectPart part in m_host.ParentGroup.LoopSoundSlavePrims)
2265 2317 {
2266 m_host.ScheduleFullUpdate(); 2318 part.Sound = UUID.Zero;
2267 m_host.SendFullUpdateToAllClients(); 2319 part.SoundGain = 0;
2268 2320 part.SoundFlags = 0;
2269 // m_host.SendSound(UUID.Zero.ToString(), 1.0, false, 2); 2321 part.SoundRadius = 0;
2322 part.ScheduleFullUpdate();
2323 part.SendFullUpdateToAllClients();
2324 }
2325 m_host.ParentGroup.LoopSoundMasterPrim = null;
2326 m_host.ParentGroup.LoopSoundSlavePrims.Clear();
2327 }
2328 else
2329 {
2330 m_host.Sound = UUID.Zero;
2331 m_host.SoundGain = 0;
2332 m_host.SoundFlags = 0;
2333 m_host.SoundRadius = 0;
2334 m_host.ScheduleFullUpdate();
2335 m_host.SendFullUpdateToAllClients();
2336 }
2337 }
2338 else
2339 {
2340 m_host.Sound = UUID.Zero;
2341 m_host.SoundGain = 0;
2342 m_host.SoundFlags = 0;
2343 m_host.SoundRadius = 0;
2344 m_host.ScheduleFullUpdate();
2345 m_host.SendFullUpdateToAllClients();
2346 }
2270 } 2347 }
2271 2348
2272 public void llPreloadSound(string sound) 2349 public void llPreloadSound(string sound)
@@ -2660,8 +2737,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2660 2737
2661 public void llLookAt(LSL_Vector target, double strength, double damping) 2738 public void llLookAt(LSL_Vector target, double strength, double damping)
2662 { 2739 {
2663 // partial implementation, rotates objects correctly but does not apply strength or damping attributes
2664
2665 m_host.AddScriptLPS(1); 2740 m_host.AddScriptLPS(1);
2666 // Determine where we are looking from 2741 // Determine where we are looking from
2667 LSL_Vector from = llGetPos(); 2742 LSL_Vector from = llGetPos();
@@ -2681,9 +2756,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2681 // the angles of rotation in radians into rotation value 2756 // the angles of rotation in radians into rotation value
2682 2757
2683 LSL_Types.Quaternion rot = llEuler2Rot(angle); 2758 LSL_Types.Quaternion rot = llEuler2Rot(angle);
2684 2759 Quaternion rotation = new Quaternion((float)rot.x, (float)rot.y, (float)rot.z, (float)rot.s);
2760 m_host.startLookAt(rotation, (float)damping, (float)strength);
2685 // Orient the object to the angle calculated 2761 // Orient the object to the angle calculated
2686 llSetRot(rot); 2762 //llSetRot(rot);
2687 } 2763 }
2688 2764
2689 public void llStopLookAt() 2765 public void llStopLookAt()
@@ -3045,8 +3121,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3045 public void llRotLookAt(LSL_Rotation target, double strength, double damping) 3121 public void llRotLookAt(LSL_Rotation target, double strength, double damping)
3046 { 3122 {
3047 m_host.AddScriptLPS(1); 3123 m_host.AddScriptLPS(1);
3048// NotImplemented("llRotLookAt"); 3124 Quaternion rot = new Quaternion((float)target.x, (float)target.y, (float)target.z, (float)target.s);
3049 m_host.RotLookAt(Rot2Quaternion(target), (float)strength, (float)damping); 3125 m_host.RotLookAt(rot, (float)strength, (float)damping);
3050 } 3126 }
3051 3127
3052 public LSL_Integer llStringLength(string str) 3128 public LSL_Integer llStringLength(string str)
@@ -3144,13 +3220,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3144 public void llPointAt(LSL_Vector pos) 3220 public void llPointAt(LSL_Vector pos)
3145 { 3221 {
3146 m_host.AddScriptLPS(1); 3222 m_host.AddScriptLPS(1);
3147 NotImplemented("llPointAt"); 3223 ScenePresence Owner = World.GetScenePresence(m_host.UUID);
3224 LSL_Rotation rot = llEuler2Rot(pos);
3225 Owner.PreviousRotation = Owner.Rotation;
3226 Owner.Rotation = (new Quaternion((float)rot.x,(float)rot.y,(float)rot.z,(float)rot.s));
3148 } 3227 }
3149 3228
3150 public void llStopPointAt() 3229 public void llStopPointAt()
3151 { 3230 {
3152 m_host.AddScriptLPS(1); 3231 m_host.AddScriptLPS(1);
3153 NotImplemented("llStopPointAt"); 3232 ScenePresence Owner = m_host.ParentGroup.Scene.GetScenePresence(m_host.OwnerID);
3233 Owner.Rotation = Owner.PreviousRotation;
3154 } 3234 }
3155 3235
3156 public void llTargetOmega(LSL_Vector axis, double spinrate, double gain) 3236 public void llTargetOmega(LSL_Vector axis, double spinrate, double gain)
@@ -3946,8 +4026,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3946 public void llCollisionSound(string impact_sound, double impact_volume) 4026 public void llCollisionSound(string impact_sound, double impact_volume)
3947 { 4027 {
3948 m_host.AddScriptLPS(1); 4028 m_host.AddScriptLPS(1);
3949 //NotImplemented("llCollisionSound");
3950
3951 // TODO: Parameter check logic required. 4029 // TODO: Parameter check logic required.
3952 UUID soundId = UUID.Zero; 4030 UUID soundId = UUID.Zero;
3953 if (!UUID.TryParse(impact_sound, out soundId)) 4031 if (!UUID.TryParse(impact_sound, out soundId))
@@ -4535,8 +4613,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4535 public LSL_Vector llGetCenterOfMass() 4613 public LSL_Vector llGetCenterOfMass()
4536 { 4614 {
4537 m_host.AddScriptLPS(1); 4615 m_host.AddScriptLPS(1);
4538 NotImplemented("llGetCenterOfMass"); 4616 Vector3 center = m_host.GetGeometricCenter();
4539 return new LSL_Vector(); 4617 return new LSL_Vector(center.X,center.Y,center.Z);
4540 } 4618 }
4541 4619
4542 public LSL_List llListSort(LSL_List src, int stride, int ascending) 4620 public LSL_List llListSort(LSL_List src, int stride, int ascending)
@@ -5269,8 +5347,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
5269 flags |= ScriptBaseClass.AGENT_SITTING; 5347 flags |= ScriptBaseClass.AGENT_SITTING;
5270 } 5348 }
5271 5349
5272 //NotImplemented("llGetAgentInfo");
5273
5274 return flags; 5350 return flags;
5275 } 5351 }
5276 5352
@@ -5353,7 +5429,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
5353 LSL_Vector bottom_south_west) 5429 LSL_Vector bottom_south_west)
5354 { 5430 {
5355 m_host.AddScriptLPS(1); 5431 m_host.AddScriptLPS(1);
5356 NotImplemented("llTriggerSoundLimited"); 5432 float radius1 = (float)llVecDist(llGetPos(), top_north_east);
5433 float radius2 = (float)llVecDist(llGetPos(), bottom_south_west);
5434 float radius = Math.Abs(radius1 - radius2);
5435 m_host.SendSound(KeyOrName(sound).ToString(), volume, true, 0, radius, false, false);
5357 } 5436 }
5358 5437
5359 public void llEjectFromLand(string pest) 5438 public void llEjectFromLand(string pest)
@@ -5892,7 +5971,26 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
5892 public void llGroundRepel(double height, int water, double tau) 5971 public void llGroundRepel(double height, int water, double tau)
5893 { 5972 {
5894 m_host.AddScriptLPS(1); 5973 m_host.AddScriptLPS(1);
5895 NotImplemented("llGroundRepel"); 5974 if (m_host.PhysActor != null)
5975 {
5976 float ground = (float)llGround(new LSL_Types.Vector3(0, 0, 0));
5977 float waterLevel = (float)llWater(new LSL_Types.Vector3(0, 0, 0));
5978 PIDHoverType hoverType = PIDHoverType.Ground;
5979 if (water != 0)
5980 {
5981 hoverType = PIDHoverType.GroundAndWater;
5982 if (ground < waterLevel)
5983 height += waterLevel;
5984 else
5985 height += ground;
5986 }
5987 else
5988 {
5989 height += ground;
5990 }
5991
5992 m_host.SetHoverHeight((float)height, hoverType, (float)tau);
5993 }
5896 } 5994 }
5897 5995
5898 protected UUID GetTaskInventoryItem(string name) 5996 protected UUID GetTaskInventoryItem(string name)
@@ -6021,13 +6119,25 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
6021 public void llSetVehicleFlags(int flags) 6119 public void llSetVehicleFlags(int flags)
6022 { 6120 {
6023 m_host.AddScriptLPS(1); 6121 m_host.AddScriptLPS(1);
6024 NotImplemented("llSetVehicleFlags"); 6122 if (m_host.ParentGroup != null)
6123 {
6124 if (!m_host.ParentGroup.IsDeleted)
6125 {
6126 m_host.ParentGroup.RootPart.SetVehicleFlags(flags, false);
6127 }
6128 }
6025 } 6129 }
6026 6130
6027 public void llRemoveVehicleFlags(int flags) 6131 public void llRemoveVehicleFlags(int flags)
6028 { 6132 {
6029 m_host.AddScriptLPS(1); 6133 m_host.AddScriptLPS(1);
6030 NotImplemented("llRemoveVehicleFlags"); 6134 if (m_host.ParentGroup != null)
6135 {
6136 if (!m_host.ParentGroup.IsDeleted)
6137 {
6138 m_host.ParentGroup.RootPart.SetVehicleFlags(flags, true);
6139 }
6140 }
6031 } 6141 }
6032 6142
6033 public void llSitTarget(LSL_Vector offset, LSL_Rotation rot) 6143 public void llSitTarget(LSL_Vector offset, LSL_Rotation rot)
@@ -7049,7 +7159,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7049 public void llRemoteDataSetRegion() 7159 public void llRemoteDataSetRegion()
7050 { 7160 {
7051 m_host.AddScriptLPS(1); 7161 m_host.AddScriptLPS(1);
7052 NotImplemented("llRemoteDataSetRegion"); 7162 Deprecated("llRemoteDataSetRegion");
7053 } 7163 }
7054 7164
7055 public LSL_Float llLog10(double val) 7165 public LSL_Float llLog10(double val)
@@ -8081,7 +8191,39 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8081 public void llSetInventoryPermMask(string item, int mask, int value) 8191 public void llSetInventoryPermMask(string item, int mask, int value)
8082 { 8192 {
8083 m_host.AddScriptLPS(1); 8193 m_host.AddScriptLPS(1);
8084 NotImplemented("llSetInventoryPermMask"); 8194 if (m_ScriptEngine.Config.GetBoolean("AllowGodFunctions", false))
8195 {
8196 if (World.Permissions.CanRunConsoleCommand(m_host.OwnerID))
8197 {
8198 lock (m_host.TaskInventory)
8199 {
8200 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
8201 {
8202 if (inv.Value.Name == item)
8203 {
8204 switch (mask)
8205 {
8206 case 0:
8207 inv.Value.BasePermissions = (uint)value;
8208 break;
8209 case 1:
8210 inv.Value.CurrentPermissions = (uint)value;
8211 break;
8212 case 2:
8213 inv.Value.GroupPermissions = (uint)value;
8214 break;
8215 case 3:
8216 inv.Value.EveryonePermissions = (uint)value;
8217 break;
8218 case 4:
8219 inv.Value.NextPermissions = (uint)value;
8220 break;
8221 }
8222 }
8223 }
8224 }
8225 }
8226 }
8085 } 8227 }
8086 8228
8087 public LSL_String llGetInventoryCreator(string item) 8229 public LSL_String llGetInventoryCreator(string item)
@@ -8515,6 +8657,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8515 // we send to all 8657 // we send to all
8516 landData.MediaID = new UUID(texture); 8658 landData.MediaID = new UUID(texture);
8517 landData.MediaAutoScale = autoAlign ? (byte)1 : (byte)0; 8659 landData.MediaAutoScale = autoAlign ? (byte)1 : (byte)0;
8660 landData.MediaSize[0] = width;
8661 landData.MediaSize[1] = height;
8662 landData.MediaType = mediaType;
8518 8663
8519 // do that one last, it will cause a ParcelPropertiesUpdate 8664 // do that one last, it will cause a ParcelPropertiesUpdate
8520 landObject.SetMediaUrl(url); 8665 landObject.SetMediaUrl(url);
@@ -8574,11 +8719,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8574 m_host.AddScriptLPS(1); 8719 m_host.AddScriptLPS(1);
8575 LSL_List list = new LSL_List(); 8720 LSL_List list = new LSL_List();
8576 //TO DO: make the implementation for the missing commands 8721 //TO DO: make the implementation for the missing commands
8577 //PARCEL_MEDIA_COMMAND_TEXTURE key uuid Use this to get or set the parcel's media texture.
8578 //PARCEL_MEDIA_COMMAND_URL string url Used to get or set the parcel's media url.
8579 //PARCEL_MEDIA_COMMAND_TYPE string mime_type Use this to get or set the parcel media MIME type (e.g. "text/html"). (1.19.1 RC0 or later)
8580 //PARCEL_MEDIA_COMMAND_SIZE integer x, integer y Use this to get or set the parcel media pixel resolution. (1.19.1 RC0 or later)
8581 //PARCEL_MEDIA_COMMAND_DESC string desc Use this to get or set the parcel media description. (1.19.1 RC0 or later)
8582 //PARCEL_MEDIA_COMMAND_LOOP_SET float loop Use this to get or set the parcel's media loop duration. (1.19.1 RC0 or later) 8722 //PARCEL_MEDIA_COMMAND_LOOP_SET float loop Use this to get or set the parcel's media loop duration. (1.19.1 RC0 or later)
8583 for (int i = 0; i < aList.Data.Length; i++) 8723 for (int i = 0; i < aList.Data.Length; i++)
8584 { 8724 {
@@ -8596,6 +8736,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8596 case ParcelMediaCommandEnum.Texture: 8736 case ParcelMediaCommandEnum.Texture:
8597 list.Add(new LSL_String(World.GetLandData(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y).MediaID.ToString())); 8737 list.Add(new LSL_String(World.GetLandData(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y).MediaID.ToString()));
8598 break; 8738 break;
8739 case ParcelMediaCommandEnum.Type:
8740 list.Add(new LSL_String(World.GetLandData(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y).MediaType));
8741 break;
8742 case ParcelMediaCommandEnum.Size:
8743 list.Add(new LSL_String(World.GetLandData(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y).MediaSize[0]));
8744 list.Add(new LSL_String(World.GetLandData(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y).MediaSize[1]));
8745 break;
8599 default: 8746 default:
8600 ParcelMediaCommandEnum mediaCommandEnum = ParcelMediaCommandEnum.Url; 8747 ParcelMediaCommandEnum mediaCommandEnum = ParcelMediaCommandEnum.Url;
8601 NotImplemented("llParcelMediaQuery parameter do not supported yet: " + Enum.Parse(mediaCommandEnum.GetType() , aList.Data[i].ToString()).ToString()); 8748 NotImplemented("llParcelMediaQuery parameter do not supported yet: " + Enum.Parse(mediaCommandEnum.GetType() , aList.Data[i].ToString()).ToString());
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs
index 13b855f..7cf82b2 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs
@@ -160,6 +160,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
160 public const int VEHICLE_BANKING_MIX = 39; 160 public const int VEHICLE_BANKING_MIX = 39;
161 public const int VEHICLE_BANKING_TIMESCALE = 40; 161 public const int VEHICLE_BANKING_TIMESCALE = 40;
162 public const int VEHICLE_REFERENCE_FRAME = 44; 162 public const int VEHICLE_REFERENCE_FRAME = 44;
163 public const int VEHICLE_RANGE_BLOCK = 45;
164 public const int VEHICLE_ROLL_FRAME = 46;
163 public const int VEHICLE_FLAG_NO_DEFLECTION_UP = 1; 165 public const int VEHICLE_FLAG_NO_DEFLECTION_UP = 1;
164 public const int VEHICLE_FLAG_LIMIT_ROLL_ONLY = 2; 166 public const int VEHICLE_FLAG_LIMIT_ROLL_ONLY = 2;
165 public const int VEHICLE_FLAG_HOVER_WATER_ONLY = 4; 167 public const int VEHICLE_FLAG_HOVER_WATER_ONLY = 4;
@@ -170,6 +172,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
170 public const int VEHICLE_FLAG_MOUSELOOK_STEER = 128; 172 public const int VEHICLE_FLAG_MOUSELOOK_STEER = 128;
171 public const int VEHICLE_FLAG_MOUSELOOK_BANK = 256; 173 public const int VEHICLE_FLAG_MOUSELOOK_BANK = 256;
172 public const int VEHICLE_FLAG_CAMERA_DECOUPLED = 512; 174 public const int VEHICLE_FLAG_CAMERA_DECOUPLED = 512;
175 public const int VEHICLE_FLAG_NO_X = 1024;
176 public const int VEHICLE_FLAG_NO_Y = 2048;
177 public const int VEHICLE_FLAG_NO_Z = 4096;
178 public const int VEHICLE_FLAG_LOCK_HOVER_HEIGHT = 8192;
179 public const int VEHICLE_FLAG_NO_DEFLECTION = 16392;
180 public const int VEHICLE_FLAG_LOCK_ROTATION = 32784;
173 181
174 public const int INVENTORY_ALL = -1; 182 public const int INVENTORY_ALL = -1;
175 public const int INVENTORY_NONE = -1; 183 public const int INVENTORY_NONE = -1;