diff --git a/OpenSim/Framework/Constants.cs b/OpenSim/Framework/Constants.cs index a67add4891..70c462d500 100644 --- a/OpenSim/Framework/Constants.cs +++ b/OpenSim/Framework/Constants.cs @@ -53,6 +53,8 @@ namespace OpenSim.Framework public const float MaxSimulationHeight = 50000f; public const float MinTerrainHeightmap = -100f; public const float MaxTerrainHeightmap = 4000f; + public const float MinWaterHeight = 0; + public const float MaxWaterHeight = 8000f; public const string DefaultTexture = "89556747-24cb-43ed-920b-47caed15465f"; diff --git a/OpenSim/Framework/RegionSettings.cs b/OpenSim/Framework/RegionSettings.cs index 99214561f3..aa70399cfd 100644 --- a/OpenSim/Framework/RegionSettings.cs +++ b/OpenSim/Framework/RegionSettings.cs @@ -280,77 +280,77 @@ namespace OpenSim.Framework public double Elevation1NW { get { return m_Elevation1NW; } - set { m_Elevation1NW = value; } + set { m_Elevation1NW = Utils.Clamp(value, Constants.MinTerrainHeightmap, Constants.MaxTerrainHeightmap); ; } } private double m_Elevation2NW = 60; public double Elevation2NW { get { return m_Elevation2NW; } - set { m_Elevation2NW = value; } + set { m_Elevation2NW = Utils.Clamp(value, Constants.MinTerrainHeightmap, Constants.MaxTerrainHeightmap); ; } } private double m_Elevation1NE = 10; public double Elevation1NE { get { return m_Elevation1NE; } - set { m_Elevation1NE = value; } + set { m_Elevation1NE = Utils.Clamp(value, Constants.MinTerrainHeightmap, Constants.MaxTerrainHeightmap); ; } } private double m_Elevation2NE = 60; public double Elevation2NE { get { return m_Elevation2NE; } - set { m_Elevation2NE = value; } + set { m_Elevation2NE = Utils.Clamp(value, Constants.MinTerrainHeightmap, Constants.MaxTerrainHeightmap); ; } } private double m_Elevation1SE = 10; public double Elevation1SE { get { return m_Elevation1SE; } - set { m_Elevation1SE = value; } + set { m_Elevation1SE = Utils.Clamp(value, Constants.MinTerrainHeightmap, Constants.MaxTerrainHeightmap); ; } } private double m_Elevation2SE = 60; public double Elevation2SE { get { return m_Elevation2SE; } - set { m_Elevation2SE = value; } + set { m_Elevation2SE = Utils.Clamp(value, Constants.MinTerrainHeightmap, Constants.MaxTerrainHeightmap); ; } } private double m_Elevation1SW = 10; public double Elevation1SW { get { return m_Elevation1SW; } - set { m_Elevation1SW = value; } + set { m_Elevation1SW = Utils.Clamp(value, Constants.MinTerrainHeightmap, Constants.MaxTerrainHeightmap); ; } } private double m_Elevation2SW = 60; public double Elevation2SW { get { return m_Elevation2SW; } - set { m_Elevation2SW = value; } + set { m_Elevation2SW = Utils.Clamp(value, Constants.MinTerrainHeightmap, Constants.MaxTerrainHeightmap); ; } } private double m_WaterHeight = 20; public double WaterHeight { get { return m_WaterHeight; } - set { m_WaterHeight = value; } + set { m_WaterHeight = Utils.Clamp(value, Constants.MinWaterHeight, Constants.MaxWaterHeight); } } private double m_TerrainRaiseLimit = 100; public double TerrainRaiseLimit { get { return m_TerrainRaiseLimit; } - set { m_TerrainRaiseLimit = value; } + set { m_TerrainRaiseLimit = Utils.Clamp(value, 0, 200f); } } private double m_TerrainLowerLimit = -100; public double TerrainLowerLimit { get { return m_TerrainLowerLimit; } - set { m_TerrainLowerLimit = value; } + set { m_TerrainLowerLimit = Utils.Clamp(value, -200f, 0); ; } } private bool m_UseEstateSun = true; diff --git a/OpenSim/Framework/Servers/HttpServer/OSHttpServer/HttpRequestParser.cs b/OpenSim/Framework/Servers/HttpServer/OSHttpServer/HttpRequestParser.cs index fd7fed6244..f63a30fb34 100644 --- a/OpenSim/Framework/Servers/HttpServer/OSHttpServer/HttpRequestParser.cs +++ b/OpenSim/Framework/Servers/HttpServer/OSHttpServer/HttpRequestParser.cs @@ -167,6 +167,8 @@ namespace OSHttpServer.Parser { if (!m_curHeaderValue.TryParseInt(out m_bodyBytesLeft)) throw new BadRequestException("Content length is not a number."); + if(m_bodyBytesLeft > 64 * 1024 * 1204) + throw new BadRequestException("Content length too large."); } if (HeaderReceived != null) diff --git a/OpenSim/Region/Framework/Scenes/Animation/MovementAnimationOverrides.cs b/OpenSim/Region/Framework/Scenes/Animation/MovementAnimationOverrides.cs index f9f740753a..1047be6a18 100644 --- a/OpenSim/Region/Framework/Scenes/Animation/MovementAnimationOverrides.cs +++ b/OpenSim/Region/Framework/Scenes/Animation/MovementAnimationOverrides.cs @@ -81,6 +81,12 @@ namespace OpenSim.Region.Framework.Scenes return UUID.Zero; } + public bool TryGetOverriddenAnimation(string state, out UUID animID) + { + lock (MAOLock) + return m_overrides.TryGetValue(state, out animID); + } + public Dictionary CloneAOPairs() { lock (MAOLock) diff --git a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs index 478887404f..0736b99d89 100644 --- a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs +++ b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs @@ -194,64 +194,59 @@ namespace OpenSim.Region.Framework.Scenes.Animation public bool TrySetMovementAnimation(string anim) { - bool ret = false; - if (!m_scenePresence.IsChildAgent) - { -// m_log.DebugFormat( -// "[SCENE PRESENCE ANIMATOR]: Setting movement animation {0} for {1}", -// anim, m_scenePresence.Name); - - if (!aoSitGndAnim.IsZero()) - { - avnChangeAnim(aoSitGndAnim, false, true); - aoSitGndAnim = UUID.Zero; - } - - UUID overridenAnim = m_scenePresence.Overrides.GetOverriddenAnimation(anim); - if (!overridenAnim.IsZero()) - { - if (anim == "SITGROUND") - { - UUID defsit = DefaultAvatarAnimations.AnimsUUIDbyName["SIT_GROUND_CONSTRAINED"]; - if (defsit.IsZero()) - return false; - m_animations.SetDefaultAnimation(defsit, m_scenePresence.ControllingClient.NextAnimationSequenceNumber, m_scenePresence.UUID); - aoSitGndAnim = overridenAnim; - avnChangeAnim(overridenAnim, true, false); - } - else - { - m_animations.SetDefaultAnimation(overridenAnim, m_scenePresence.ControllingClient.NextAnimationSequenceNumber, m_scenePresence.UUID); - } - m_scenePresence.SendScriptChangedEventToAttachments(Changed.ANIMATION); - SendAnimPack(); - ret = true; - } - else - { - // translate sit and sitground state animations - if (anim == "SIT" || anim == "SITGROUND") - anim = m_scenePresence.sitAnimation; - - if (m_animations.TrySetDefaultAnimation(anim, m_scenePresence.ControllingClient.NextAnimationSequenceNumber, m_scenePresence.UUID)) - { -// m_log.DebugFormat( -// "[SCENE PRESENCE ANIMATOR]: Updating movement animation to {0} for {1}", -// anim, m_scenePresence.Name); - - m_scenePresence.SendScriptChangedEventToAttachments(Changed.ANIMATION); - SendAnimPack(); - ret = true; - } - } - } - else + if (m_scenePresence.IsChildAgent) { m_log.WarnFormat( "[SCENE PRESENCE ANIMATOR]: Tried to set movement animation {0} on child presence {1}", anim, m_scenePresence.Name); + return false; } - return ret; + + //m_log.DebugFormat( + // "[SCENE PRESENCE ANIMATOR]: Setting movement animation {0} for {1}", + // anim, m_scenePresence.Name); + + if (!aoSitGndAnim.IsZero()) + { + avnChangeAnim(aoSitGndAnim, false, true); + aoSitGndAnim = UUID.Zero; + } + + if (m_scenePresence.Overrides.TryGetOverriddenAnimation(anim, out UUID overridenAnim)) + { + if (anim.Equals("SITGROUND")) + { + UUID defsit = DefaultAvatarAnimations.AnimsUUIDbyName["SIT_GROUND_CONSTRAINED"]; + if (defsit.IsZero()) + return false; + m_animations.SetDefaultAnimation(defsit, m_scenePresence.ControllingClient.NextAnimationSequenceNumber, m_scenePresence.UUID); + aoSitGndAnim = overridenAnim; + avnChangeAnim(overridenAnim, true, false); + } + else + { + m_animations.SetDefaultAnimation(overridenAnim, m_scenePresence.ControllingClient.NextAnimationSequenceNumber, m_scenePresence.UUID); + } + m_scenePresence.SendScriptChangedEventToAttachments(Changed.ANIMATION); + SendAnimPack(); + return true; + } + + // translate sit and sitground state animations + if (anim.Equals("SIT") || anim.Equals("SITGROUND")) + anim = m_scenePresence.sitAnimation; + + if (m_animations.TrySetDefaultAnimation(anim, m_scenePresence.ControllingClient.NextAnimationSequenceNumber, m_scenePresence.UUID)) + { + //m_log.DebugFormat( + // "[SCENE PRESENCE ANIMATOR]: Updating movement animation to {0} for {1}", + // anim, m_scenePresence.Name); + + m_scenePresence.SendScriptChangedEventToAttachments(Changed.ANIMATION); + SendAnimPack(); + return true; + } + return false; } public enum motionControlStates : byte @@ -490,7 +485,6 @@ namespace OpenSim.Region.Framework.Scenes.Animation return "LAND"; } - if (currentControlState == motionControlStates.landing) { Falling = false; @@ -558,9 +552,7 @@ namespace OpenSim.Region.Framework.Scenes.Animation /// 'true' if the animation was changed public bool UpdateMovementAnimations() { - // m_log.DebugFormat("[SCENE PRESENCE ANIMATOR]: Updating movement animations for {0}", m_scenePresence.Name); - - bool ret = false; + // m_log.DebugFormat("[SCENE PRESENCE ANIMATOR]: Updating movement animations for {0}", m_scenePresence.Name); lock (m_animations) { string newMovementAnimation = DetermineMovementAnimation(); @@ -574,10 +566,10 @@ namespace OpenSim.Region.Framework.Scenes.Animation // Only set it if it's actually changed, give a script // a chance to stop a default animation - ret = TrySetMovementAnimation(CurrentMovementAnimation); + return TrySetMovementAnimation(CurrentMovementAnimation); } } - return ret; + return false; } public bool ForceUpdateMovementAnimations() @@ -837,7 +829,7 @@ namespace OpenSim.Region.Framework.Scenes.Animation /// /// Send animation information about this avatar to all clients. /// - public void SendAnimPack() + public void SendAnimPack(bool selfIncluded = true) { //m_log.Debug("Sending animation pack to all"); @@ -851,7 +843,10 @@ namespace OpenSim.Region.Framework.Scenes.Animation m_animations.GetArrays(out animIDs, out sequenceNums, out objectIDs); // SendAnimPack(animIDs, sequenceNums, objectIDs); - m_scenePresence.SendAnimPack(animIDs, sequenceNums, objectIDs); + if(selfIncluded) + m_scenePresence.SendAnimPack(animIDs, sequenceNums, objectIDs); + else + m_scenePresence.SendAnimPackToOthers(animIDs, sequenceNums, objectIDs); } public string GetAnimName(UUID animId) diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 5b4348c263..2a2da1ba5e 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -4425,6 +4425,24 @@ namespace OpenSim.Region.Framework.Scenes }); } + public void SendAnimPackToOthers(UUID[] animations, int[] seqs, UUID[] objectIDs) + { + if (IsChildAgent) + return; + + m_scene.ForEachScenePresence(delegate (ScenePresence p) + { + if (p.IsNPC) + return; + if (p.LocalId == LocalId) + return; + + if (ParcelHideThisAvatar && currentParcelUUID != p.currentParcelUUID && !p.IsViewerUIGod) + return; + p.ControllingClient.SendAnimations(animations, seqs, ControllingClient.AgentId, objectIDs); + }); + } + #endregion #region Significant Movement Method @@ -7016,5 +7034,10 @@ namespace OpenSim.Region.Framework.Scenes return Overrides.GetOverriddenAnimation(animState); } + public bool TryGetAnimationOverride(string animState, out UUID animID) + { + return Overrides.TryGetOverriddenAnimation(animState, out animID); + } + } } diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 048073b948..83fb908cc6 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -17505,8 +17505,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return String.Empty; } - UUID animID = presence.GetAnimationOverride(state); - if (animID.IsZero()) + if (!presence.TryGetAnimationOverride(state, out UUID animID) || animID.IsZero()) return animState; foreach (KeyValuePair kvp in DefaultAvatarAnimations.AnimsUUIDbyName)