diff --git a/OpenSim/Region/Environment/Interfaces/IWindModule.cs b/OpenSim/Region/Environment/Interfaces/IWindModule.cs new file mode 100644 index 0000000000..63a95d36c5 --- /dev/null +++ b/OpenSim/Region/Environment/Interfaces/IWindModule.cs @@ -0,0 +1,41 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSim Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using OpenSim.Framework; +using OpenMetaverse; + +namespace OpenSim.Region.Environment.Interfaces +{ + public interface IWindModule : IRegionModule + { + Vector2[] WindSpeeds + { + get; + } + } +} diff --git a/OpenSim/Region/Environment/Modules/World/Wind/WindModule.cs b/OpenSim/Region/Environment/Modules/World/Wind/WindModule.cs index 3fdb771983..52eb6e7243 100644 --- a/OpenSim/Region/Environment/Modules/World/Wind/WindModule.cs +++ b/OpenSim/Region/Environment/Modules/World/Wind/WindModule.cs @@ -35,7 +35,7 @@ using OpenSim.Region.Environment.Scenes; namespace OpenSim.Region.Environment.Modules { - public class WindModule : IRegionModule + public class WindModule : IWindModule { private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); @@ -83,6 +83,7 @@ namespace OpenSim.Region.Environment.Modules scene.EventManager.OnMakeChildAgent += MakeChildAgent; scene.EventManager.OnAvatarEnteringNewParcel += AvatarEnteringParcel; scene.EventManager.OnClientClosed += ClientLoggedOut; + scene.RegisterModuleInterface(this); GenWindPos(); @@ -117,6 +118,11 @@ namespace OpenSim.Region.Environment.Modules get { return false; } } + public Vector2[] WindSpeeds + { + get { return windSpeeds; } + } + public void WindToClient(IClientAPI client) { if (ready) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 956a500fc7..d410a59a75 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -953,7 +953,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public LSL_Vector llWind(LSL_Vector offset) { m_host.AddScriptLPS(1); - return new LSL_Vector(); + LSL_Vector wind = new LSL_Vector(0, 0, 0); + IWindModule module = World.RequestModuleInterface(); + if (module != null && module.WindSpeeds != null) + { + Vector3 pos = m_host.GetWorldPosition(); + int x = (int)((pos.X + offset.x)/ 16); + int y = (int)((pos.Y + offset.y)/ 16); + if (x < 0) x = 0; + if (x > 15) x = 15; + if (y < 0) y = 0; + if (y > 15) y = 15; + wind.x = module.WindSpeeds[y * 16 + x].X; + wind.y = module.WindSpeeds[y * 16 + x].Y; + } + return wind; } public void llSetStatus(int status, int value)