diff --git a/OpenSim/Client/MXP/ClientStack/MXPClientView.cs b/OpenSim/Client/MXP/ClientStack/MXPClientView.cs
index 94a81f09bb..d414f08d82 100644
--- a/OpenSim/Client/MXP/ClientStack/MXPClientView.cs
+++ b/OpenSim/Client/MXP/ClientStack/MXPClientView.cs
@@ -692,6 +692,8 @@ namespace OpenSim.Client.MXP.ClientStack
public event UUIDNameRequest OnTeleportHomeRequest;
public event ScriptAnswer OnScriptAnswer;
public event AgentSit OnUndo;
+ public event AgentSit OnRedo;
+ public event LandUndo OnLandUndo;
public event ForceReleaseControls OnForceReleaseControls;
public event GodLandStatRequest OnLandStatRequest;
public event DetailedEstateDataRequest OnDetailedEstateDataRequest;
diff --git a/OpenSim/Client/Sirikata/ClientStack/SirikataClientView.cs b/OpenSim/Client/Sirikata/ClientStack/SirikataClientView.cs
index eac20bc6ce..d305ffea4d 100644
--- a/OpenSim/Client/Sirikata/ClientStack/SirikataClientView.cs
+++ b/OpenSim/Client/Sirikata/ClientStack/SirikataClientView.cs
@@ -338,6 +338,8 @@ namespace OpenSim.Client.Sirikata.ClientStack
public event UUIDNameRequest OnTeleportHomeRequest;
public event ScriptAnswer OnScriptAnswer;
public event AgentSit OnUndo;
+ public event AgentSit OnRedo;
+ public event LandUndo OnLandUndo;
public event ForceReleaseControls OnForceReleaseControls;
public event GodLandStatRequest OnLandStatRequest;
public event DetailedEstateDataRequest OnDetailedEstateDataRequest;
diff --git a/OpenSim/Client/VWoHTTP/ClientStack/VWHClientView.cs b/OpenSim/Client/VWoHTTP/ClientStack/VWHClientView.cs
index 20122112b0..ef74677836 100644
--- a/OpenSim/Client/VWoHTTP/ClientStack/VWHClientView.cs
+++ b/OpenSim/Client/VWoHTTP/ClientStack/VWHClientView.cs
@@ -343,6 +343,8 @@ namespace OpenSim.Client.VWoHTTP.ClientStack
public event UUIDNameRequest OnTeleportHomeRequest = delegate { };
public event ScriptAnswer OnScriptAnswer = delegate { };
public event AgentSit OnUndo = delegate { };
+ public event AgentSit OnRedo = delegate { };
+ public event LandUndo OnLandUndo = delegate { };
public event ForceReleaseControls OnForceReleaseControls = delegate { };
public event GodLandStatRequest OnLandStatRequest = delegate { };
public event DetailedEstateDataRequest OnDetailedEstateDataRequest = delegate { };
diff --git a/OpenSim/Framework/AvatarAppearance.cs b/OpenSim/Framework/AvatarAppearance.cs
index a3ea499357..b2c4d8ea83 100644
--- a/OpenSim/Framework/AvatarAppearance.cs
+++ b/OpenSim/Framework/AvatarAppearance.cs
@@ -390,11 +390,12 @@ namespace OpenSim.Framework
+ 0.08f * (float)m_visualparams[(int)VPElement.SHOES_PLATFORM_HEIGHT] / 255.0f // Shoe platform height
+ 0.07f * (float)m_visualparams[(int)VPElement.SHOES_HEEL_HEIGHT] / 255.0f // Shoe heel height
+ 0.076f * (float)m_visualparams[(int)VPElement.SHAPE_NECK_LENGTH] / 255.0f; // Neck length
- m_hipOffset = (0.615385f // Half of avatar
+ m_hipOffset = (((1.23077f // Half of avatar
+ + 0.516945f * (float)m_visualparams[(int)VPElement.SHAPE_HEIGHT] / 255.0f // Body height
+ + 0.3836f * (float)m_visualparams[(int)VPElement.SHAPE_LEG_LENGTH] / 255.0f // Leg length
+ 0.08f * (float)m_visualparams[(int)VPElement.SHOES_PLATFORM_HEIGHT] / 255.0f // Shoe platform height
+ 0.07f * (float)m_visualparams[(int)VPElement.SHOES_HEEL_HEIGHT] / 255.0f // Shoe heel height
- + 0.3836f * (float)m_visualparams[(int)VPElement.SHAPE_LEG_LENGTH] / 255.0f // Leg length
- - m_avatarHeight / 2) * 0.3f - 0.04f;
+ ) / 2) - m_avatarHeight / 2) * 0.31f - 0.0425f;
diff --git a/OpenSim/Framework/IClientAPI.cs b/OpenSim/Framework/IClientAPI.cs
index 3f53258713..222bae0d52 100644
--- a/OpenSim/Framework/IClientAPI.cs
+++ b/OpenSim/Framework/IClientAPI.cs
@@ -152,6 +152,8 @@ namespace OpenSim.Framework
public delegate void AgentSit(IClientAPI remoteClient, UUID agentID);
+ public delegate void LandUndo(IClientAPI remoteClient);
+
public delegate void AvatarPickerRequest(IClientAPI remoteClient, UUID agentdata, UUID queryID, string UserQuery);
public delegate void GrabObject(
@@ -419,9 +421,9 @@ namespace OpenSim.Framework
public delegate void AcceptCallingCard(IClientAPI remoteClient, UUID transactionID, UUID folderID);
public delegate void DeclineCallingCard(IClientAPI remoteClient, UUID transactionID);
-
+
public delegate void SoundTrigger(
- UUID soundId, UUID ownerid, UUID objid, UUID parentid, double Gain, Vector3 Position, UInt64 Handle);
+ UUID soundId, UUID ownerid, UUID objid, UUID parentid, double Gain, Vector3 Position, UInt64 Handle, float radius);
public delegate void StartLure(byte lureType, string message, UUID targetID, IClientAPI client);
public delegate void TeleportLureRequest(UUID lureID, uint teleportFlags, IClientAPI client);
@@ -988,6 +990,8 @@ namespace OpenSim.Framework
event ScriptAnswer OnScriptAnswer;
event AgentSit OnUndo;
+ event AgentSit OnRedo;
+ event LandUndo OnLandUndo;
event ForceReleaseControls OnForceReleaseControls;
event GodLandStatRequest OnLandStatRequest;
diff --git a/OpenSim/Framework/LandData.cs b/OpenSim/Framework/LandData.cs
index 071a66758f..060e88696a 100644
--- a/OpenSim/Framework/LandData.cs
+++ b/OpenSim/Framework/LandData.cs
@@ -358,6 +358,32 @@ namespace OpenSim.Framework
}
}
+ private int[] _mediaSize = new int[2];
+ public int[] MediaSize
+ {
+ get
+ {
+ return _mediaSize;
+ }
+ set
+ {
+ _mediaSize = value;
+ }
+ }
+
+ private string _mediaType = "";
+ public string MediaType
+ {
+ get
+ {
+ return _mediaType;
+ }
+ set
+ {
+ _mediaType = value;
+ }
+ }
+
///
/// URL to the shoutcast music stream to play on the parcel
///
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
index e39323f549..9fe61a7f8c 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
@@ -233,6 +233,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
public event ObjectBuy OnObjectBuy;
public event BuyObjectInventory OnBuyObjectInventory;
public event AgentSit OnUndo;
+ public event AgentSit OnRedo;
+ public event LandUndo OnLandUndo;
public event ForceReleaseControls OnForceReleaseControls;
public event GodLandStatRequest OnLandStatRequest;
public event RequestObjectPropertiesFamily OnObjectGroupRequest;
@@ -4667,6 +4669,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
AddLocalPacketHandler(PacketType.ObjectName, HandleObjectName, false);
AddLocalPacketHandler(PacketType.ObjectPermissions, HandleObjectPermissions, false);
AddLocalPacketHandler(PacketType.Undo, HandleUndo, false);
+ AddLocalPacketHandler(PacketType.UndoLand, HandleLandUndo, false);
+ AddLocalPacketHandler(PacketType.Redo, HandleRedo, false);
AddLocalPacketHandler(PacketType.ObjectDuplicateOnRay, HandleObjectDuplicateOnRay);
AddLocalPacketHandler(PacketType.RequestObjectPropertiesFamily, HandleRequestObjectPropertiesFamily, false);
AddLocalPacketHandler(PacketType.ObjectIncludeInSearch, HandleObjectIncludeInSearch);
@@ -5836,7 +5840,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
handlerSoundTrigger(soundTriggerPacket.SoundData.SoundID, soundTriggerPacket.SoundData.OwnerID,
soundTriggerPacket.SoundData.ObjectID, soundTriggerPacket.SoundData.ParentID,
soundTriggerPacket.SoundData.Gain, soundTriggerPacket.SoundData.Position,
- soundTriggerPacket.SoundData.Handle);
+ soundTriggerPacket.SoundData.Handle, 0);
}
return true;
@@ -6734,6 +6738,56 @@ namespace OpenSim.Region.ClientStack.LindenUDP
return true;
}
+ private bool HandleLandUndo(IClientAPI sender, Packet Pack)
+ {
+ UndoLandPacket undolanditem = (UndoLandPacket)Pack;
+
+ #region Packet Session and User Check
+ if (m_checkPackets)
+ {
+ if (undolanditem.AgentData.SessionID != SessionId ||
+ undolanditem.AgentData.AgentID != AgentId)
+ return true;
+ }
+ #endregion
+
+ LandUndo handlerOnUndo = OnLandUndo;
+ if (handlerOnUndo != null)
+ {
+ handlerOnUndo(this);
+ }
+ return true;
+ }
+
+ private bool HandleRedo(IClientAPI sender, Packet Pack)
+ {
+ RedoPacket redoitem = (RedoPacket)Pack;
+
+ #region Packet Session and User Check
+ if (m_checkPackets)
+ {
+ if (redoitem.AgentData.SessionID != SessionId ||
+ redoitem.AgentData.AgentID != AgentId)
+ return true;
+ }
+ #endregion
+
+ if (redoitem.ObjectData.Length > 0)
+ {
+ for (int i = 0; i < redoitem.ObjectData.Length; i++)
+ {
+ UUID objiD = redoitem.ObjectData[i].ObjectID;
+ AgentSit handlerOnRedo = OnRedo;
+ if (handlerOnRedo != null)
+ {
+ handlerOnRedo(this, objiD);
+ }
+
+ }
+ }
+ return true;
+ }
+
private bool HandleObjectDuplicateOnRay(IClientAPI sender, Packet Pack)
{
ObjectDuplicateOnRayPacket dupeOnRay = (ObjectDuplicateOnRayPacket)Pack;
diff --git a/OpenSim/Region/CoreModules/Avatar/Combat/CombatModule.cs b/OpenSim/Region/CoreModules/Avatar/Combat/CombatModule.cs
index 61b6d65cc7..406999167f 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
private void AvatarEnteringParcel(ScenePresence avatar, int localLandID, UUID regionID)
{
ILandObject obj = avatar.Scene.LandChannel.GetLandObject(avatar.AbsolutePosition.X, avatar.AbsolutePosition.Y);
- if ((obj.LandData.Flags & (uint)ParcelFlags.AllowDamage) != 0)
+ try
{
- avatar.Invulnerable = false;
+ if ((obj.LandData.Flags & (uint)ParcelFlags.AllowDamage) != 0)
+ {
+ avatar.Invulnerable = false;
+ }
+ else
+ {
+ avatar.Invulnerable = true;
+ }
}
- else
+ catch (Exception ex)
{
- avatar.Invulnerable = true;
}
}
}
diff --git a/OpenSim/Region/CoreModules/World/Sound/SoundModule.cs b/OpenSim/Region/CoreModules/World/Sound/SoundModule.cs
index 37f1f2eb9f..1f5a4ffad4 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
}
public virtual void PlayAttachedSound(
- UUID soundID, UUID ownerID, UUID objectID, double gain, Vector3 position, byte flags)
+ UUID soundID, UUID ownerID, UUID objectID, double gain, Vector3 position, byte flags, float radius)
{
foreach (ScenePresence p in m_scene.GetAvatars())
{
@@ -69,14 +69,17 @@ namespace OpenSim.Region.CoreModules.World.Sound
continue;
// Scale by distance
- gain = (float)((double)gain*((100.0 - dis) / 100.0));
+ if (radius == 0)
+ gain = (float)((double)gain * ((100.0 - dis) / 100.0));
+ else
+ gain = (float)((double)gain * ((radius - dis) / radius));
p.ControllingClient.SendPlayAttachedSound(soundID, objectID, ownerID, (float)gain, flags);
}
}
public virtual void TriggerSound(
- UUID soundId, UUID ownerID, UUID objectID, UUID parentID, double gain, Vector3 position, UInt64 handle)
+ UUID soundId, UUID ownerID, UUID objectID, UUID parentID, double gain, Vector3 position, UInt64 handle, float radius)
{
foreach (ScenePresence p in m_scene.GetAvatars())
{
@@ -85,7 +88,10 @@ namespace OpenSim.Region.CoreModules.World.Sound
continue;
// Scale by distance
- gain = (float)((double)gain*((100.0 - dis) / 100.0));
+ if (radius == 0)
+ gain = (float)((double)gain * ((100.0 - dis) / 100.0));
+ else
+ gain = (float)((double)gain * ((radius - dis) / radius));
p.ControllingClient.SendTriggeredSound(
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 a40828b080..1e7ea7bce6 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
private ITerrainChannel m_revert;
private Scene m_scene;
private volatile bool m_tainted;
+ private readonly UndoStack m_undo = new UndoStack(5);
#region ICommandableModule Members
@@ -174,6 +175,11 @@ namespace OpenSim.Region.CoreModules.World.Terrain
#region ITerrainModule Members
+ public void UndoTerrain(ITerrainChannel channel)
+ {
+ m_channel = channel;
+ }
+
///
/// Loads a terrain file from disk and installs it in the scene.
///
@@ -574,6 +580,7 @@ namespace OpenSim.Region.CoreModules.World.Terrain
{
client.OnModifyTerrain += client_OnModifyTerrain;
client.OnBakeTerrain += client_OnBakeTerrain;
+ client.OnLandUndo += client_OnLandUndo;
}
///
@@ -664,6 +671,19 @@ namespace OpenSim.Region.CoreModules.World.Terrain
return changesLimited;
}
+ private void client_OnLandUndo(IClientAPI client)
+ {
+ lock (m_undo)
+ {
+ if (m_undo.Count > 0)
+ {
+ LandUndoState goback = m_undo.Pop();
+ if (goback != null)
+ goback.PlaybackState();
+ }
+ }
+ }
+
///
/// Sends a copy of the current terrain to the scenes clients
///
@@ -718,6 +738,7 @@ namespace OpenSim.Region.CoreModules.World.Terrain
}
if (allowed)
{
+ StoreUndoState();
m_painteffects[(StandardTerrainEffects) action].PaintEffect(
m_channel, allowMask, west, south, height, size, seconds);
@@ -758,6 +779,7 @@ namespace OpenSim.Region.CoreModules.World.Terrain
if (allowed)
{
+ StoreUndoState();
m_floodeffects[(StandardTerrainEffects) action].FloodEffect(
m_channel, fillArea, size);
@@ -782,6 +804,25 @@ namespace OpenSim.Region.CoreModules.World.Terrain
}
}
+ private void StoreUndoState()
+ {
+ lock (m_undo)
+ {
+ if (m_undo.Count > 0)
+ {
+ LandUndoState last = m_undo.Peek();
+ if (last != null)
+ {
+ if (last.Compare(m_channel))
+ return;
+ }
+ }
+
+ LandUndoState nUndo = new LandUndoState(this, m_channel);
+ m_undo.Push(nUndo);
+ }
+ }
+
#region Console Commands
private void InterfaceLoadFile(Object[] args)
diff --git a/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs b/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs
index 0bd1a26c41..ce9362f0b9 100644
--- a/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs
+++ b/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs
@@ -194,6 +194,8 @@ namespace OpenSim.Region.Examples.SimpleModule
public event ObjectBuy OnObjectBuy;
public event BuyObjectInventory OnBuyObjectInventory;
public event AgentSit OnUndo;
+ public event AgentSit OnRedo;
+ public event LandUndo OnLandUndo;
public event ForceReleaseControls OnForceReleaseControls;
diff --git a/OpenSim/Region/Framework/Interfaces/ISoundModule.cs b/OpenSim/Region/Framework/Interfaces/ISoundModule.cs
index 379fabdf03..6117a80d9e 100644
--- a/OpenSim/Region/Framework/Interfaces/ISoundModule.cs
+++ b/OpenSim/Region/Framework/Interfaces/ISoundModule.cs
@@ -32,9 +32,9 @@ namespace OpenSim.Region.Framework.Interfaces
{
public interface ISoundModule
{
- void PlayAttachedSound(UUID soundID, UUID ownerID, UUID objectID, double gain, Vector3 position, byte flags);
+ void PlayAttachedSound(UUID soundID, UUID ownerID, UUID objectID, double gain, Vector3 position, byte flags, float radius);
void TriggerSound(
- UUID soundId, UUID ownerID, UUID objectID, UUID parentID, double gain, Vector3 position, UInt64 handle);
+ UUID soundId, UUID ownerID, UUID objectID, UUID parentID, double gain, Vector3 position, UInt64 handle, float radius);
}
}
\ No newline at end of file
diff --git a/OpenSim/Region/Framework/Interfaces/ITerrainModule.cs b/OpenSim/Region/Framework/Interfaces/ITerrainModule.cs
index 7caac55e9e..5947afb927 100644
--- a/OpenSim/Region/Framework/Interfaces/ITerrainModule.cs
+++ b/OpenSim/Region/Framework/Interfaces/ITerrainModule.cs
@@ -62,5 +62,7 @@ namespace OpenSim.Region.Framework.Interfaces
void SaveToStream(string filename, Stream stream);
void InstallPlugin(string name, ITerrainEffect plug);
+
+ void UndoTerrain(ITerrainChannel channel);
}
}
diff --git a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs
index fd526eb214..712dcc70e8 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
{
if (m_scenePresence.IsChildAgent)
return;
-
- UUID[] animIDs;
- int[] sequenceNums;
- UUID[] objectIDs;
- m_animations.GetArrays(out animIDs, out sequenceNums, out objectIDs);
-
- m_scenePresence.ControllingClient.SendAnimations(
- animIDs, sequenceNums, m_scenePresence.ControllingClient.AgentId, objectIDs);
+ m_scenePresence.Scene.ForEachScenePresence(
+ delegate(ScenePresence SP)
+ {
+ SP.Animator.SendAnimPack();
+ });
}
///
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 2909311e07..c7fb32afb1 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -1976,6 +1976,23 @@ namespace OpenSim.Region.Framework.Scenes
return;
}
+ if (grp.RootPart.RETURN_AT_EDGE)
+ {
+ // We remove the object here
+ try
+ {
+ List objects = new List();
+ objects.Add(grp);
+ SceneObjectGroup[] objectsArray = objects.ToArray();
+ returnObjects(objectsArray, UUID.Zero);
+ }
+ catch (Exception)
+ {
+ m_log.Warn("[DATABASE]: exception when trying to return the prim that crossed the border.");
+ }
+ return;
+ }
+
int thisx = (int)RegionInfo.RegionLocX;
int thisy = (int)RegionInfo.RegionLocY;
Vector3 EastCross = new Vector3(0.1f,0,0);
@@ -2044,19 +2061,25 @@ namespace OpenSim.Region.Framework.Scenes
Border crossedBordery = GetCrossedBorder(attemptedPosition + SouthCross, Cardinals.S);
//(crossedBorderx.BorderLine.Z / (int)Constants.RegionSize)
- if (crossedBordery.BorderLine.Z > 0)
+ try
{
- pos.Y = ((pos.Y + crossedBordery.BorderLine.Z));
- changeY = (int)(crossedBordery.BorderLine.Z / (int)Constants.RegionSize);
- }
- else
- pos.Y = ((pos.Y + Constants.RegionSize));
+ if (crossedBordery.BorderLine.Z > 0)
+ {
+ pos.Y = ((pos.Y + crossedBordery.BorderLine.Z));
+ changeY = (int)(crossedBordery.BorderLine.Z / (int)Constants.RegionSize);
+ }
+ else
+ pos.Y = ((pos.Y + Constants.RegionSize));
- newRegionHandle
- = Util.UIntsToLong((uint)((thisx - changeX) * Constants.RegionSize),
- (uint)((thisy + changeY) * Constants.RegionSize));
- // x - 1
- // y + 1
+ newRegionHandle
+ = Util.UIntsToLong((uint)((thisx - changeX) * Constants.RegionSize),
+ (uint)((thisy + changeY) * Constants.RegionSize));
+ // x - 1
+ // y + 1
+ }
+ catch (Exception ex)
+ {
+ }
}
else
{
@@ -2684,6 +2707,7 @@ namespace OpenSim.Region.Framework.Scenes
client.OnGrabUpdate += ProcessObjectGrabUpdate;
client.OnDeGrabObject += ProcessObjectDeGrab;
client.OnUndo += m_sceneGraph.HandleUndo;
+ client.OnRedo += m_sceneGraph.HandleRedo;
client.OnObjectDescription += m_sceneGraph.PrimDescription;
client.OnObjectDrop += m_sceneGraph.DropObject;
client.OnObjectSaleInfo += ObjectSaleInfo;
@@ -2838,6 +2862,7 @@ namespace OpenSim.Region.Framework.Scenes
client.OnGrabObject -= ProcessObjectGrab;
client.OnDeGrabObject -= ProcessObjectDeGrab;
client.OnUndo -= m_sceneGraph.HandleUndo;
+ client.OnRedo -= m_sceneGraph.HandleRedo;
client.OnObjectDescription -= m_sceneGraph.PrimDescription;
client.OnObjectDrop -= m_sceneGraph.DropObject;
client.OnObjectSaleInfo -= ObjectSaleInfo;
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
index 1ac061a1b2..2b131812cc 100644
--- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
@@ -452,6 +452,15 @@ namespace OpenSim.Region.Framework.Scenes
part.Undo();
}
}
+ protected internal void HandleRedo(IClientAPI remoteClient, UUID primId)
+ {
+ if (primId != UUID.Zero)
+ {
+ SceneObjectPart part = m_parentScene.GetSceneObjectPart(primId);
+ if (part != null)
+ part.Redo();
+ }
+ }
protected internal void HandleObjectGroupUpdate(
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 af466593bc..fe9dd9bed3 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -298,7 +298,16 @@ namespace OpenSim.Region.Framework.Scenes
{
m_scene.CrossPrimGroupIntoNewRegion(val, this, true);
}
-
+ if (RootPart.GetStatusSandbox())
+ {
+ if (Util.GetDistanceTo(RootPart.StatusSandboxPos, value) > 10)
+ {
+ RootPart.ScriptSetPhysicsStatus(false);
+ Scene.SimChat(Utils.StringToBytes("Hit Sandbox Limit"),
+ ChatTypeEnum.DebugChannel, 0x7FFFFFFF, RootPart.AbsolutePosition, Name, UUID, false);
+ return;
+ }
+ }
lock (m_parts)
{
foreach (SceneObjectPart part in m_parts.Values)
@@ -398,6 +407,34 @@ namespace OpenSim.Region.Framework.Scenes
}
}
+ private SceneObjectPart m_PlaySoundMasterPrim = null;
+ public SceneObjectPart PlaySoundMasterPrim
+ {
+ get { return m_PlaySoundMasterPrim; }
+ set { m_PlaySoundMasterPrim = value; }
+ }
+
+ private List m_PlaySoundSlavePrims = new List();
+ public List PlaySoundSlavePrims
+ {
+ get { return m_LoopSoundSlavePrims; }
+ set { m_LoopSoundSlavePrims = value; }
+ }
+
+ private SceneObjectPart m_LoopSoundMasterPrim = null;
+ public SceneObjectPart LoopSoundMasterPrim
+ {
+ get { return m_LoopSoundMasterPrim; }
+ set { m_LoopSoundMasterPrim = value; }
+ }
+
+ private List m_LoopSoundSlavePrims = new List();
+ public List LoopSoundSlavePrims
+ {
+ get { return m_LoopSoundSlavePrims; }
+ set { m_LoopSoundSlavePrims = value; }
+ }
+
// The UUID for the Region this Object is in.
public UUID RegionUUID
{
@@ -1779,32 +1816,6 @@ namespace OpenSim.Region.Framework.Scenes
}
}
- public void rotLookAt(Quaternion target, float strength, float damping)
- {
- SceneObjectPart rootpart = m_rootPart;
- if (rootpart != null)
- {
- if (IsAttachment)
- {
- /*
- ScenePresence avatar = m_scene.GetScenePresence(rootpart.AttachedAvatar);
- if (avatar != null)
- {
- Rotate the Av?
- } */
- }
- else
- {
- if (rootpart.PhysActor != null)
- {
- rootpart.PhysActor.APIDTarget = new Quaternion(target.X, target.Y, target.Z, target.W);
- rootpart.PhysActor.APIDStrength = strength;
- rootpart.PhysActor.APIDDamping = damping;
- rootpart.PhysActor.APIDActive = true;
- }
- }
- }
- }
public void stopLookAt()
{
SceneObjectPart rootpart = m_rootPart;
@@ -1963,6 +1974,8 @@ namespace OpenSim.Region.Framework.Scenes
foreach (SceneObjectPart part in m_parts.Values)
{
+ if (!IsSelected)
+ part.UpdateLookAt();
part.SendScheduledUpdates();
}
}
@@ -2452,11 +2465,14 @@ namespace OpenSim.Region.Framework.Scenes
{
if (m_rootPart.PhysActor.IsPhysical)
{
- Vector3 llmoveforce = pos - AbsolutePosition;
- Vector3 grabforce = llmoveforce;
- grabforce = (grabforce / 10) * m_rootPart.PhysActor.Mass;
- m_rootPart.PhysActor.AddForce(grabforce,true);
- m_scene.PhysicsScene.AddPhysicsActorTaint(m_rootPart.PhysActor);
+ if (!m_rootPart.BlockGrab)
+ {
+ Vector3 llmoveforce = pos - AbsolutePosition;
+ Vector3 grabforce = llmoveforce;
+ grabforce = (grabforce / 10) * m_rootPart.PhysActor.Mass;
+ m_rootPart.PhysActor.AddForce(grabforce, true);
+ m_scene.PhysicsScene.AddPhysicsActorTaint(m_rootPart.PhysActor);
+ }
}
else
{
@@ -2812,6 +2828,7 @@ namespace OpenSim.Region.Framework.Scenes
SceneObjectPart part = GetChildPart(localID);
if (part != null)
{
+ part.IgnoreUndoUpdate = true;
if (scale.X > m_scene.m_maxNonphys)
scale.X = m_scene.m_maxNonphys;
if (scale.Y > m_scene.m_maxNonphys)
@@ -2839,6 +2856,7 @@ namespace OpenSim.Region.Framework.Scenes
{
if (obPart.UUID != m_rootPart.UUID)
{
+ obPart.IgnoreUndoUpdate = true;
Vector3 oldSize = new Vector3(obPart.Scale);
float f = 1.0f;
@@ -2898,6 +2916,8 @@ namespace OpenSim.Region.Framework.Scenes
z *= a;
}
}
+ obPart.IgnoreUndoUpdate = false;
+ obPart.StoreUndoState();
}
}
}
@@ -2913,6 +2933,7 @@ namespace OpenSim.Region.Framework.Scenes
{
foreach (SceneObjectPart obPart in m_parts.Values)
{
+ obPart.IgnoreUndoUpdate = true;
if (obPart.UUID != m_rootPart.UUID)
{
Vector3 currentpos = new Vector3(obPart.OffsetPosition);
@@ -2926,6 +2947,8 @@ namespace OpenSim.Region.Framework.Scenes
obPart.Resize(newSize);
obPart.UpdateOffSet(currentpos);
}
+ obPart.IgnoreUndoUpdate = false;
+ obPart.StoreUndoState();
}
}
@@ -2935,6 +2958,8 @@ namespace OpenSim.Region.Framework.Scenes
m_scene.PhysicsScene.AddPhysicsActorTaint(part.PhysActor);
}
+ part.IgnoreUndoUpdate = false;
+ part.StoreUndoState();
HasGroupChanged = true;
ScheduleGroupForTerseUpdate();
}
@@ -2950,13 +2975,26 @@ namespace OpenSim.Region.Framework.Scenes
///
public void UpdateGroupPosition(Vector3 pos)
{
+ foreach (SceneObjectPart part in Children.Values)
+ {
+ part.StoreUndoState();
+ }
if (m_scene.EventManager.TriggerGroupMove(UUID, pos))
{
if (IsAttachment)
{
m_rootPart.AttachedPos = pos;
}
-
+ if (RootPart.GetStatusSandbox())
+ {
+ if (Util.GetDistanceTo(RootPart.StatusSandboxPos, pos) > 10)
+ {
+ RootPart.ScriptSetPhysicsStatus(false);
+ pos = AbsolutePosition;
+ Scene.SimChat(Utils.StringToBytes("Hit Sandbox Limit"),
+ ChatTypeEnum.DebugChannel, 0x7FFFFFFF, RootPart.AbsolutePosition, Name, UUID, false);
+ }
+ }
AbsolutePosition = pos;
HasGroupChanged = true;
@@ -2975,7 +3013,10 @@ namespace OpenSim.Region.Framework.Scenes
public void UpdateSinglePosition(Vector3 pos, uint localID)
{
SceneObjectPart part = GetChildPart(localID);
-
+ foreach (SceneObjectPart parts in Children.Values)
+ {
+ parts.StoreUndoState();
+ }
if (part != null)
{
if (part.UUID == m_rootPart.UUID)
@@ -2997,6 +3038,10 @@ namespace OpenSim.Region.Framework.Scenes
///
private void UpdateRootPosition(Vector3 pos)
{
+ foreach (SceneObjectPart part in Children.Values)
+ {
+ part.StoreUndoState();
+ }
Vector3 newPos = new Vector3(pos.X, pos.Y, pos.Z);
Vector3 oldPos =
new Vector3(AbsolutePosition.X + m_rootPart.OffsetPosition.X,
@@ -3040,6 +3085,10 @@ namespace OpenSim.Region.Framework.Scenes
///
public void UpdateGroupRotationR(Quaternion rot)
{
+ foreach (SceneObjectPart parts in Children.Values)
+ {
+ parts.StoreUndoState();
+ }
m_rootPart.UpdateRotation(rot);
PhysicsActor actor = m_rootPart.PhysActor;
@@ -3060,6 +3109,10 @@ namespace OpenSim.Region.Framework.Scenes
///
public void UpdateGroupRotationPR(Vector3 pos, Quaternion rot)
{
+ foreach (SceneObjectPart parts in Children.Values)
+ {
+ parts.StoreUndoState();
+ }
m_rootPart.UpdateRotation(rot);
PhysicsActor actor = m_rootPart.PhysActor;
@@ -3083,6 +3136,10 @@ namespace OpenSim.Region.Framework.Scenes
public void UpdateSingleRotation(Quaternion rot, uint localID)
{
SceneObjectPart part = GetChildPart(localID);
+ foreach (SceneObjectPart parts in Children.Values)
+ {
+ parts.StoreUndoState();
+ }
if (part != null)
{
if (part.UUID == m_rootPart.UUID)
@@ -3113,8 +3170,11 @@ namespace OpenSim.Region.Framework.Scenes
}
else
{
+ part.IgnoreUndoUpdate = true;
part.UpdateRotation(rot);
part.OffsetPosition = pos;
+ part.IgnoreUndoUpdate = false;
+ part.StoreUndoState();
}
}
}
@@ -3128,6 +3188,7 @@ namespace OpenSim.Region.Framework.Scenes
Quaternion axRot = rot;
Quaternion oldParentRot = m_rootPart.RotationOffset;
+ m_rootPart.StoreUndoState();
m_rootPart.UpdateRotation(rot);
if (m_rootPart.PhysActor != null)
{
@@ -3141,6 +3202,7 @@ namespace OpenSim.Region.Framework.Scenes
{
if (prim.UUID != m_rootPart.UUID)
{
+ prim.IgnoreUndoUpdate = true;
Vector3 axPos = prim.OffsetPosition;
axPos *= oldParentRot;
axPos *= Quaternion.Inverse(axRot);
@@ -3153,7 +3215,14 @@ namespace OpenSim.Region.Framework.Scenes
}
}
}
-
+ foreach (SceneObjectPart childpart in Children.Values)
+ {
+ if (childpart != m_rootPart)
+ {
+ childpart.IgnoreUndoUpdate = false;
+ childpart.StoreUndoState();
+ }
+ }
m_rootPart.ScheduleTerseUpdate();
}
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index dd797fcdae..d339208142 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -133,6 +133,18 @@ namespace OpenSim.Region.Framework.Scenes
[XmlIgnore]
public bool DIE_AT_EDGE;
+ [XmlIgnore]
+ public bool RETURN_AT_EDGE;
+
+ [XmlIgnore]
+ public bool BlockGrab;
+
+ [XmlIgnore]
+ public bool StatusSandbox;
+
+ [XmlIgnore]
+ public Vector3 StatusSandboxPos;
+
// TODO: This needs to be persisted in next XML version update!
[XmlIgnore]
public readonly int[] PayPrice = {-2,-2,-2,-2,-2};
@@ -219,6 +231,15 @@ namespace OpenSim.Region.Framework.Scenes
[XmlIgnore]
public Quaternion SpinOldOrientation = Quaternion.Identity;
+ [XmlIgnore]
+ public Quaternion m_APIDTarget = Quaternion.Identity;
+
+ [XmlIgnore]
+ public float m_APIDDamp = 0;
+
+ [XmlIgnore]
+ public float m_APIDStrength = 0;
+
///
/// This part's inventory
///
@@ -232,6 +253,9 @@ namespace OpenSim.Region.Framework.Scenes
[XmlIgnore]
public bool Undoing;
+ [XmlIgnore]
+ public bool IgnoreUndoUpdate = false;
+
[XmlIgnore]
private PrimFlags LocalFlags;
[XmlIgnore]
@@ -253,6 +277,7 @@ namespace OpenSim.Region.Framework.Scenes
private string m_text = String.Empty;
private string m_touchName = String.Empty;
private readonly UndoStack m_undo = new UndoStack(5);
+ private readonly UndoStack m_redo = new UndoStack(5);
private UUID _creatorID;
private bool m_passTouches;
@@ -501,6 +526,27 @@ namespace OpenSim.Region.Framework.Scenes
}
}
+ [XmlIgnore]
+ public Quaternion APIDTarget
+ {
+ get { return m_APIDTarget; }
+ set { m_APIDTarget = value; }
+ }
+
+ [XmlIgnore]
+ public float APIDDamp
+ {
+ get { return m_APIDDamp; }
+ set { m_APIDDamp = value; }
+ }
+
+ [XmlIgnore]
+ public float APIDStrength
+ {
+ get { return m_APIDStrength; }
+ set { m_APIDStrength = value; }
+ }
+
public ulong RegionHandle
{
get { return m_regionHandle; }
@@ -512,6 +558,33 @@ namespace OpenSim.Region.Framework.Scenes
get { return m_scriptAccessPin; }
set { m_scriptAccessPin = (int)value; }
}
+ private SceneObjectPart m_PlaySoundMasterPrim = null;
+ public SceneObjectPart PlaySoundMasterPrim
+ {
+ get { return m_PlaySoundMasterPrim; }
+ set { m_PlaySoundMasterPrim = value; }
+ }
+
+ private List m_PlaySoundSlavePrims = new List();
+ public List PlaySoundSlavePrims
+ {
+ get { return m_LoopSoundSlavePrims; }
+ set { m_LoopSoundSlavePrims = value; }
+ }
+
+ private SceneObjectPart m_LoopSoundMasterPrim = null;
+ public SceneObjectPart LoopSoundMasterPrim
+ {
+ get { return m_LoopSoundMasterPrim; }
+ set { m_LoopSoundMasterPrim = value; }
+ }
+
+ private List m_LoopSoundSlavePrims = new List();
+ public List LoopSoundSlavePrims
+ {
+ get { return m_LoopSoundSlavePrims; }
+ set { m_LoopSoundSlavePrims = value; }
+ }
[XmlIgnore]
public Byte[] TextureAnimation
@@ -573,8 +646,6 @@ namespace OpenSim.Region.Framework.Scenes
}
set
{
- StoreUndoState();
-
m_groupPosition = value;
PhysicsActor actor = PhysActor;
@@ -1401,6 +1472,10 @@ namespace OpenSim.Region.Framework.Scenes
{
m_undo.Clear();
}
+ lock (m_redo)
+ {
+ m_redo.Clear();
+ }
StoreUndoState();
}
@@ -1711,6 +1786,66 @@ namespace OpenSim.Region.Framework.Scenes
return m_parentGroup.RootPart.DIE_AT_EDGE;
}
+ public bool GetReturnAtEdge()
+ {
+ if (m_parentGroup == null)
+ return false;
+ if (m_parentGroup.IsDeleted)
+ return false;
+
+ return m_parentGroup.RootPart.RETURN_AT_EDGE;
+ }
+
+ public void SetReturnAtEdge(bool p)
+ {
+ if (m_parentGroup == null)
+ return;
+ if (m_parentGroup.IsDeleted)
+ return;
+
+ m_parentGroup.RootPart.RETURN_AT_EDGE = p;
+ }
+
+ public bool GetBlockGrab()
+ {
+ if (m_parentGroup == null)
+ return false;
+ if (m_parentGroup.IsDeleted)
+ return false;
+
+ return m_parentGroup.RootPart.BlockGrab;
+ }
+
+ public void SetBlockGrab(bool p)
+ {
+ if (m_parentGroup == null)
+ return;
+ if (m_parentGroup.IsDeleted)
+ return;
+
+ m_parentGroup.RootPart.BlockGrab = p;
+ }
+
+ public void SetStatusSandbox(bool p)
+ {
+ if (m_parentGroup == null)
+ return;
+ if (m_parentGroup.IsDeleted)
+ return;
+ StatusSandboxPos = m_parentGroup.RootPart.AbsolutePosition;
+ m_parentGroup.RootPart.StatusSandbox = p;
+ }
+
+ public bool GetStatusSandbox()
+ {
+ if (m_parentGroup == null)
+ return false;
+ if (m_parentGroup.IsDeleted)
+ return false;
+
+ return m_parentGroup.RootPart.StatusSandbox;
+ }
+
public int GetAxisRotation(int axis)
{
//Cannot use ScriptBaseClass constants as no referance to it currently.
@@ -1917,7 +2052,7 @@ namespace OpenSim.Region.Framework.Scenes
// play the sound.
if (startedColliders.Count > 0 && CollisionSound != UUID.Zero && CollisionSoundVolume > 0.0f)
{
- SendSound(CollisionSound.ToString(), CollisionSoundVolume, true, (byte)0);
+ SendSound(CollisionSound.ToString(), CollisionSoundVolume, true, (byte)0, 0, false, false);
}
if ((m_parentGroup.RootPart.ScriptEvents & scriptEvents.collision_start) != 0)
@@ -2491,9 +2626,8 @@ namespace OpenSim.Region.Framework.Scenes
List avatarts = m_parentGroup.Scene.GetAvatars();
foreach (ScenePresence p in avatarts)
{
- // TODO: some filtering by distance of avatar
-
- p.ControllingClient.SendPreLoadSound(objectID, objectID, soundID);
+ if (!(Util.GetDistanceTo(p.AbsolutePosition, AbsolutePosition) >= 100))
+ p.ControllingClient.SendPreLoadSound(objectID, objectID, soundID);
}
}
@@ -2554,7 +2688,38 @@ namespace OpenSim.Region.Framework.Scenes
public void RotLookAt(Quaternion target, float strength, float damping)
{
- m_parentGroup.rotLookAt(target, strength, damping);
+ rotLookAt(target, strength, damping);
+ }
+
+ public void rotLookAt(Quaternion target, float strength, float damping)
+ {
+ if (IsAttachment)
+ {
+ /*
+ ScenePresence avatar = m_scene.GetScenePresence(rootpart.AttachedAvatar);
+ if (avatar != null)
+ {
+ Rotate the Av?
+ } */
+ }
+ else
+ {
+ APIDDamp = damping;
+ APIDStrength = strength;
+ APIDTarget = target;
+ }
+ }
+
+ public void startLookAt(Quaternion rot, float damp, float strength)
+ {
+ APIDDamp = damp;
+ APIDStrength = strength;
+ APIDTarget = rot;
+ }
+
+ public void stopLookAt()
+ {
+ APIDTarget = Quaternion.Identity;
}
///
@@ -2814,7 +2979,7 @@ namespace OpenSim.Region.Framework.Scenes
///
///
///
- public void SendSound(string sound, double volume, bool triggered, byte flags)
+ public void SendSound(string sound, double volume, bool triggered, byte flags, float radius, bool useMaster, bool isMaster)
{
if (volume > 1)
volume = 1;
@@ -2850,10 +3015,51 @@ namespace OpenSim.Region.Framework.Scenes
ISoundModule soundModule = m_parentGroup.Scene.RequestModuleInterface();
if (soundModule != null)
{
- if (triggered)
- soundModule.TriggerSound(soundID, ownerID, objectID, parentID, volume, position, regionHandle);
+ if (useMaster)
+ {
+ if (isMaster)
+ {
+ if (triggered)
+ soundModule.TriggerSound(soundID, ownerID, objectID, parentID, volume, position, regionHandle, radius);
+ else
+ soundModule.PlayAttachedSound(soundID, ownerID, objectID, volume, position, flags, radius);
+ ParentGroup.PlaySoundMasterPrim = this;
+ ownerID = this._ownerID;
+ objectID = this.UUID;
+ parentID = this.GetRootPartUUID();
+ position = this.AbsolutePosition; // region local
+ regionHandle = this.ParentGroup.Scene.RegionInfo.RegionHandle;
+ if (triggered)
+ soundModule.TriggerSound(soundID, ownerID, objectID, parentID, volume, position, regionHandle, radius);
+ else
+ soundModule.PlayAttachedSound(soundID, ownerID, objectID, volume, position, flags, radius);
+ foreach (SceneObjectPart prim in ParentGroup.PlaySoundSlavePrims)
+ {
+ ownerID = prim._ownerID;
+ objectID = prim.UUID;
+ parentID = prim.GetRootPartUUID();
+ position = prim.AbsolutePosition; // region local
+ regionHandle = prim.ParentGroup.Scene.RegionInfo.RegionHandle;
+ if (triggered)
+ soundModule.TriggerSound(soundID, ownerID, objectID, parentID, volume, position, regionHandle, radius);
+ else
+ soundModule.PlayAttachedSound(soundID, ownerID, objectID, volume, position, flags, radius);
+ }
+ ParentGroup.PlaySoundSlavePrims.Clear();
+ ParentGroup.PlaySoundMasterPrim = null;
+ }
+ else
+ {
+ ParentGroup.PlaySoundSlavePrims.Add(this);
+ }
+ }
else
- soundModule.PlayAttachedSound(soundID, ownerID, objectID, volume, position, flags);
+ {
+ if (triggered)
+ soundModule.TriggerSound(soundID, ownerID, objectID, parentID, volume, position, regionHandle, radius);
+ else
+ soundModule.PlayAttachedSound(soundID, ownerID, objectID, volume, position, flags, radius);
+ }
}
}
@@ -3156,6 +3362,14 @@ namespace OpenSim.Region.Framework.Scenes
hasProfileCut = hasDimple; // is it the same thing?
}
+ public void SetVehicleFlags(int param, bool remove)
+ {
+ if (PhysActor != null)
+ {
+ PhysActor.VehicleFlags(param, remove);
+ }
+ }
+
public void SetGroup(UUID groupID, IClientAPI client)
{
_groupID = groupID;
@@ -3260,27 +3474,30 @@ namespace OpenSim.Region.Framework.Scenes
{
if (!Undoing)
{
- if (m_parentGroup != null)
+ if (!IgnoreUndoUpdate)
{
- lock (m_undo)
+ if (m_parentGroup != null)
{
- if (m_undo.Count > 0)
+ lock (m_undo)
{
- UndoState last = m_undo.Peek();
- if (last != null)
+ if (m_undo.Count > 0)
{
- if (last.Compare(this))
- return;
+ UndoState last = m_undo.Peek();
+ if (last != null)
+ {
+ if (last.Compare(this))
+ return;
+ }
}
+
+ if (m_parentGroup.GetSceneMaxUndo() > 0)
+ {
+ UndoState nUndo = new UndoState(this);
+
+ m_undo.Push(nUndo);
+ }
+
}
-
- if (m_parentGroup.GetSceneMaxUndo() > 0)
- {
- UndoState nUndo = new UndoState(this);
-
- m_undo.Push(nUndo);
- }
-
}
}
}
@@ -3751,14 +3968,39 @@ namespace OpenSim.Region.Framework.Scenes
lock (m_undo)
{
if (m_undo.Count > 0)
+ {
+ UndoState nUndo = null;
+ if (m_parentGroup.GetSceneMaxUndo() > 0)
{
- UndoState goback = m_undo.Pop();
- if (goback != null)
- goback.PlaybackState(this);
+ nUndo = new UndoState(this);
+ }
+ UndoState goback = m_undo.Pop();
+ if (goback != null)
+ {
+ goback.PlaybackState(this);
+ if (nUndo != null)
+ m_redo.Push(nUndo);
+ }
}
}
}
+ public void Redo()
+ {
+ lock (m_redo)
+ {
+ if (m_parentGroup.GetSceneMaxUndo() > 0)
+ {
+ UndoState nUndo = new UndoState(this);
+
+ m_undo.Push(nUndo);
+ }
+ UndoState gofwd = m_redo.Pop();
+ if (gofwd != null)
+ gofwd.PlayfwdState(this);
+ }
+ }
+
public void UpdateExtraParam(ushort type, bool inUse, byte[] data)
{
m_shape.ReadInUpdateExtraParam(type, inUse, data);
@@ -3802,6 +4044,18 @@ namespace OpenSim.Region.Framework.Scenes
(pos.Z != OffsetPosition.Z))
{
Vector3 newPos = new Vector3(pos.X, pos.Y, pos.Z);
+
+ if (ParentGroup.RootPart.GetStatusSandbox())
+ {
+ if (Util.GetDistanceTo(ParentGroup.RootPart.StatusSandboxPos, newPos) > 10)
+ {
+ ParentGroup.RootPart.ScriptSetPhysicsStatus(false);
+ newPos = OffsetPosition;
+ ParentGroup.Scene.SimChat(Utils.StringToBytes("Hit Sandbox Limit"),
+ ChatTypeEnum.DebugChannel, 0x7FFFFFFF, ParentGroup.RootPart.AbsolutePosition, Name, UUID, false);
+ }
+ }
+
OffsetPosition = newPos;
ScheduleTerseUpdate();
}
@@ -4094,7 +4348,6 @@ namespace OpenSim.Region.Framework.Scenes
(rot.Z != RotationOffset.Z) ||
(rot.W != RotationOffset.W))
{
- //StoreUndoState();
RotationOffset = rot;
ParentGroup.HasGroupChanged = true;
ScheduleTerseUpdate();
@@ -4396,5 +4649,36 @@ namespace OpenSim.Region.Framework.Scenes
Inventory.ApplyNextOwnerPermissions();
}
+ public void UpdateLookAt()
+ {
+ try
+ {
+ if (APIDTarget != Quaternion.Identity)
+ {
+ if (Single.IsNaN(APIDTarget.W) == true)
+ {
+ APIDTarget = Quaternion.Identity;
+ return;
+ }
+ Quaternion rot = RotationOffset;
+ Quaternion dir = (rot - APIDTarget);
+ float speed = ((APIDStrength / APIDDamp) * (float)(Math.PI / 180.0f));
+ if (dir.Z > speed)
+ {
+ rot.Z -= speed;
+ }
+ if (dir.Z < -speed)
+ {
+ rot.Z += speed;
+ }
+ rot.Normalize();
+ UpdateRotation(rot);
+ }
+ }
+ catch (Exception ex)
+ {
+ m_log.Error("[Physics] " + ex);
+ }
+ }
}
}
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 9c7559b2ec..675fb690fc 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -164,6 +164,8 @@ namespace OpenSim.Region.Framework.Scenes
private Quaternion m_bodyRot= Quaternion.Identity;
+ private Quaternion m_bodyRotPrevious = Quaternion.Identity;
+
private const int LAND_VELOCITYMAG_MAX = 12;
public bool IsRestrictedToRegion;
@@ -508,6 +510,12 @@ namespace OpenSim.Region.Framework.Scenes
set { m_bodyRot = value; }
}
+ public Quaternion PreviousRotation
+ {
+ get { return m_bodyRotPrevious; }
+ set { m_bodyRotPrevious = value; }
+ }
+
///
/// If this is true, agent doesn't have a representation in this scene.
/// this is an agent 'looking into' this scene from a nearby scene(region)
@@ -824,6 +832,31 @@ namespace OpenSim.Region.Framework.Scenes
if (pos.X < 0 || pos.Y < 0 || pos.Z < 0)
{
Vector3 emergencyPos = new Vector3(((int)Constants.RegionSize * 0.5f), ((int)Constants.RegionSize * 0.5f), 128);
+
+ if (pos.X < 0)
+ {
+ emergencyPos.X = (int)Constants.RegionSize + pos.X;
+ if (!(pos.Y < 0))
+ emergencyPos.Y = pos.Y;
+ if (!(pos.Z < 0))
+ emergencyPos.X = pos.X;
+ }
+ if (pos.Y < 0)
+ {
+ emergencyPos.Y = (int)Constants.RegionSize + pos.Y;
+ if (!(pos.X < 0))
+ emergencyPos.X = pos.X;
+ if (!(pos.Z < 0))
+ emergencyPos.Z = pos.Z;
+ }
+ if (pos.Z < 0)
+ {
+ if (!(pos.X < 0))
+ emergencyPos.X = pos.X;
+ if (!(pos.Y < 0))
+ emergencyPos.Y = pos.Y;
+ //Leave as 128
+ }
m_log.WarnFormat(
"[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
}
else
{
+ if (m_pos.X < 0)
+ m_pos.X = 128;
+ if (m_pos.Y < 0)
+ m_pos.Y = 128;
+ if (m_pos.X > Scene.WestBorders[0].BorderLine.X)
+ m_pos.X = 128;
+ if (m_pos.Y > Scene.NorthBorders[0].BorderLine.Y)
+ m_pos.Y = 128;
m_LastFinitePos = m_pos;
}
@@ -2704,36 +2745,72 @@ namespace OpenSim.Region.Framework.Scenes
{
// Checks if where it's headed exists a region
+ bool needsTransit = false;
if (m_scene.TestBorderCross(pos2, Cardinals.W))
{
if (m_scene.TestBorderCross(pos2, Cardinals.S))
+ {
+ needsTransit = true;
neighbor = HaveNeighbor(Cardinals.SW, ref fix);
+ }
else if (m_scene.TestBorderCross(pos2, Cardinals.N))
+ {
+ needsTransit = true;
neighbor = HaveNeighbor(Cardinals.NW, ref fix);
+ }
else
+ {
+ needsTransit = true;
neighbor = HaveNeighbor(Cardinals.W, ref fix);
+ }
}
else if (m_scene.TestBorderCross(pos2, Cardinals.E))
{
if (m_scene.TestBorderCross(pos2, Cardinals.S))
+ {
+ needsTransit = true;
neighbor = HaveNeighbor(Cardinals.SE, ref fix);
+ }
else if (m_scene.TestBorderCross(pos2, Cardinals.N))
+ {
+ needsTransit = true;
neighbor = HaveNeighbor(Cardinals.NE, ref fix);
+ }
else
+ {
+ needsTransit = true;
neighbor = HaveNeighbor(Cardinals.E, ref fix);
+ }
}
else if (m_scene.TestBorderCross(pos2, Cardinals.S))
+ {
+ needsTransit = true;
neighbor = HaveNeighbor(Cardinals.S, ref fix);
+ }
else if (m_scene.TestBorderCross(pos2, Cardinals.N))
+ {
+ needsTransit = true;
neighbor = HaveNeighbor(Cardinals.N, ref fix);
+ }
+
-
// Makes sure avatar does not end up outside region
- if (neighbor < 0)
- AbsolutePosition = new Vector3(
- AbsolutePosition.X + 3*fix[0],
- AbsolutePosition.Y + 3*fix[1],
- AbsolutePosition.Z);
+ if (neighbor <= 0)
+ {
+ if (!needsTransit)
+ {
+ Vector3 pos = AbsolutePosition;
+ if (AbsolutePosition.X < 0)
+ pos.X += Velocity.Y;
+ else if (AbsolutePosition.X > Constants.RegionSize)
+ pos.X -= Velocity.Y;
+ if (AbsolutePosition.Y < 0)
+ pos.Y += Velocity.Y;
+ else if (AbsolutePosition.Y > Constants.RegionSize)
+ pos.Y -= Velocity.Y;
+ AbsolutePosition = pos;
+ }
+ }
else if (neighbor > 0)
CrossToNewRegion();
}
diff --git a/OpenSim/Region/Framework/Scenes/UndoState.cs b/OpenSim/Region/Framework/Scenes/UndoState.cs
index 713ff69d32..55e407ec5f 100644
--- a/OpenSim/Region/Framework/Scenes/UndoState.cs
+++ b/OpenSim/Region/Framework/Scenes/UndoState.cs
@@ -26,6 +26,7 @@
*/
using OpenMetaverse;
+using OpenSim.Region.Framework.Interfaces;
namespace OpenSim.Region.Framework.Scenes
{
@@ -35,29 +36,21 @@ namespace OpenSim.Region.Framework.Scenes
public Vector3 Scale = Vector3.Zero;
public Quaternion Rotation = Quaternion.Identity;
- public UndoState(Vector3 pos, Quaternion rot, Vector3 scale)
- {
- Position = pos;
- Rotation = rot;
- Scale = scale;
- }
-
public UndoState(SceneObjectPart part)
{
if (part != null)
{
if (part.ParentID == 0)
{
- Position = part.AbsolutePosition;
+ Position = part.ParentGroup.AbsolutePosition;
Rotation = part.RotationOffset;
-
+ Scale = part.Shape.Scale;
}
else
{
Position = part.OffsetPosition;
Rotation = part.RotationOffset;
Scale = part.Shape.Scale;
-
}
}
}
@@ -68,7 +61,7 @@ namespace OpenSim.Region.Framework.Scenes
{
if (part.ParentID == 0)
{
- if (Position == part.AbsolutePosition && Rotation == part.RotationOffset)
+ if (Position == part.ParentGroup.AbsolutePosition && Rotation == part.ParentGroup.Rotation)
return true;
else
return false;
@@ -93,24 +86,78 @@ namespace OpenSim.Region.Framework.Scenes
if (part.ParentID == 0)
{
- part.ParentGroup.AbsolutePosition = Position;
- part.UpdateRotation(Rotation);
+ if (Position != Vector3.Zero)
+ part.ParentGroup.AbsolutePosition = Position;
+ part.RotationOffset = Rotation;
+ if (Scale != Vector3.Zero)
+ part.Resize(Scale);
part.ParentGroup.ScheduleGroupForTerseUpdate();
}
else
{
- part.OffsetPosition = Position;
+ if (Position != Vector3.Zero)
+ part.OffsetPosition = Position;
part.UpdateRotation(Rotation);
- part.Resize(Scale);
+ if (Scale != Vector3.Zero)
+ part.Resize(Scale); part.ScheduleTerseUpdate();
+ }
+ part.Undoing = false;
+
+ }
+ }
+ public void PlayfwdState(SceneObjectPart part)
+ {
+ if (part != null)
+ {
+ part.Undoing = true;
+
+ if (part.ParentID == 0)
+ {
+ if (Position != Vector3.Zero)
+ part.ParentGroup.AbsolutePosition = Position;
+ if (Rotation != Quaternion.Identity)
+ part.UpdateRotation(Rotation);
+ if (Scale != Vector3.Zero)
+ part.Resize(Scale);
+ part.ParentGroup.ScheduleGroupForTerseUpdate();
+ }
+ else
+ {
+ if (Position != Vector3.Zero)
+ part.OffsetPosition = Position;
+ if (Rotation != Quaternion.Identity)
+ part.UpdateRotation(Rotation);
+ if (Scale != Vector3.Zero)
+ part.Resize(Scale);
part.ScheduleTerseUpdate();
}
part.Undoing = false;
}
}
+ }
+ public class LandUndoState
+ {
+ public ITerrainModule m_terrainModule;
+ public ITerrainChannel m_terrainChannel;
- public UndoState()
+ public LandUndoState(ITerrainModule terrainModule, ITerrainChannel terrainChannel)
{
+ m_terrainModule = terrainModule;
+ m_terrainChannel = terrainChannel;
+ }
+
+ public bool Compare(ITerrainChannel terrainChannel)
+ {
+ if (m_terrainChannel != terrainChannel)
+ return false;
+ else
+ return false;
+ }
+
+ public void PlaybackState()
+ {
+ m_terrainModule.UndoTerrain(m_terrainChannel);
}
}
}
diff --git a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs
index b421623fb7..009dd37ad3 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
public event UUIDNameRequest OnTeleportHomeRequest;
public event ScriptAnswer OnScriptAnswer;
public event AgentSit OnUndo;
+ public event AgentSit OnRedo;
+ public event LandUndo OnLandUndo;
public event ForceReleaseControls OnForceReleaseControls;
public event GodLandStatRequest OnLandStatRequest;
public event DetailedEstateDataRequest OnDetailedEstateDataRequest;
diff --git a/OpenSim/Region/OptionalModules/Scripting/Minimodule/SOPObject.cs b/OpenSim/Region/OptionalModules/Scripting/Minimodule/SOPObject.cs
index 31f28e0355..5bfe4bedce 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
if (!CanEdit())
return;
- GetSOP().SendSound(asset.ToString(), volume, true, 0);
+ GetSOP().SendSound(asset.ToString(), volume, true, 0, 0, false, false);
}
#endregion
diff --git a/OpenSim/Region/OptionalModules/Scripting/Minimodule/World.cs b/OpenSim/Region/OptionalModules/Scripting/Minimodule/World.cs
index c7cd37b2df..45bb005903 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
if (soundModule != null)
{
soundModule.TriggerSound(audio, UUID.Zero, UUID.Zero, UUID.Zero, volume, position,
- m_internalScene.RegionInfo.RegionHandle);
+ m_internalScene.RegionInfo.RegionHandle, 0);
}
}
@@ -241,7 +241,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
if (soundModule != null)
{
soundModule.TriggerSound(audio, UUID.Zero, UUID.Zero, UUID.Zero, 1.0, position,
- m_internalScene.RegionInfo.RegionHandle);
+ m_internalScene.RegionInfo.RegionHandle, 0);
}
}
diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs
index 1d15552993..b331001a84 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
public event ObjectBuy OnObjectBuy;
public event BuyObjectInventory OnBuyObjectInventory;
public event AgentSit OnUndo;
+ public event AgentSit OnRedo;
+ public event LandUndo OnLandUndo;
public event ForceReleaseControls OnForceReleaseControls;
public event GodLandStatRequest OnLandStatRequest;
diff --git a/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsActor.cs b/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsActor.cs
index 31366db75b..5e2eeebc44 100644
--- a/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsActor.cs
+++ b/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsActor.cs
@@ -185,6 +185,11 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin
}
+ public override void VehicleFlags(int param, bool remove)
+ {
+
+ }
+
public override void SetVolumeDetect(int param)
{
diff --git a/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETCharacter.cs b/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETCharacter.cs
index 97eb6a2e5e..6a54705cb1 100644
--- a/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETCharacter.cs
+++ b/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETCharacter.cs
@@ -362,6 +362,11 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin
}
+ public override void VehicleFlags(int param, bool remove)
+ {
+
+ }
+
public override void SetVolumeDetect(int param)
{
diff --git a/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETPrim.cs b/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETPrim.cs
index 9603ea4571..920ed96ee7 100644
--- a/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETPrim.cs
+++ b/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETPrim.cs
@@ -397,6 +397,11 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin
//TODO:
}
+ public override void VehicleFlags(int param, bool remove)
+ {
+
+ }
+
public override void SetVolumeDetect(int param)
{
//TODO: GhostObject
diff --git a/OpenSim/Region/Physics/BulletXPlugin/BulletXPlugin.cs b/OpenSim/Region/Physics/BulletXPlugin/BulletXPlugin.cs
index d5d146e11a..e2a6a2ed11 100644
--- a/OpenSim/Region/Physics/BulletXPlugin/BulletXPlugin.cs
+++ b/OpenSim/Region/Physics/BulletXPlugin/BulletXPlugin.cs
@@ -500,6 +500,18 @@ namespace OpenSim.Region.Physics.BulletXPlugin
public BulletXScene(String sceneIdentifier)
{
//identifier = sceneIdentifier;
+ cDispatcher = new CollisionDispatcherLocal(this);
+ Vector3 worldMinDim = new Vector3((float)minXY, (float)minXY, (float)minZ);
+ Vector3 worldMaxDim = new Vector3((float)maxXY, (float)maxXY, (float)maxZ);
+ opCache = new AxisSweep3(worldMinDim, worldMaxDim, maxHandles);
+ sicSolver = new SequentialImpulseConstraintSolver();
+
+ lock (BulletXLock)
+ {
+ ddWorld = new DiscreteDynamicsWorld(cDispatcher, opCache, sicSolver);
+ ddWorld.Gravity = new Vector3(0, 0, -gravity);
+ }
+ //this._heightmap = new float[65536];
}
public static float Gravity
@@ -582,12 +594,12 @@ namespace OpenSim.Region.Physics.BulletXPlugin
pos.Y = position.Y;
pos.Z = position.Z + 20;
BulletXCharacter newAv = null;
- newAv.Flying = isFlying;
lock (BulletXLock)
{
newAv = new BulletXCharacter(avName, this, pos);
_characters.Add(newAv.RigidBody, newAv);
}
+ newAv.Flying = isFlying;
return newAv;
}
@@ -983,6 +995,11 @@ namespace OpenSim.Region.Physics.BulletXPlugin
public override void VehicleRotationParam(int param, OpenMetaverse.Quaternion rotation)
{
+ }
+
+ public override void VehicleFlags(int param, bool remove)
+ {
+
}
public override void SetVolumeDetect(int param)
diff --git a/OpenSim/Region/Physics/Manager/PhysicsActor.cs b/OpenSim/Region/Physics/Manager/PhysicsActor.cs
index 9c192ede80..880c3ea3cb 100644
--- a/OpenSim/Region/Physics/Manager/PhysicsActor.cs
+++ b/OpenSim/Region/Physics/Manager/PhysicsActor.cs
@@ -208,6 +208,7 @@ namespace OpenSim.Region.Physics.Manager
public abstract void VehicleFloatParam(int param, float value);
public abstract void VehicleVectorParam(int param, Vector3 value);
public abstract void VehicleRotationParam(int param, Quaternion rotation);
+ public abstract void VehicleFlags(int param, bool remove);
public abstract void SetVolumeDetect(int param); // Allows the detection of collisions with inherently non-physical prims. see llVolumeDetect for more
@@ -352,6 +353,11 @@ namespace OpenSim.Region.Physics.Manager
}
+ public override void VehicleFlags(int param, bool remove)
+ {
+
+ }
+
public override void SetVolumeDetect(int param)
{
diff --git a/OpenSim/Region/Physics/Manager/VehicleConstants.cs b/OpenSim/Region/Physics/Manager/VehicleConstants.cs
index 532e55e5fc..f0775c1a8e 100644
--- a/OpenSim/Region/Physics/Manager/VehicleConstants.cs
+++ b/OpenSim/Region/Physics/Manager/VehicleConstants.cs
@@ -91,7 +91,9 @@ namespace OpenSim.Region.Physics.Manager
BANKING_EFFICIENCY = 38,
BANKING_MIX = 39,
BANKING_TIMESCALE = 40,
- REFERENCE_FRAME = 44
+ REFERENCE_FRAME = 44,
+ BLOCK_EXIT = 45,
+ ROLL_FRAME = 46
}
@@ -107,7 +109,13 @@ namespace OpenSim.Region.Physics.Manager
LIMIT_MOTOR_UP = 64,
MOUSELOOK_STEER = 128,
MOUSELOOK_BANK = 256,
- CAMERA_DECOUPLED = 512
+ CAMERA_DECOUPLED = 512,
+ NO_X = 1024,
+ NO_Y = 2048,
+ NO_Z = 4096,
+ LOCK_HOVER_HEIGHT = 8192,
+ NO_DEFLECTION = 16392,
+ LOCK_ROTATION = 32784
}
}
diff --git a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs
index 06ed8fb20d..a2229e8aa5 100644
--- a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs
+++ b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs
@@ -734,6 +734,11 @@ namespace OpenSim.Region.Physics.OdePlugin
}
+ public override void VehicleFlags(int param, bool remove)
+ {
+
+ }
+
public override void SetVolumeDetect(int param)
{
diff --git a/OpenSim/Region/Physics/OdePlugin/ODEDynamics.cs b/OpenSim/Region/Physics/OdePlugin/ODEDynamics.cs
index 008070b687..6ae0c8a53e 100644
--- a/OpenSim/Region/Physics/OdePlugin/ODEDynamics.cs
+++ b/OpenSim/Region/Physics/OdePlugin/ODEDynamics.cs
@@ -82,7 +82,9 @@ namespace OpenSim.Region.Physics.OdePlugin
// HOVER_UP_ONLY
// LIMIT_MOTOR_UP
// LIMIT_ROLL_ONLY
-
+ private VehicleFlag m_Hoverflags = (VehicleFlag)0;
+ private Vector3 m_BlockingEndPoint = Vector3.Zero;
+ private Quaternion m_RollreferenceFrame = Quaternion.Identity;
// Linear properties
private Vector3 m_linearMotorDirection = Vector3.Zero; // velocity requested by LSL, decayed by time
private Vector3 m_linearMotorDirectionLASTSET = Vector3.Zero; // velocity requested by LSL
@@ -91,6 +93,7 @@ namespace OpenSim.Region.Physics.OdePlugin
private float m_linearMotorDecayTimescale = 0;
private float m_linearMotorTimescale = 0;
private Vector3 m_lastLinearVelocityVector = Vector3.Zero;
+ private d.Vector3 m_lastPositionVector = new d.Vector3();
// private bool m_LinearMotorSetLastFrame = false;
// private Vector3 m_linearMotorOffset = Vector3.Zero;
@@ -255,6 +258,9 @@ namespace OpenSim.Region.Physics.OdePlugin
case Vehicle.LINEAR_MOTOR_OFFSET:
// m_linearMotorOffset = new Vector3(pValue.X, pValue.Y, pValue.Z);
break;
+ case Vehicle.BLOCK_EXIT:
+ m_BlockingEndPoint = new Vector3(pValue.X, pValue.Y, pValue.Z);
+ break;
}
}//end ProcessVectorVehicleParam
@@ -265,15 +271,189 @@ namespace OpenSim.Region.Physics.OdePlugin
case Vehicle.REFERENCE_FRAME:
// m_referenceFrame = pValue;
break;
+ case Vehicle.ROLL_FRAME:
+ m_RollreferenceFrame = pValue;
+ break;
}
}//end ProcessRotationVehicleParam
+ internal void ProcessVehicleFlags(int pParam, bool remove)
+ {
+ if (remove)
+ {
+ if (pParam == -1)
+ {
+ m_flags = (VehicleFlag)0;
+ m_Hoverflags = (VehicleFlag)0;
+ return;
+ }
+ if ((pParam & (int)VehicleFlag.HOVER_GLOBAL_HEIGHT) == (int)VehicleFlag.HOVER_GLOBAL_HEIGHT)
+ {
+ if ((m_Hoverflags & VehicleFlag.HOVER_GLOBAL_HEIGHT) != (VehicleFlag)0)
+ m_Hoverflags &= ~(VehicleFlag.HOVER_GLOBAL_HEIGHT);
+ }
+ if ((pParam & (int)VehicleFlag.HOVER_TERRAIN_ONLY) == (int)VehicleFlag.HOVER_TERRAIN_ONLY)
+ {
+ if ((m_Hoverflags & VehicleFlag.HOVER_TERRAIN_ONLY) != (VehicleFlag)0)
+ m_Hoverflags &= ~(VehicleFlag.HOVER_TERRAIN_ONLY);
+ }
+ if ((pParam & (int)VehicleFlag.HOVER_UP_ONLY) == (int)VehicleFlag.HOVER_UP_ONLY)
+ {
+ if ((m_Hoverflags & VehicleFlag.HOVER_UP_ONLY) != (VehicleFlag)0)
+ m_Hoverflags &= ~(VehicleFlag.HOVER_UP_ONLY);
+ }
+ if ((pParam & (int)VehicleFlag.HOVER_WATER_ONLY) == (int)VehicleFlag.HOVER_WATER_ONLY)
+ {
+ if ((m_Hoverflags & VehicleFlag.HOVER_WATER_ONLY) != (VehicleFlag)0)
+ m_Hoverflags &= ~(VehicleFlag.HOVER_WATER_ONLY);
+ }
+ if ((pParam & (int)VehicleFlag.LIMIT_MOTOR_UP) == (int)VehicleFlag.LIMIT_MOTOR_UP)
+ {
+ if ((m_flags & VehicleFlag.LIMIT_MOTOR_UP) != (VehicleFlag)0)
+ m_flags &= ~(VehicleFlag.LIMIT_MOTOR_UP);
+ }
+ if ((pParam & (int)VehicleFlag.LIMIT_ROLL_ONLY) == (int)VehicleFlag.LIMIT_ROLL_ONLY)
+ {
+ if ((m_flags & VehicleFlag.LIMIT_ROLL_ONLY) != (VehicleFlag)0)
+ m_flags &= ~(VehicleFlag.LIMIT_ROLL_ONLY);
+ }
+ if ((pParam & (int)VehicleFlag.MOUSELOOK_BANK) == (int)VehicleFlag.MOUSELOOK_BANK)
+ {
+ if ((m_flags & VehicleFlag.MOUSELOOK_BANK) != (VehicleFlag)0)
+ m_flags &= ~(VehicleFlag.MOUSELOOK_BANK);
+ }
+ if ((pParam & (int)VehicleFlag.MOUSELOOK_STEER) == (int)VehicleFlag.MOUSELOOK_STEER)
+ {
+ if ((m_flags & VehicleFlag.MOUSELOOK_STEER) != (VehicleFlag)0)
+ m_flags &= ~(VehicleFlag.MOUSELOOK_STEER);
+ }
+ if ((pParam & (int)VehicleFlag.NO_DEFLECTION_UP) == (int)VehicleFlag.NO_DEFLECTION_UP)
+ {
+ if ((m_flags & VehicleFlag.NO_DEFLECTION_UP) != (VehicleFlag)0)
+ m_flags &= ~(VehicleFlag.NO_DEFLECTION_UP);
+ }
+ if ((pParam & (int)VehicleFlag.CAMERA_DECOUPLED) == (int)VehicleFlag.CAMERA_DECOUPLED)
+ {
+ if ((m_flags & VehicleFlag.CAMERA_DECOUPLED) != (VehicleFlag)0)
+ m_flags &= ~(VehicleFlag.CAMERA_DECOUPLED);
+ }
+ if ((pParam & (int)VehicleFlag.NO_X) == (int)VehicleFlag.NO_X)
+ {
+ if ((m_flags & VehicleFlag.NO_X) != (VehicleFlag)0)
+ m_flags &= ~(VehicleFlag.NO_X);
+ }
+ if ((pParam & (int)VehicleFlag.NO_Y) == (int)VehicleFlag.NO_Y)
+ {
+ if ((m_flags & VehicleFlag.NO_Y) != (VehicleFlag)0)
+ m_flags &= ~(VehicleFlag.NO_Y);
+ }
+ if ((pParam & (int)VehicleFlag.NO_Z) == (int)VehicleFlag.NO_Z)
+ {
+ if ((m_flags & VehicleFlag.NO_Z) != (VehicleFlag)0)
+ m_flags &= ~(VehicleFlag.NO_Z);
+ }
+ if ((pParam & (int)VehicleFlag.LOCK_HOVER_HEIGHT) == (int)VehicleFlag.LOCK_HOVER_HEIGHT)
+ {
+ if ((m_Hoverflags & VehicleFlag.LOCK_HOVER_HEIGHT) != (VehicleFlag)0)
+ m_Hoverflags &= ~(VehicleFlag.LOCK_HOVER_HEIGHT);
+ }
+ if ((pParam & (int)VehicleFlag.NO_DEFLECTION) == (int)VehicleFlag.NO_DEFLECTION)
+ {
+ if ((m_flags & VehicleFlag.NO_DEFLECTION) != (VehicleFlag)0)
+ m_flags &= ~(VehicleFlag.NO_DEFLECTION);
+ }
+ if ((pParam & (int)VehicleFlag.LOCK_ROTATION) == (int)VehicleFlag.LOCK_ROTATION)
+ {
+ if ((m_flags & VehicleFlag.LOCK_ROTATION) != (VehicleFlag)0)
+ m_flags &= ~(VehicleFlag.LOCK_ROTATION);
+ }
+ }
+ else
+ {
+ if ((pParam & (int)VehicleFlag.HOVER_GLOBAL_HEIGHT) == (int)VehicleFlag.HOVER_GLOBAL_HEIGHT)
+ {
+ m_Hoverflags |= (VehicleFlag.HOVER_GLOBAL_HEIGHT | m_flags);
+ }
+ if ((pParam & (int)VehicleFlag.HOVER_TERRAIN_ONLY) == (int)VehicleFlag.HOVER_TERRAIN_ONLY)
+ {
+ m_Hoverflags |= (VehicleFlag.HOVER_TERRAIN_ONLY | m_flags);
+ }
+ if ((pParam & (int)VehicleFlag.HOVER_UP_ONLY) == (int)VehicleFlag.HOVER_UP_ONLY)
+ {
+ m_Hoverflags |= (VehicleFlag.HOVER_UP_ONLY | m_flags);
+ }
+ if ((pParam & (int)VehicleFlag.HOVER_WATER_ONLY) == (int)VehicleFlag.HOVER_WATER_ONLY)
+ {
+ m_Hoverflags |= (VehicleFlag.HOVER_WATER_ONLY | m_flags);
+ }
+ if ((pParam & (int)VehicleFlag.LIMIT_MOTOR_UP) == (int)VehicleFlag.LIMIT_MOTOR_UP)
+ {
+ m_flags |= (VehicleFlag.LIMIT_MOTOR_UP | m_flags);
+ }
+ if ((pParam & (int)VehicleFlag.MOUSELOOK_BANK) == (int)VehicleFlag.MOUSELOOK_BANK)
+ {
+ m_flags |= (VehicleFlag.MOUSELOOK_BANK | m_flags);
+ }
+ if ((pParam & (int)VehicleFlag.MOUSELOOK_STEER) == (int)VehicleFlag.MOUSELOOK_STEER)
+ {
+ m_flags |= (VehicleFlag.MOUSELOOK_STEER | m_flags);
+ }
+ if ((pParam & (int)VehicleFlag.NO_DEFLECTION_UP) == (int)VehicleFlag.NO_DEFLECTION_UP)
+ {
+ m_flags |= (VehicleFlag.NO_DEFLECTION_UP | m_flags);
+ }
+ if ((pParam & (int)VehicleFlag.CAMERA_DECOUPLED) == (int)VehicleFlag.CAMERA_DECOUPLED)
+ {
+ m_flags |= (VehicleFlag.CAMERA_DECOUPLED | m_flags);
+ }
+ if ((pParam & (int)VehicleFlag.NO_X) == (int)VehicleFlag.NO_X)
+ {
+ m_flags |= (VehicleFlag.NO_X);
+ }
+ if ((pParam & (int)VehicleFlag.NO_Y) == (int)VehicleFlag.NO_Y)
+ {
+ m_flags |= (VehicleFlag.NO_Y);
+ }
+ if ((pParam & (int)VehicleFlag.NO_Z) == (int)VehicleFlag.NO_Z)
+ {
+ m_flags |= (VehicleFlag.NO_Z);
+ }
+ if ((pParam & (int)VehicleFlag.LOCK_HOVER_HEIGHT) == (int)VehicleFlag.LOCK_HOVER_HEIGHT)
+ {
+ m_Hoverflags |= (VehicleFlag.LOCK_HOVER_HEIGHT);
+ }
+ if ((pParam & (int)VehicleFlag.NO_DEFLECTION) == (int)VehicleFlag.NO_DEFLECTION)
+ {
+ m_flags |= (VehicleFlag.NO_DEFLECTION);
+ }
+ if ((pParam & (int)VehicleFlag.LOCK_ROTATION) == (int)VehicleFlag.LOCK_ROTATION)
+ {
+ m_flags |= (VehicleFlag.LOCK_ROTATION);
+ }
+ }
+ }//end ProcessVehicleFlags
+
internal void ProcessTypeChange(Vehicle pType)
{
// Set Defaults For Type
m_type = pType;
switch (pType)
{
+ case Vehicle.TYPE_NONE:
+ m_linearFrictionTimescale = new Vector3(0, 0, 0);
+ m_angularFrictionTimescale = new Vector3(0, 0, 0);
+ m_linearMotorDirection = Vector3.Zero;
+ m_linearMotorTimescale = 0;
+ m_linearMotorDecayTimescale = 0;
+ m_angularMotorDirection = Vector3.Zero;
+ m_angularMotorTimescale = 0;
+ m_angularMotorDecayTimescale = 0;
+ m_VhoverHeight = 0;
+ m_VhoverTimescale = 0;
+ m_VehicleBuoyancy = 0;
+ m_flags = (VehicleFlag)0;
+ break;
+
case Vehicle.TYPE_SLED:
m_linearFrictionTimescale = new Vector3(30, 1, 1000);
m_angularFrictionTimescale = new Vector3(1000, 1000, 1000);
@@ -295,9 +475,9 @@ namespace OpenSim.Region.Physics.OdePlugin
// m_bankingMix = 1;
// m_bankingTimescale = 10;
// m_referenceFrame = Quaternion.Identity;
- m_flags &=
- ~(VehicleFlag.HOVER_WATER_ONLY | VehicleFlag.HOVER_TERRAIN_ONLY |
- VehicleFlag.HOVER_GLOBAL_HEIGHT | VehicleFlag.HOVER_UP_ONLY);
+ m_Hoverflags &=
+ ~(VehicleFlag.HOVER_WATER_ONLY | VehicleFlag.HOVER_TERRAIN_ONLY |
+ VehicleFlag.HOVER_GLOBAL_HEIGHT | VehicleFlag.HOVER_UP_ONLY);
m_flags |= (VehicleFlag.NO_DEFLECTION_UP | VehicleFlag.LIMIT_ROLL_ONLY | VehicleFlag.LIMIT_MOTOR_UP);
break;
case Vehicle.TYPE_CAR:
@@ -323,9 +503,10 @@ namespace OpenSim.Region.Physics.OdePlugin
// m_bankingMix = 1;
// m_bankingTimescale = 1;
// m_referenceFrame = Quaternion.Identity;
- m_flags &= ~(VehicleFlag.HOVER_WATER_ONLY | VehicleFlag.HOVER_TERRAIN_ONLY | VehicleFlag.HOVER_GLOBAL_HEIGHT);
- m_flags |= (VehicleFlag.NO_DEFLECTION_UP | VehicleFlag.LIMIT_ROLL_ONLY | VehicleFlag.HOVER_UP_ONLY |
+ m_Hoverflags &= ~(VehicleFlag.HOVER_WATER_ONLY | VehicleFlag.HOVER_TERRAIN_ONLY | VehicleFlag.HOVER_GLOBAL_HEIGHT);
+ m_flags |= (VehicleFlag.NO_DEFLECTION_UP | VehicleFlag.LIMIT_ROLL_ONLY |
VehicleFlag.LIMIT_MOTOR_UP);
+ m_Hoverflags |= (VehicleFlag.HOVER_UP_ONLY);
break;
case Vehicle.TYPE_BOAT:
m_linearFrictionTimescale = new Vector3(10, 3, 2);
@@ -350,10 +531,12 @@ namespace OpenSim.Region.Physics.OdePlugin
// m_bankingMix = 0.8f;
// m_bankingTimescale = 1;
// m_referenceFrame = Quaternion.Identity;
- m_flags &= ~(VehicleFlag.HOVER_TERRAIN_ONLY | VehicleFlag.LIMIT_ROLL_ONLY |
+ m_Hoverflags &= ~(VehicleFlag.HOVER_TERRAIN_ONLY |
VehicleFlag.HOVER_GLOBAL_HEIGHT | VehicleFlag.HOVER_UP_ONLY);
- m_flags |= (VehicleFlag.NO_DEFLECTION_UP | VehicleFlag.HOVER_WATER_ONLY |
+ m_flags &= ~(VehicleFlag.LIMIT_ROLL_ONLY);
+ m_flags |= (VehicleFlag.NO_DEFLECTION_UP |
VehicleFlag.LIMIT_MOTOR_UP);
+ m_Hoverflags |= (VehicleFlag.HOVER_WATER_ONLY);
break;
case Vehicle.TYPE_AIRPLANE:
m_linearFrictionTimescale = new Vector3(200, 10, 5);
@@ -378,8 +561,9 @@ namespace OpenSim.Region.Physics.OdePlugin
// m_bankingMix = 0.7f;
// m_bankingTimescale = 2;
// m_referenceFrame = Quaternion.Identity;
- m_flags &= ~(VehicleFlag.NO_DEFLECTION_UP | VehicleFlag.HOVER_WATER_ONLY | VehicleFlag.HOVER_TERRAIN_ONLY |
- VehicleFlag.HOVER_GLOBAL_HEIGHT | VehicleFlag.HOVER_UP_ONLY | VehicleFlag.LIMIT_MOTOR_UP);
+ m_Hoverflags &= ~(VehicleFlag.HOVER_WATER_ONLY | VehicleFlag.HOVER_TERRAIN_ONLY |
+ VehicleFlag.HOVER_GLOBAL_HEIGHT | VehicleFlag.HOVER_UP_ONLY);
+ m_flags &= ~(VehicleFlag.NO_DEFLECTION_UP | VehicleFlag.LIMIT_MOTOR_UP);
m_flags |= (VehicleFlag.LIMIT_ROLL_ONLY);
break;
case Vehicle.TYPE_BALLOON:
@@ -405,9 +589,11 @@ namespace OpenSim.Region.Physics.OdePlugin
// m_bankingMix = 0.7f;
// m_bankingTimescale = 5;
// m_referenceFrame = Quaternion.Identity;
- m_flags &= ~(VehicleFlag.NO_DEFLECTION_UP | VehicleFlag.HOVER_WATER_ONLY | VehicleFlag.HOVER_TERRAIN_ONLY |
- VehicleFlag.HOVER_UP_ONLY | VehicleFlag.LIMIT_MOTOR_UP);
- m_flags |= (VehicleFlag.LIMIT_ROLL_ONLY | VehicleFlag.HOVER_GLOBAL_HEIGHT);
+ m_Hoverflags &= ~(VehicleFlag.HOVER_WATER_ONLY | VehicleFlag.HOVER_TERRAIN_ONLY |
+ VehicleFlag.HOVER_UP_ONLY);
+ m_flags &= ~(VehicleFlag.NO_DEFLECTION_UP | VehicleFlag.LIMIT_MOTOR_UP);
+ m_flags |= (VehicleFlag.LIMIT_ROLL_ONLY);
+ m_Hoverflags |= (VehicleFlag.HOVER_GLOBAL_HEIGHT);
break;
}
@@ -431,6 +617,7 @@ namespace OpenSim.Region.Physics.OdePlugin
MoveLinear(pTimestep, pParentScene);
MoveAngular(pTimestep);
+ LimitRotation(pTimestep);
}// end Step
private void MoveLinear(float pTimestep, OdeScene _pParentScene)
@@ -477,61 +664,152 @@ namespace OpenSim.Region.Physics.OdePlugin
// .Z velocity and gravity. Therefore only 0g will used script-requested
// .Z velocity. >0g (m_VehicleBuoyancy < 1) will used modified gravity only.
Vector3 grav = Vector3.Zero;
- if (m_VehicleBuoyancy < 1.0f)
+ // There is some gravity, make a gravity force vector
+ // that is applied after object velocity.
+ d.Mass objMass;
+ d.BodyGetMass(Body, out objMass);
+ // m_VehicleBuoyancy: -1=2g; 0=1g; 1=0g;
+ grav.Z = _pParentScene.gravityz * objMass.mass * (1f - m_VehicleBuoyancy);
+ // Preserve the current Z velocity
+ d.Vector3 vel_now = d.BodyGetLinearVel(Body);
+ m_dir.Z = vel_now.Z; // Preserve the accumulated falling velocity
+
+ d.Vector3 pos = d.BodyGetPosition(Body);
+ 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);
+ Vector3 posChange = new Vector3();
+ posChange.X = pos.X - m_lastPositionVector.X;
+ posChange.Y = pos.Y - m_lastPositionVector.Y;
+ posChange.Z = pos.Z - m_lastPositionVector.Z;
+ double Zchange = Math.Abs(posChange.Z);
+ if (m_BlockingEndPoint != Vector3.Zero)
{
- // There is some gravity, make a gravity force vector
- // that is applied after object velocity.
- d.Mass objMass;
- d.BodyGetMass(Body, out objMass);
- // m_VehicleBuoyancy: -1=2g; 0=1g; 1=0g;
- grav.Z = _pParentScene.gravityz * objMass.mass * (1f - m_VehicleBuoyancy);
- // Preserve the current Z velocity
- d.Vector3 vel_now = d.BodyGetLinearVel(Body);
- m_dir.Z = vel_now.Z; // Preserve the accumulated falling velocity
- } // else its 1.0, no gravity.
+ if (pos.X >= (m_BlockingEndPoint.X - (float)1))
+ {
+ pos.X -= posChange.X + 1;
+ d.BodySetPosition(Body, pos.X, pos.Y, pos.Z);
+ }
+ if (pos.Y >= (m_BlockingEndPoint.Y - (float)1))
+ {
+ pos.Y -= posChange.Y + 1;
+ d.BodySetPosition(Body, pos.X, pos.Y, pos.Z);
+ }
+ if (pos.Z >= (m_BlockingEndPoint.Z - (float)1))
+ {
+ pos.Z -= posChange.Z + 1;
+ d.BodySetPosition(Body, pos.X, pos.Y, pos.Z);
+ }
+ if (pos.X <= 0)
+ {
+ pos.X += posChange.X + 1;
+ d.BodySetPosition(Body, pos.X, pos.Y, pos.Z);
+ }
+ if (pos.Y <= 0)
+ {
+ pos.Y += posChange.Y + 1;
+ d.BodySetPosition(Body, pos.X, pos.Y, pos.Z);
+ }
+ }
+ if (pos.Z < _pParentScene.GetTerrainHeightAtXY(pos.X, pos.Y))
+ {
+ pos.Z = _pParentScene.GetTerrainHeightAtXY(pos.X, pos.Y) + 2;
+ d.BodySetPosition(Body, pos.X, pos.Y, pos.Z);
+ }
// Check if hovering
- if ((m_flags & (VehicleFlag.HOVER_WATER_ONLY | VehicleFlag.HOVER_TERRAIN_ONLY | VehicleFlag.HOVER_GLOBAL_HEIGHT)) != 0)
+ if ((m_Hoverflags & (VehicleFlag.HOVER_WATER_ONLY | VehicleFlag.HOVER_TERRAIN_ONLY | VehicleFlag.HOVER_GLOBAL_HEIGHT)) != 0)
{
// We should hover, get the target height
- d.Vector3 pos = d.BodyGetPosition(Body);
- if ((m_flags & VehicleFlag.HOVER_WATER_ONLY) == VehicleFlag.HOVER_WATER_ONLY)
+ if ((m_Hoverflags & VehicleFlag.HOVER_WATER_ONLY) != 0)
{
m_VhoverTargetHeight = _pParentScene.GetWaterLevel() + m_VhoverHeight;
}
- else if ((m_flags & VehicleFlag.HOVER_TERRAIN_ONLY) == VehicleFlag.HOVER_TERRAIN_ONLY)
+ if ((m_Hoverflags & VehicleFlag.HOVER_TERRAIN_ONLY) != 0)
{
m_VhoverTargetHeight = _pParentScene.GetTerrainHeightAtXY(pos.X, pos.Y) + m_VhoverHeight;
}
- else if ((m_flags & VehicleFlag.HOVER_GLOBAL_HEIGHT) == VehicleFlag.HOVER_GLOBAL_HEIGHT)
+ if ((m_Hoverflags & VehicleFlag.HOVER_GLOBAL_HEIGHT) != 0)
{
m_VhoverTargetHeight = m_VhoverHeight;
}
- if ((m_flags & VehicleFlag.HOVER_UP_ONLY) == VehicleFlag.HOVER_UP_ONLY)
+ if ((m_Hoverflags & VehicleFlag.HOVER_UP_ONLY) != 0)
{
// If body is aready heigher, use its height as target height
if (pos.Z > m_VhoverTargetHeight) m_VhoverTargetHeight = pos.Z;
}
+ if ((m_Hoverflags & VehicleFlag.LOCK_HOVER_HEIGHT) != 0)
+ {
+ if ((pos.Z - m_VhoverTargetHeight) > .2 || (pos.Z - m_VhoverTargetHeight) < -.2)
+ {
+ d.BodySetPosition(Body, pos.X, pos.Y, m_VhoverTargetHeight);
+ }
+ }
+ else
+ {
+ float herr0 = pos.Z - m_VhoverTargetHeight;
+ // Replace Vertical speed with correction figure if significant
+ if (Math.Abs(herr0) > 0.01f)
+ {
+ m_dir.Z = -((herr0 * pTimestep * 50.0f) / m_VhoverTimescale);
+ //KF: m_VhoverEfficiency is not yet implemented
+ }
+ else
+ {
+ m_dir.Z = 0f;
+ }
+ }
// m_VhoverEfficiency = 0f; // 0=boucy, 1=Crit.damped
// m_VhoverTimescale = 0f; // time to acheive height
// pTimestep is time since last frame,in secs
- float herr0 = pos.Z - m_VhoverTargetHeight;
- // Replace Vertical speed with correction figure if significant
- if (Math.Abs(herr0) > 0.01f)
- {
- d.Mass objMass;
- d.BodyGetMass(Body, out objMass);
- m_dir.Z = - ((herr0 * pTimestep * 50.0f) / m_VhoverTimescale);
- //KF: m_VhoverEfficiency is not yet implemented
- }
- else
- {
- m_dir.Z = 0f;
- }
}
+ if ((m_flags & (VehicleFlag.LIMIT_MOTOR_UP)) != 0)
+ {
+ //Start Experimental Values
+ if (Zchange > .3)
+ {
+ grav.Z = (float)(grav.Z * 3);
+ }
+ if (Zchange > .15)
+ {
+ grav.Z = (float)(grav.Z * 2);
+ }
+ if (Zchange > .75)
+ {
+ grav.Z = (float)(grav.Z * 1.5);
+ }
+ if (Zchange > .05)
+ {
+ grav.Z = (float)(grav.Z * 1.25);
+ }
+ if (Zchange > .025)
+ {
+ grav.Z = (float)(grav.Z * 1.125);
+ }
+ float terraintemp = _pParentScene.GetTerrainHeightAtXY(pos.X, pos.Y);
+ float postemp = (pos.Z - terraintemp);
+ if (postemp > 2.5f)
+ {
+ grav.Z = (float)(grav.Z * 1.037125);
+ }
+ //End Experimental Values
+ }
+ if ((m_flags & (VehicleFlag.NO_X)) != 0)
+ {
+ m_dir.X = 0;
+ }
+ if ((m_flags & (VehicleFlag.NO_Y)) != 0)
+ {
+ m_dir.Y = 0;
+ }
+ if ((m_flags & (VehicleFlag.NO_Z)) != 0)
+ {
+ m_dir.Z = 0;
+ }
+
+ m_lastPositionVector = d.BodyGetPosition(Body);
+
// Apply velocity
d.BodySetLinearVel(Body, m_dir.X, m_dir.Y, m_dir.Z);
// apply gravity force
@@ -629,6 +907,12 @@ namespace OpenSim.Region.Physics.OdePlugin
// Sum velocities
m_lastAngularVelocity = m_angularMotorVelocity + vertattr; // + bank + deflection
+
+ if ((m_flags & (VehicleFlag.NO_DEFLECTION_UP)) != 0)
+ {
+ m_lastAngularVelocity.X = 0;
+ m_lastAngularVelocity.Y = 0;
+ }
if (!m_lastAngularVelocity.ApproxEquals(Vector3.Zero, 0.01f))
{
@@ -647,5 +931,44 @@ namespace OpenSim.Region.Physics.OdePlugin
d.BodySetAngularVel (Body, m_lastAngularVelocity.X, m_lastAngularVelocity.Y, m_lastAngularVelocity.Z);
} //end MoveAngular
+ internal void LimitRotation(float timestep)
+ {
+ d.Quaternion rot = d.BodyGetQuaternion(Body);
+ Quaternion rotq = new Quaternion(rot.X, rot.Y, rot.Z, rot.W); // rotq = rotation of object
+ d.Quaternion m_rot = new d.Quaternion();
+ bool changed = false;
+ m_rot.X = rotq.X;
+ m_rot.Y = rotq.Y;
+ m_rot.Z = rotq.Z;
+ m_rot.W = rotq.W;
+ if (m_RollreferenceFrame != Quaternion.Identity)
+ {
+ if (rotq.X >= m_RollreferenceFrame.X)
+ {
+ m_rot.X = rotq.X - (m_RollreferenceFrame.X / 2);
+ }
+ if (rotq.Y >= m_RollreferenceFrame.Y)
+ {
+ m_rot.Y = rotq.Y - (m_RollreferenceFrame.Y / 2);
+ }
+ if (rotq.X <= -m_RollreferenceFrame.X)
+ {
+ m_rot.X = rotq.X + (m_RollreferenceFrame.X / 2);
+ }
+ if (rotq.Y <= -m_RollreferenceFrame.Y)
+ {
+ m_rot.Y = rotq.Y + (m_RollreferenceFrame.Y / 2);
+ }
+ changed = true;
+ }
+ if ((m_flags & VehicleFlag.LOCK_ROTATION) != 0)
+ {
+ m_rot.X = 0;
+ m_rot.Y = 0;
+ changed = true;
+ }
+ if (changed)
+ d.BodySetQuaternion(Body, ref m_rot);
+ }
}
}
diff --git a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
index 44b2727afe..03736d157b 100644
--- a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
+++ b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
@@ -2355,6 +2355,11 @@ Console.WriteLine(" JointCreateFixed");
m_vehicle.ProcessRotationVehicleParam((Vehicle) param, rotation);
}
+ public override void VehicleFlags(int param, bool remove)
+ {
+ m_vehicle.ProcessVehicleFlags(param, remove);
+ }
+
public override void SetVolumeDetect(int param)
{
lock (_parent_scene.OdeLock)
diff --git a/OpenSim/Region/Physics/POSPlugin/POSCharacter.cs b/OpenSim/Region/Physics/POSPlugin/POSCharacter.cs
index 566b4e7313..a70179b729 100644
--- a/OpenSim/Region/Physics/POSPlugin/POSCharacter.cs
+++ b/OpenSim/Region/Physics/POSPlugin/POSCharacter.cs
@@ -182,6 +182,8 @@ namespace OpenSim.Region.Physics.POSPlugin
}
+ public override void VehicleFlags(int param, bool remove) { }
+
public override void SetVolumeDetect(int param)
{
diff --git a/OpenSim/Region/Physics/POSPlugin/POSPrim.cs b/OpenSim/Region/Physics/POSPlugin/POSPrim.cs
index 7447f76e1d..91ec3df6f9 100644
--- a/OpenSim/Region/Physics/POSPlugin/POSPrim.cs
+++ b/OpenSim/Region/Physics/POSPlugin/POSPrim.cs
@@ -139,6 +139,8 @@ namespace OpenSim.Region.Physics.POSPlugin
}
+ public override void VehicleFlags(int param, bool remove) { }
+
public override void SetVolumeDetect(int param)
{
diff --git a/OpenSim/Region/Physics/PhysXPlugin/PhysXPlugin.cs b/OpenSim/Region/Physics/PhysXPlugin/PhysXPlugin.cs
index 24eb6b1d20..dd2c68617b 100644
--- a/OpenSim/Region/Physics/PhysXPlugin/PhysXPlugin.cs
+++ b/OpenSim/Region/Physics/PhysXPlugin/PhysXPlugin.cs
@@ -371,6 +371,8 @@ namespace OpenSim.Region.Physics.PhysXPlugin
}
+ public override void VehicleFlags(int param, bool remove) { }
+
public override void SetVolumeDetect(int param)
{
@@ -775,6 +777,8 @@ namespace OpenSim.Region.Physics.PhysXPlugin
}
+ public override void VehicleFlags(int param, bool remove) { }
+
public override void SetVolumeDetect(int param)
{
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index a1db77ee73..eab475416b 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
if ((status & ScriptBaseClass.STATUS_BLOCK_GRAB) == ScriptBaseClass.STATUS_BLOCK_GRAB)
{
- NotImplemented("llSetStatus - STATUS_BLOCK_GRAB");
+ if (value != 0)
+ m_host.SetBlockGrab(true);
+ else
+ m_host.SetBlockGrab(false);
}
if ((status & ScriptBaseClass.STATUS_DIE_AT_EDGE) == ScriptBaseClass.STATUS_DIE_AT_EDGE)
@@ -1194,12 +1197,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
if ((status & ScriptBaseClass.STATUS_RETURN_AT_EDGE) == ScriptBaseClass.STATUS_RETURN_AT_EDGE)
{
- NotImplemented("llSetStatus - STATUS_RETURN_AT_EDGE");
+ if (value != 0)
+ m_host.SetReturnAtEdge(true);
+ else
+ m_host.SetReturnAtEdge(false);
}
if ((status & ScriptBaseClass.STATUS_SANDBOX) == ScriptBaseClass.STATUS_SANDBOX)
{
- NotImplemented("llSetStatus - STATUS_SANDBOX");
+ if (value != 0)
+ m_host.SetStatusSandbox(true);
+ else
+ m_host.SetStatusSandbox(false);
}
if (statusrotationaxis != 0)
@@ -1236,8 +1245,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
return 0;
case ScriptBaseClass.STATUS_BLOCK_GRAB:
- NotImplemented("llGetStatus - STATUS_BLOCK_GRAB");
- return 0;
+ if (m_host.GetBlockGrab())
+ return 1;
+ else
+ return 0;
case ScriptBaseClass.STATUS_DIE_AT_EDGE:
if (m_host.GetDieAtEdge())
@@ -1246,24 +1257,34 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
return 0;
case ScriptBaseClass.STATUS_RETURN_AT_EDGE:
- NotImplemented("llGetStatus - STATUS_RETURN_AT_EDGE");
- return 0;
+ if (m_host.GetReturnAtEdge())
+ return 1;
+ else
+ return 0;
case ScriptBaseClass.STATUS_ROTATE_X:
- NotImplemented("llGetStatus - STATUS_ROTATE_X");
- return 0;
+ if (m_host.GetAxisRotation(2) == 2)
+ return 1;
+ else
+ return 0;
case ScriptBaseClass.STATUS_ROTATE_Y:
- NotImplemented("llGetStatus - STATUS_ROTATE_Y");
- return 0;
+ if (m_host.GetAxisRotation(4) == 4)
+ return 1;
+ else
+ return 0;
case ScriptBaseClass.STATUS_ROTATE_Z:
- NotImplemented("llGetStatus - STATUS_ROTATE_Z");
- return 0;
+ if (m_host.GetAxisRotation(8) == 8)
+ return 1;
+ else
+ return 0;
case ScriptBaseClass.STATUS_SANDBOX:
- NotImplemented("llGetStatus - STATUS_SANDBOX");
- return 0;
+ if (m_host.GetStatusSandbox())
+ return 1;
+ else
+ return 0;
}
return 0;
}
@@ -2201,7 +2222,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
m_host.AddScriptLPS(1);
// send the sound, once, to all clients in range
- m_host.SendSound(KeyOrName(sound).ToString(), volume, false, 0);
+ m_host.SendSound(KeyOrName(sound).ToString(), volume, false, 0, 0, false, false);
}
// Xantor 20080528 we should do this differently.
@@ -2231,42 +2252,98 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
public void llLoopSoundMaster(string sound, double volume)
{
m_host.AddScriptLPS(1);
- NotImplemented("llLoopSoundMaster");
+ m_host.ParentGroup.LoopSoundMasterPrim = m_host;
+ lock (m_host.ParentGroup.LoopSoundSlavePrims)
+ {
+ foreach (SceneObjectPart prim in m_host.ParentGroup.LoopSoundSlavePrims)
+ {
+ if (prim.Sound != UUID.Zero)
+ llStopSound();
+
+ prim.Sound = KeyOrName(sound);
+ prim.SoundGain = volume;
+ prim.SoundFlags = 1; // looping
+ prim.SoundRadius = 20; // Magic number, 20 seems reasonable. Make configurable?
+
+ prim.ScheduleFullUpdate();
+ prim.SendFullUpdateToAllClients();
+ }
+ }
+ if (m_host.Sound != UUID.Zero)
+ llStopSound();
+
+ m_host.Sound = KeyOrName(sound);
+ m_host.SoundGain = volume;
+ m_host.SoundFlags = 1; // looping
+ m_host.SoundRadius = 20; // Magic number, 20 seems reasonable. Make configurable?
+
+ m_host.ScheduleFullUpdate();
+ m_host.SendFullUpdateToAllClients();
}
public void llLoopSoundSlave(string sound, double volume)
{
m_host.AddScriptLPS(1);
- NotImplemented("llLoopSoundSlave");
+ lock (m_host.ParentGroup.LoopSoundSlavePrims)
+ {
+ m_host.ParentGroup.LoopSoundSlavePrims.Add(m_host);
+ }
}
public void llPlaySoundSlave(string sound, double volume)
{
m_host.AddScriptLPS(1);
- NotImplemented("llPlaySoundSlave");
+
+ // send the sound, once, to all clients in range
+ m_host.SendSound(KeyOrName(sound).ToString(), volume, false, 0, 0, true, false);
}
public void llTriggerSound(string sound, double volume)
{
m_host.AddScriptLPS(1);
// send the sound, once, to all clients in range
- m_host.SendSound(KeyOrName(sound).ToString(), volume, true, 0);
+ m_host.SendSound(KeyOrName(sound).ToString(), volume, true, 0, 0, false, false);
}
// Xantor 20080528: Clear prim data of sound instead
public void llStopSound()
{
m_host.AddScriptLPS(1);
-
- m_host.Sound = UUID.Zero;
- m_host.SoundGain = 0;
- m_host.SoundFlags = 0;
- m_host.SoundRadius = 0;
-
- m_host.ScheduleFullUpdate();
- m_host.SendFullUpdateToAllClients();
-
- // m_host.SendSound(UUID.Zero.ToString(), 1.0, false, 2);
+ if (m_host.ParentGroup.LoopSoundSlavePrims.Contains(m_host))
+ {
+ if (m_host.ParentGroup.LoopSoundMasterPrim == m_host)
+ {
+ foreach (SceneObjectPart part in m_host.ParentGroup.LoopSoundSlavePrims)
+ {
+ part.Sound = UUID.Zero;
+ part.SoundGain = 0;
+ part.SoundFlags = 0;
+ part.SoundRadius = 0;
+ part.ScheduleFullUpdate();
+ part.SendFullUpdateToAllClients();
+ }
+ m_host.ParentGroup.LoopSoundMasterPrim = null;
+ m_host.ParentGroup.LoopSoundSlavePrims.Clear();
+ }
+ else
+ {
+ m_host.Sound = UUID.Zero;
+ m_host.SoundGain = 0;
+ m_host.SoundFlags = 0;
+ m_host.SoundRadius = 0;
+ m_host.ScheduleFullUpdate();
+ m_host.SendFullUpdateToAllClients();
+ }
+ }
+ else
+ {
+ m_host.Sound = UUID.Zero;
+ m_host.SoundGain = 0;
+ m_host.SoundFlags = 0;
+ m_host.SoundRadius = 0;
+ m_host.ScheduleFullUpdate();
+ m_host.SendFullUpdateToAllClients();
+ }
}
public void llPreloadSound(string sound)
@@ -2660,8 +2737,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
public void llLookAt(LSL_Vector target, double strength, double damping)
{
- // partial implementation, rotates objects correctly but does not apply strength or damping attributes
-
m_host.AddScriptLPS(1);
// Determine where we are looking from
LSL_Vector from = llGetPos();
@@ -2681,9 +2756,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
// the angles of rotation in radians into rotation value
LSL_Types.Quaternion rot = llEuler2Rot(angle);
-
+ Quaternion rotation = new Quaternion((float)rot.x, (float)rot.y, (float)rot.z, (float)rot.s);
+ m_host.startLookAt(rotation, (float)damping, (float)strength);
// Orient the object to the angle calculated
- llSetRot(rot);
+ //llSetRot(rot);
}
public void llStopLookAt()
@@ -3045,8 +3121,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
public void llRotLookAt(LSL_Rotation target, double strength, double damping)
{
m_host.AddScriptLPS(1);
-// NotImplemented("llRotLookAt");
- m_host.RotLookAt(Rot2Quaternion(target), (float)strength, (float)damping);
+ Quaternion rot = new Quaternion((float)target.x, (float)target.y, (float)target.z, (float)target.s);
+ m_host.RotLookAt(rot, (float)strength, (float)damping);
}
public LSL_Integer llStringLength(string str)
@@ -3144,13 +3220,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
public void llPointAt(LSL_Vector pos)
{
m_host.AddScriptLPS(1);
- NotImplemented("llPointAt");
+ ScenePresence Owner = World.GetScenePresence(m_host.UUID);
+ LSL_Rotation rot = llEuler2Rot(pos);
+ Owner.PreviousRotation = Owner.Rotation;
+ Owner.Rotation = (new Quaternion((float)rot.x,(float)rot.y,(float)rot.z,(float)rot.s));
}
public void llStopPointAt()
{
m_host.AddScriptLPS(1);
- NotImplemented("llStopPointAt");
+ ScenePresence Owner = m_host.ParentGroup.Scene.GetScenePresence(m_host.OwnerID);
+ Owner.Rotation = Owner.PreviousRotation;
}
public void llTargetOmega(LSL_Vector axis, double spinrate, double gain)
@@ -3946,8 +4026,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
public void llCollisionSound(string impact_sound, double impact_volume)
{
m_host.AddScriptLPS(1);
- //NotImplemented("llCollisionSound");
-
// TODO: Parameter check logic required.
UUID soundId = UUID.Zero;
if (!UUID.TryParse(impact_sound, out soundId))
@@ -4535,8 +4613,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
public LSL_Vector llGetCenterOfMass()
{
m_host.AddScriptLPS(1);
- NotImplemented("llGetCenterOfMass");
- return new LSL_Vector();
+ Vector3 center = m_host.GetGeometricCenter();
+ return new LSL_Vector(center.X,center.Y,center.Z);
}
public LSL_List llListSort(LSL_List src, int stride, int ascending)
@@ -5269,8 +5347,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
flags |= ScriptBaseClass.AGENT_SITTING;
}
- //NotImplemented("llGetAgentInfo");
-
return flags;
}
@@ -5353,7 +5429,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
LSL_Vector bottom_south_west)
{
m_host.AddScriptLPS(1);
- NotImplemented("llTriggerSoundLimited");
+ float radius1 = (float)llVecDist(llGetPos(), top_north_east);
+ float radius2 = (float)llVecDist(llGetPos(), bottom_south_west);
+ float radius = Math.Abs(radius1 - radius2);
+ m_host.SendSound(KeyOrName(sound).ToString(), volume, true, 0, radius, false, false);
}
public void llEjectFromLand(string pest)
@@ -5892,7 +5971,26 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
public void llGroundRepel(double height, int water, double tau)
{
m_host.AddScriptLPS(1);
- NotImplemented("llGroundRepel");
+ if (m_host.PhysActor != null)
+ {
+ float ground = (float)llGround(new LSL_Types.Vector3(0, 0, 0));
+ float waterLevel = (float)llWater(new LSL_Types.Vector3(0, 0, 0));
+ PIDHoverType hoverType = PIDHoverType.Ground;
+ if (water != 0)
+ {
+ hoverType = PIDHoverType.GroundAndWater;
+ if (ground < waterLevel)
+ height += waterLevel;
+ else
+ height += ground;
+ }
+ else
+ {
+ height += ground;
+ }
+
+ m_host.SetHoverHeight((float)height, hoverType, (float)tau);
+ }
}
protected UUID GetTaskInventoryItem(string name)
@@ -6021,13 +6119,25 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
public void llSetVehicleFlags(int flags)
{
m_host.AddScriptLPS(1);
- NotImplemented("llSetVehicleFlags");
+ if (m_host.ParentGroup != null)
+ {
+ if (!m_host.ParentGroup.IsDeleted)
+ {
+ m_host.ParentGroup.RootPart.SetVehicleFlags(flags, false);
+ }
+ }
}
public void llRemoveVehicleFlags(int flags)
{
m_host.AddScriptLPS(1);
- NotImplemented("llRemoveVehicleFlags");
+ if (m_host.ParentGroup != null)
+ {
+ if (!m_host.ParentGroup.IsDeleted)
+ {
+ m_host.ParentGroup.RootPart.SetVehicleFlags(flags, true);
+ }
+ }
}
public void llSitTarget(LSL_Vector offset, LSL_Rotation rot)
@@ -7049,7 +7159,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
public void llRemoteDataSetRegion()
{
m_host.AddScriptLPS(1);
- NotImplemented("llRemoteDataSetRegion");
+ Deprecated("llRemoteDataSetRegion");
}
public LSL_Float llLog10(double val)
@@ -8081,7 +8191,39 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
public void llSetInventoryPermMask(string item, int mask, int value)
{
m_host.AddScriptLPS(1);
- NotImplemented("llSetInventoryPermMask");
+ if (m_ScriptEngine.Config.GetBoolean("AllowGodFunctions", false))
+ {
+ if (World.Permissions.CanRunConsoleCommand(m_host.OwnerID))
+ {
+ lock (m_host.TaskInventory)
+ {
+ foreach (KeyValuePair inv in m_host.TaskInventory)
+ {
+ if (inv.Value.Name == item)
+ {
+ switch (mask)
+ {
+ case 0:
+ inv.Value.BasePermissions = (uint)value;
+ break;
+ case 1:
+ inv.Value.CurrentPermissions = (uint)value;
+ break;
+ case 2:
+ inv.Value.GroupPermissions = (uint)value;
+ break;
+ case 3:
+ inv.Value.EveryonePermissions = (uint)value;
+ break;
+ case 4:
+ inv.Value.NextPermissions = (uint)value;
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
}
public LSL_String llGetInventoryCreator(string item)
@@ -8515,6 +8657,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
// we send to all
landData.MediaID = new UUID(texture);
landData.MediaAutoScale = autoAlign ? (byte)1 : (byte)0;
+ landData.MediaSize[0] = width;
+ landData.MediaSize[1] = height;
+ landData.MediaType = mediaType;
// do that one last, it will cause a ParcelPropertiesUpdate
landObject.SetMediaUrl(url);
@@ -8574,11 +8719,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
m_host.AddScriptLPS(1);
LSL_List list = new LSL_List();
//TO DO: make the implementation for the missing commands
- //PARCEL_MEDIA_COMMAND_TEXTURE key uuid Use this to get or set the parcel's media texture.
- //PARCEL_MEDIA_COMMAND_URL string url Used to get or set the parcel's media url.
- //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)
- //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)
- //PARCEL_MEDIA_COMMAND_DESC string desc Use this to get or set the parcel media description. (1.19.1 RC0 or later)
//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)
for (int i = 0; i < aList.Data.Length; i++)
{
@@ -8596,6 +8736,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
case ParcelMediaCommandEnum.Texture:
list.Add(new LSL_String(World.GetLandData(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y).MediaID.ToString()));
break;
+ case ParcelMediaCommandEnum.Type:
+ list.Add(new LSL_String(World.GetLandData(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y).MediaType));
+ break;
+ case ParcelMediaCommandEnum.Size:
+ list.Add(new LSL_String(World.GetLandData(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y).MediaSize[0]));
+ list.Add(new LSL_String(World.GetLandData(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y).MediaSize[1]));
+ break;
default:
ParcelMediaCommandEnum mediaCommandEnum = ParcelMediaCommandEnum.Url;
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 13b855f3b7..7cf82b275e 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
public const int VEHICLE_BANKING_MIX = 39;
public const int VEHICLE_BANKING_TIMESCALE = 40;
public const int VEHICLE_REFERENCE_FRAME = 44;
+ public const int VEHICLE_RANGE_BLOCK = 45;
+ public const int VEHICLE_ROLL_FRAME = 46;
public const int VEHICLE_FLAG_NO_DEFLECTION_UP = 1;
public const int VEHICLE_FLAG_LIMIT_ROLL_ONLY = 2;
public const int VEHICLE_FLAG_HOVER_WATER_ONLY = 4;
@@ -170,6 +172,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
public const int VEHICLE_FLAG_MOUSELOOK_STEER = 128;
public const int VEHICLE_FLAG_MOUSELOOK_BANK = 256;
public const int VEHICLE_FLAG_CAMERA_DECOUPLED = 512;
+ public const int VEHICLE_FLAG_NO_X = 1024;
+ public const int VEHICLE_FLAG_NO_Y = 2048;
+ public const int VEHICLE_FLAG_NO_Z = 4096;
+ public const int VEHICLE_FLAG_LOCK_HOVER_HEIGHT = 8192;
+ public const int VEHICLE_FLAG_NO_DEFLECTION = 16392;
+ public const int VEHICLE_FLAG_LOCK_ROTATION = 32784;
public const int INVENTORY_ALL = -1;
public const int INVENTORY_NONE = -1;
diff --git a/OpenSim/Tests/Common/Mock/TestClient.cs b/OpenSim/Tests/Common/Mock/TestClient.cs
index b5eaf43950..7dab6a12c7 100644
--- a/OpenSim/Tests/Common/Mock/TestClient.cs
+++ b/OpenSim/Tests/Common/Mock/TestClient.cs
@@ -206,6 +206,8 @@ namespace OpenSim.Tests.Common.Mock
public event ObjectBuy OnObjectBuy;
public event BuyObjectInventory OnBuyObjectInventory;
public event AgentSit OnUndo;
+ public event AgentSit OnRedo;
+ public event LandUndo OnLandUndo;
public event ForceReleaseControls OnForceReleaseControls;