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>slimupdates
							parent
							
								
									45493171b0
								
							
						
					
					
						commit
						9821c4f566
					
				|  | @ -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; | ||||
|  |  | |||
|  | @ -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; | ||||
|  |  | |||
|  | @ -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 { }; | ||||
|  |  | |||
|  | @ -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; | ||||
|              | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
|  | @ -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; | ||||
|  |  | |||
|  | @ -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; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// URL to the shoutcast music stream to play on the parcel | ||||
|         /// </summary> | ||||
|  |  | |||
|  | @ -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; | ||||
|  |  | |||
|  | @ -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; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  |  | |||
|  | @ -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); | ||||
|  |  | |||
|  | @ -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<LandUndoState> m_undo = new UndoStack<LandUndoState>(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; | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Loads a terrain file from disk and installs it in the scene. | ||||
|         /// </summary> | ||||
|  | @ -574,6 +580,7 @@ namespace OpenSim.Region.CoreModules.World.Terrain | |||
|         { | ||||
|             client.OnModifyTerrain += client_OnModifyTerrain; | ||||
|             client.OnBakeTerrain += client_OnBakeTerrain; | ||||
|             client.OnLandUndo += client_OnLandUndo; | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|  | @ -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(); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Sends a copy of the current terrain to the scenes clients | ||||
|         /// </summary> | ||||
|  | @ -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) | ||||
|  |  | |||
|  | @ -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; | ||||
| 
 | ||||
|  |  | |||
|  | @ -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); | ||||
|     } | ||||
| } | ||||
|  | @ -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); | ||||
|     } | ||||
| } | ||||
|  |  | |||
|  | @ -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(); | ||||
|                 }); | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|  |  | |||
|  | @ -1976,6 +1976,23 @@ namespace OpenSim.Region.Framework.Scenes | |||
|                 return; | ||||
|             } | ||||
| 
 | ||||
|             if (grp.RootPart.RETURN_AT_EDGE) | ||||
|             { | ||||
|                 // We remove the object here | ||||
|                 try | ||||
|                 { | ||||
|                     List<SceneObjectGroup> objects = new List<SceneObjectGroup>(); | ||||
|                     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; | ||||
|  |  | |||
|  | @ -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) | ||||
|  |  | |||
|  | @ -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<SceneObjectPart> m_PlaySoundSlavePrims = new List<SceneObjectPart>(); | ||||
|         public List<SceneObjectPart> 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<SceneObjectPart> m_LoopSoundSlavePrims = new List<SceneObjectPart>(); | ||||
|         public List<SceneObjectPart> 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 | |||
|         /// <param name="pos"></param> | ||||
|         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 | |||
|         /// <param name="pos"></param> | ||||
|         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 | |||
|         /// <param name="rot"></param> | ||||
|         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 | |||
|         /// <param name="rot"></param> | ||||
|         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(); | ||||
|         } | ||||
| 
 | ||||
|  |  | |||
|  | @ -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; | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// This part's inventory | ||||
|         /// </summary> | ||||
|  | @ -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<UndoState> m_undo = new UndoStack<UndoState>(5); | ||||
|         private readonly UndoStack<UndoState> m_redo = new UndoStack<UndoState>(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<SceneObjectPart> m_PlaySoundSlavePrims = new List<SceneObjectPart>(); | ||||
|         public List<SceneObjectPart> 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<SceneObjectPart> m_LoopSoundSlavePrims = new List<SceneObjectPart>(); | ||||
|         public List<SceneObjectPart> 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<ScenePresence> 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; | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|  | @ -2814,7 +2979,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
|         /// <param name="volume"></param> | ||||
|         /// <param name="triggered"></param> | ||||
|         /// <param name="flags"></param> | ||||
|         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<ISoundModule>(); | ||||
|             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); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  |  | |||
|  | @ -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; } | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// 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(); | ||||
|             } | ||||
|  |  | |||
|  | @ -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); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  |  | |||
|  | @ -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; | ||||
|  |  | |||
|  | @ -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 | ||||
|  |  | |||
|  | @ -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); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|  |  | |||
|  | @ -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; | ||||
|  |  | |||
|  | @ -185,6 +185,11 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin | |||
| 
 | ||||
|         } | ||||
| 
 | ||||
|         public override void VehicleFlags(int param, bool remove) | ||||
|         { | ||||
| 
 | ||||
|         } | ||||
| 
 | ||||
|         public override void SetVolumeDetect(int param) | ||||
|         { | ||||
| 
 | ||||
|  |  | |||
|  | @ -362,6 +362,11 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin | |||
|              | ||||
|         } | ||||
| 
 | ||||
|         public override void VehicleFlags(int param, bool remove) | ||||
|         { | ||||
| 
 | ||||
|         } | ||||
| 
 | ||||
|         public override void SetVolumeDetect(int param) | ||||
|         { | ||||
|              | ||||
|  |  | |||
|  | @ -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 | ||||
|  |  | |||
|  | @ -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) | ||||
|  |  | |||
|  | @ -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) | ||||
|         { | ||||
| 
 | ||||
|  |  | |||
|  | @ -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 | ||||
|     } | ||||
|          | ||||
| } | ||||
|  |  | |||
|  | @ -734,6 +734,11 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
| 
 | ||||
|         } | ||||
| 
 | ||||
|         public override void VehicleFlags(int param, bool remove) | ||||
|         { | ||||
| 
 | ||||
|         } | ||||
| 
 | ||||
|         public override void SetVolumeDetect(int param) | ||||
|         { | ||||
| 
 | ||||
|  |  | |||
|  | @ -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); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  |  | |||
|  | @ -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) | ||||
|  |  | |||
|  | @ -182,6 +182,8 @@ namespace OpenSim.Region.Physics.POSPlugin | |||
| 
 | ||||
|         } | ||||
| 
 | ||||
|         public override void VehicleFlags(int param, bool remove) { } | ||||
| 
 | ||||
|         public override void SetVolumeDetect(int param) | ||||
|         { | ||||
| 
 | ||||
|  |  | |||
|  | @ -139,6 +139,8 @@ namespace OpenSim.Region.Physics.POSPlugin | |||
| 
 | ||||
|         } | ||||
| 
 | ||||
|         public override void VehicleFlags(int param, bool remove) { } | ||||
| 
 | ||||
|         public override void SetVolumeDetect(int param) | ||||
|         { | ||||
| 
 | ||||
|  |  | |||
|  | @ -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) | ||||
|         { | ||||
| 
 | ||||
|  |  | |||
|  | @ -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<UUID, TaskInventoryItem> 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()); | ||||
|  |  | |||
|  | @ -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; | ||||
|  |  | |||
|  | @ -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; | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Revolution
						Revolution