Update svn properties.

0.6.0-stable
Jeff Ames 2008-05-04 21:59:29 +00:00
parent 9752669011
commit 0e31eb8314
4 changed files with 952 additions and 952 deletions

View File

@ -1,313 +1,313 @@
/* /*
* Copyright (c) Contributors, http://opensimulator.org/ * Copyright (c) Contributors, http://opensimulator.org/
* See CONTRIBUTORS.TXT for a full list of copyright holders. * See CONTRIBUTORS.TXT for a full list of copyright holders.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright * * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer. * notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright * * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the * notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution. * documentation and/or other materials provided with the distribution.
* * Neither the name of the OpenSim Project nor the * * Neither the name of the OpenSim Project nor the
* names of its contributors may be used to endorse or promote products * names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission. * derived from this software without specific prior written permission.
* *
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * 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 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Reflection; using System.Reflection;
using System.Text; using System.Text;
using log4net; using log4net;
using OpenSim.Framework; using OpenSim.Framework;
using OpenSim.Region.Environment.Interfaces; using OpenSim.Region.Environment.Interfaces;
namespace OpenSim.Region.Environment.Modules.Framework.InterfaceCommander namespace OpenSim.Region.Environment.Modules.Framework.InterfaceCommander
{ {
/// <summary> /// <summary>
/// A single function call encapsulated in a class which enforces arguments when passing around as Object[]'s. /// A single function call encapsulated in a class which enforces arguments when passing around as Object[]'s.
/// Used for console commands and script API generation /// Used for console commands and script API generation
/// </summary> /// </summary>
public class Command : ICommand public class Command : ICommand
{ {
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
private List<CommandArgument> m_args = new List<CommandArgument>(); private List<CommandArgument> m_args = new List<CommandArgument>();
private Action<object[]> m_command; private Action<object[]> m_command;
private string m_help; private string m_help;
private string m_name; private string m_name;
public Command(string name, Action<Object[]> command, string help) public Command(string name, Action<Object[]> command, string help)
{ {
m_name = name; m_name = name;
m_command = command; m_command = command;
m_help = help; m_help = help;
} }
#region ICommand Members #region ICommand Members
public void AddArgument(string name, string helptext, string type) public void AddArgument(string name, string helptext, string type)
{ {
m_args.Add(new CommandArgument(name, helptext, type)); m_args.Add(new CommandArgument(name, helptext, type));
} }
public string Name public string Name
{ {
get { return m_name; } get { return m_name; }
} }
public string Help public string Help
{ {
get { return m_help; } get { return m_help; }
} }
public Dictionary<string, string> Arguments public Dictionary<string, string> Arguments
{ {
get get
{ {
Dictionary<string, string> tmp = new Dictionary<string, string>(); Dictionary<string, string> tmp = new Dictionary<string, string>();
foreach (CommandArgument arg in m_args) foreach (CommandArgument arg in m_args)
{ {
tmp.Add(arg.Name, arg.ArgumentType); tmp.Add(arg.Name, arg.ArgumentType);
} }
return tmp; return tmp;
} }
} }
public void ShowConsoleHelp() public void ShowConsoleHelp()
{ {
m_log.Info("== " + Name + " =="); m_log.Info("== " + Name + " ==");
m_log.Info(m_help); m_log.Info(m_help);
m_log.Info("= Parameters ="); m_log.Info("= Parameters =");
foreach (CommandArgument arg in m_args) foreach (CommandArgument arg in m_args)
{ {
m_log.Info("* " + arg.Name + " (" + arg.ArgumentType + ")"); m_log.Info("* " + arg.Name + " (" + arg.ArgumentType + ")");
m_log.Info("\t" + arg.HelpText); m_log.Info("\t" + arg.HelpText);
} }
} }
public void Run(Object[] args) public void Run(Object[] args)
{ {
Object[] cleanArgs = new Object[m_args.Count]; Object[] cleanArgs = new Object[m_args.Count];
if (args.Length < cleanArgs.Length) if (args.Length < cleanArgs.Length)
{ {
m_log.Error("Missing " + (cleanArgs.Length - args.Length) + " argument(s)"); m_log.Error("Missing " + (cleanArgs.Length - args.Length) + " argument(s)");
ShowConsoleHelp(); ShowConsoleHelp();
return; return;
} }
if (args.Length > cleanArgs.Length) if (args.Length > cleanArgs.Length)
{ {
m_log.Error("Too many arguments for this command. Type '<module> <command> help' for help."); m_log.Error("Too many arguments for this command. Type '<module> <command> help' for help.");
return; return;
} }
int i = 0; int i = 0;
foreach (Object arg in args) foreach (Object arg in args)
{ {
if (string.IsNullOrEmpty(arg.ToString())) if (string.IsNullOrEmpty(arg.ToString()))
{ {
m_log.Error("Empty arguments are not allowed"); m_log.Error("Empty arguments are not allowed");
return; return;
} }
try try
{ {
switch (m_args[i].ArgumentType) switch (m_args[i].ArgumentType)
{ {
case "String": case "String":
m_args[i].ArgumentValue = arg.ToString(); m_args[i].ArgumentValue = arg.ToString();
break; break;
case "Integer": case "Integer":
m_args[i].ArgumentValue = Int32.Parse(arg.ToString()); m_args[i].ArgumentValue = Int32.Parse(arg.ToString());
break; break;
case "Double": case "Double":
m_args[i].ArgumentValue = Double.Parse(arg.ToString()); m_args[i].ArgumentValue = Double.Parse(arg.ToString());
break; break;
case "Boolean": case "Boolean":
m_args[i].ArgumentValue = Boolean.Parse(arg.ToString()); m_args[i].ArgumentValue = Boolean.Parse(arg.ToString());
break; break;
default: default:
m_log.Error("Unknown desired type for argument " + m_args[i].Name + " on command " + m_name); m_log.Error("Unknown desired type for argument " + m_args[i].Name + " on command " + m_name);
break; break;
} }
} }
catch (FormatException) catch (FormatException)
{ {
m_log.Error("Argument number " + (i + 1) + m_log.Error("Argument number " + (i + 1) +
" (" + m_args[i].Name + ") must be a valid " + " (" + m_args[i].Name + ") must be a valid " +
m_args[i].ArgumentType.ToLower() + "."); m_args[i].ArgumentType.ToLower() + ".");
} }
cleanArgs[i] = m_args[i].ArgumentValue; cleanArgs[i] = m_args[i].ArgumentValue;
i++; i++;
} }
m_command.Invoke(cleanArgs); m_command.Invoke(cleanArgs);
} }
#endregion #endregion
} }
/// <summary> /// <summary>
/// A single command argument, contains name, type and at runtime, value. /// A single command argument, contains name, type and at runtime, value.
/// </summary> /// </summary>
public class CommandArgument public class CommandArgument
{ {
private string m_help; private string m_help;
private string m_name; private string m_name;
private string m_type; private string m_type;
private Object m_val; private Object m_val;
public CommandArgument(string name, string help, string type) public CommandArgument(string name, string help, string type)
{ {
m_name = name; m_name = name;
m_help = help; m_help = help;
m_type = type; m_type = type;
} }
public string Name public string Name
{ {
get { return m_name; } get { return m_name; }
} }
public string HelpText public string HelpText
{ {
get { return m_help; } get { return m_help; }
} }
public string ArgumentType public string ArgumentType
{ {
get { return m_type; } get { return m_type; }
} }
public Object ArgumentValue public Object ArgumentValue
{ {
get { return m_val; } get { return m_val; }
set { m_val = value; } set { m_val = value; }
} }
} }
/// <summary> /// <summary>
/// A class to enable modules to register console and script commands, which enforces typing and valid input. /// A class to enable modules to register console and script commands, which enforces typing and valid input.
/// </summary> /// </summary>
public class Commander : ICommander public class Commander : ICommander
{ {
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
private Dictionary<string, ICommand> m_commands = new Dictionary<string, ICommand>(); private Dictionary<string, ICommand> m_commands = new Dictionary<string, ICommand>();
private string m_name; private string m_name;
public Commander(string name) public Commander(string name)
{ {
m_name = name; m_name = name;
} }
public Dictionary<string, ICommand> Commands public Dictionary<string, ICommand> Commands
{ {
get { return m_commands; } get { return m_commands; }
} }
#region ICommander Members #region ICommander Members
public void RegisterCommand(string commandName, ICommand command) public void RegisterCommand(string commandName, ICommand command)
{ {
m_commands[commandName] = command; m_commands[commandName] = command;
} }
/// <summary> /// <summary>
/// Generates a runtime C# class which can be compiled and inserted via reflection to enable modules to register new script commands /// Generates a runtime C# class which can be compiled and inserted via reflection to enable modules to register new script commands
/// </summary> /// </summary>
/// <returns>Returns C# source code to create a binding</returns> /// <returns>Returns C# source code to create a binding</returns>
public string GenerateRuntimeAPI() public string GenerateRuntimeAPI()
{ {
string classSrc = "\n\tpublic class " + m_name + " {\n"; string classSrc = "\n\tpublic class " + m_name + " {\n";
foreach (ICommand com in m_commands.Values) foreach (ICommand com in m_commands.Values)
{ {
classSrc += "\tpublic void " + EscapeRuntimeAPICommand(com.Name) + "( "; classSrc += "\tpublic void " + EscapeRuntimeAPICommand(com.Name) + "( ";
foreach (KeyValuePair<string, string> arg in com.Arguments) foreach (KeyValuePair<string, string> arg in com.Arguments)
{ {
classSrc += arg.Value + " " + Util.Md5Hash(arg.Key) + ","; classSrc += arg.Value + " " + Util.Md5Hash(arg.Key) + ",";
} }
classSrc = classSrc.Remove(classSrc.Length - 1); // Delete the last comma classSrc = classSrc.Remove(classSrc.Length - 1); // Delete the last comma
classSrc += " )\n\t{\n"; classSrc += " )\n\t{\n";
classSrc += "\t\tObject[] args = new Object[" + com.Arguments.Count.ToString() + "];\n"; classSrc += "\t\tObject[] args = new Object[" + com.Arguments.Count.ToString() + "];\n";
int i = 0; int i = 0;
foreach (KeyValuePair<string, string> arg in com.Arguments) foreach (KeyValuePair<string, string> arg in com.Arguments)
{ {
classSrc += "\t\targs[" + i.ToString() + "] = " + Util.Md5Hash(arg.Key) + " " + ";\n"; classSrc += "\t\targs[" + i.ToString() + "] = " + Util.Md5Hash(arg.Key) + " " + ";\n";
i++; i++;
} }
classSrc += "\t\tGetCommander(\"" + m_name + "\").Run(\"" + com.Name + "\", args);\n"; classSrc += "\t\tGetCommander(\"" + m_name + "\").Run(\"" + com.Name + "\", args);\n";
classSrc += "\t}\n"; classSrc += "\t}\n";
} }
classSrc += "}\n"; classSrc += "}\n";
return classSrc; return classSrc;
} }
/// <summary> /// <summary>
/// Runs a specified function with attached arguments /// Runs a specified function with attached arguments
/// *** <b>DO NOT CALL DIRECTLY.</b> *** /// *** <b>DO NOT CALL DIRECTLY.</b> ***
/// Call ProcessConsoleCommand instead if handling human input. /// Call ProcessConsoleCommand instead if handling human input.
/// </summary> /// </summary>
/// <param name="function">The function name to call</param> /// <param name="function">The function name to call</param>
/// <param name="args">The function parameters</param> /// <param name="args">The function parameters</param>
public void Run(string function, object[] args) public void Run(string function, object[] args)
{ {
m_commands[function].Run(args); m_commands[function].Run(args);
} }
public void ProcessConsoleCommand(string function, string[] args) public void ProcessConsoleCommand(string function, string[] args)
{ {
if (m_commands.ContainsKey(function)) if (m_commands.ContainsKey(function))
{ {
if (args.Length > 0 && args[0] == "help") if (args.Length > 0 && args[0] == "help")
{ {
m_commands[function].ShowConsoleHelp(); m_commands[function].ShowConsoleHelp();
} }
else else
{ {
m_commands[function].Run(args); m_commands[function].Run(args);
} }
} }
else else
{ {
if (function != "help") if (function != "help")
m_log.Error("Invalid command - No such command exists"); m_log.Error("Invalid command - No such command exists");
if (function == "api") if (function == "api")
m_log.Info(GenerateRuntimeAPI()); m_log.Info(GenerateRuntimeAPI());
ShowConsoleHelp(); ShowConsoleHelp();
} }
} }
#endregion #endregion
private void ShowConsoleHelp() private void ShowConsoleHelp()
{ {
m_log.Info("===" + m_name + "==="); m_log.Info("===" + m_name + "===");
foreach (ICommand com in m_commands.Values) foreach (ICommand com in m_commands.Values)
{ {
m_log.Info("* " + com.Name + " - " + com.Help); m_log.Info("* " + com.Name + " - " + com.Help);
} }
} }
private string EscapeRuntimeAPICommand(string command) private string EscapeRuntimeAPICommand(string command)
{ {
command = command.Replace('-', '_'); command = command.Replace('-', '_');
StringBuilder tmp = new StringBuilder(command); StringBuilder tmp = new StringBuilder(command);
tmp[0] = tmp[0].ToString().ToUpper().ToCharArray()[0]; tmp[0] = tmp[0].ToString().ToUpper().ToCharArray()[0];
return tmp.ToString(); return tmp.ToString();
} }
} }
} }

View File

@ -1,89 +1,89 @@
/* /*
* Copyright (c) Contributors, http://opensimulator.org/ * Copyright (c) Contributors, http://opensimulator.org/
* See CONTRIBUTORS.TXT for a full list of copyright holders. * See CONTRIBUTORS.TXT for a full list of copyright holders.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright * * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer. * notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright * * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the * notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution. * documentation and/or other materials provided with the distribution.
* * Neither the name of the OpenSim Project nor the * * Neither the name of the OpenSim Project nor the
* names of its contributors may be used to endorse or promote products * names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission. * derived from this software without specific prior written permission.
* *
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * 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 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
using System; using System;
using Nini.Config; using Nini.Config;
using OpenSim.Region.Environment.Interfaces; using OpenSim.Region.Environment.Interfaces;
using OpenSim.Region.Environment.Modules.Framework.InterfaceCommander; using OpenSim.Region.Environment.Modules.Framework.InterfaceCommander;
using OpenSim.Region.Environment.Scenes; using OpenSim.Region.Environment.Scenes;
namespace OpenSim.Region.Environment.Modules.Framework.InterfaceCommander namespace OpenSim.Region.Environment.Modules.Framework.InterfaceCommander
{ {
public class CommanderTestModule : IRegionModule, ICommandableModule public class CommanderTestModule : IRegionModule, ICommandableModule
{ {
private readonly Commander m_commander = new Commander("CommanderTest"); private readonly Commander m_commander = new Commander("CommanderTest");
private Scene m_scene; private Scene m_scene;
#region ICommandableModule Members #region ICommandableModule Members
public ICommander CommandInterface public ICommander CommandInterface
{ {
get { throw new NotImplementedException(); } get { throw new NotImplementedException(); }
} }
#endregion #endregion
#region IRegionModule Members #region IRegionModule Members
public void Initialise(Scene scene, IConfigSource source) public void Initialise(Scene scene, IConfigSource source)
{ {
m_scene = scene; m_scene = scene;
} }
public void PostInitialise() public void PostInitialise()
{ {
Command testCommand = new Command("hello", InterfaceHelloWorld, "Says a simple debugging test string"); Command testCommand = new Command("hello", InterfaceHelloWorld, "Says a simple debugging test string");
testCommand.AddArgument("world", "Write world here", "string"); testCommand.AddArgument("world", "Write world here", "string");
m_commander.RegisterCommand("hello", testCommand); m_commander.RegisterCommand("hello", testCommand);
// Register me // Register me
m_scene.RegisterModuleCommander("commandertest", m_commander); m_scene.RegisterModuleCommander("commandertest", m_commander);
} }
public void Close() public void Close()
{ {
} }
public string Name public string Name
{ {
get { return "CommanderTestModule"; } get { return "CommanderTestModule"; }
} }
public bool IsSharedModule public bool IsSharedModule
{ {
get { return false; } get { return false; }
} }
#endregion #endregion
private void InterfaceHelloWorld(Object[] args) private void InterfaceHelloWorld(Object[] args)
{ {
Console.WriteLine("Hello World"); Console.WriteLine("Hello World");
} }
} }
} }

View File

@ -1,387 +1,387 @@
/* /*
* Copyright (c) Contributors, http://opensimulator.org/ * Copyright (c) Contributors, http://opensimulator.org/
* See CONTRIBUTORS.TXT for a full list of copyright holders. * See CONTRIBUTORS.TXT for a full list of copyright holders.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright * * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer. * notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright * * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the * notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution. * documentation and/or other materials provided with the distribution.
* * Neither the name of the OpenSim Project nor the * * Neither the name of the OpenSim Project nor the
* names of its contributors may be used to endorse or promote products * names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission. * derived from this software without specific prior written permission.
* *
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * 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 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
using System.Collections.Generic; using System.Collections.Generic;
using System.Reflection; using System.Reflection;
using libsecondlife; using libsecondlife;
using log4net; using log4net;
using Nini.Config; using Nini.Config;
using OpenSim.Framework; using OpenSim.Framework;
using OpenSim.Region.Environment.Interfaces; using OpenSim.Region.Environment.Interfaces;
using OpenSim.Region.Environment.Scenes; using OpenSim.Region.Environment.Scenes;
namespace OpenSim.Region.Environment.Modules.World.Estate namespace OpenSim.Region.Environment.Modules.World.Estate
{ {
public class EstateManagementModule : IRegionModule public class EstateManagementModule : IRegionModule
{ {
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
private Scene m_scene; private Scene m_scene;
#region Packet Data Responders #region Packet Data Responders
private static void sendDetailedEstateData(IClientAPI remote_client, LLUUID invoice) private static void sendDetailedEstateData(IClientAPI remote_client, LLUUID invoice)
{ {
remote_client.sendDetailedEstateData(invoice); remote_client.sendDetailedEstateData(invoice);
remote_client.sendEstateManagersList(invoice); remote_client.sendEstateManagersList(invoice);
} }
private void estateSetRegionInfoHandler(bool blockTerraform, bool noFly, bool allowDamage, bool blockLandResell, int maxAgents, float objectBonusFactor, private void estateSetRegionInfoHandler(bool blockTerraform, bool noFly, bool allowDamage, bool blockLandResell, int maxAgents, float objectBonusFactor,
int matureLevel, bool restrictPushObject, bool allowParcelChanges) int matureLevel, bool restrictPushObject, bool allowParcelChanges)
{ {
m_scene.RegionInfo.EstateSettings.regionFlags = Simulator.RegionFlags.None; m_scene.RegionInfo.EstateSettings.regionFlags = Simulator.RegionFlags.None;
if (blockTerraform) if (blockTerraform)
{ {
m_scene.RegionInfo.EstateSettings.regionFlags = m_scene.RegionInfo.EstateSettings.regionFlags | m_scene.RegionInfo.EstateSettings.regionFlags = m_scene.RegionInfo.EstateSettings.regionFlags |
Simulator.RegionFlags.BlockTerraform; Simulator.RegionFlags.BlockTerraform;
} }
if (noFly) if (noFly)
{ {
m_scene.RegionInfo.EstateSettings.regionFlags = m_scene.RegionInfo.EstateSettings.regionFlags | m_scene.RegionInfo.EstateSettings.regionFlags = m_scene.RegionInfo.EstateSettings.regionFlags |
Simulator.RegionFlags.NoFly; Simulator.RegionFlags.NoFly;
} }
if (allowDamage) if (allowDamage)
{ {
m_scene.RegionInfo.EstateSettings.regionFlags = m_scene.RegionInfo.EstateSettings.regionFlags | m_scene.RegionInfo.EstateSettings.regionFlags = m_scene.RegionInfo.EstateSettings.regionFlags |
Simulator.RegionFlags.AllowDamage; Simulator.RegionFlags.AllowDamage;
} }
if (blockLandResell) if (blockLandResell)
{ {
m_scene.RegionInfo.EstateSettings.regionFlags = m_scene.RegionInfo.EstateSettings.regionFlags | m_scene.RegionInfo.EstateSettings.regionFlags = m_scene.RegionInfo.EstateSettings.regionFlags |
Simulator.RegionFlags.BlockLandResell; Simulator.RegionFlags.BlockLandResell;
} }
m_scene.RegionInfo.EstateSettings.maxAgents = (byte) maxAgents; m_scene.RegionInfo.EstateSettings.maxAgents = (byte) maxAgents;
m_scene.RegionInfo.EstateSettings.objectBonusFactor = objectBonusFactor; m_scene.RegionInfo.EstateSettings.objectBonusFactor = objectBonusFactor;
m_scene.RegionInfo.EstateSettings.simAccess = (Simulator.SimAccess) matureLevel; m_scene.RegionInfo.EstateSettings.simAccess = (Simulator.SimAccess) matureLevel;
if (restrictPushObject) if (restrictPushObject)
{ {
m_scene.RegionInfo.EstateSettings.regionFlags = m_scene.RegionInfo.EstateSettings.regionFlags | m_scene.RegionInfo.EstateSettings.regionFlags = m_scene.RegionInfo.EstateSettings.regionFlags |
Simulator.RegionFlags.RestrictPushObject; Simulator.RegionFlags.RestrictPushObject;
} }
if (allowParcelChanges) if (allowParcelChanges)
{ {
m_scene.RegionInfo.EstateSettings.regionFlags = m_scene.RegionInfo.EstateSettings.regionFlags | m_scene.RegionInfo.EstateSettings.regionFlags = m_scene.RegionInfo.EstateSettings.regionFlags |
Simulator.RegionFlags.AllowParcelChanges; Simulator.RegionFlags.AllowParcelChanges;
} }
sendRegionInfoPacketToAll(); sendRegionInfoPacketToAll();
} }
public void setEstateTerrainBaseTexture(IClientAPI remoteClient, int corner, LLUUID texture) public void setEstateTerrainBaseTexture(IClientAPI remoteClient, int corner, LLUUID texture)
{ {
switch (corner) switch (corner)
{ {
case 0: case 0:
m_scene.RegionInfo.EstateSettings.terrainBase0 = texture; m_scene.RegionInfo.EstateSettings.terrainBase0 = texture;
break; break;
case 1: case 1:
m_scene.RegionInfo.EstateSettings.terrainBase1 = texture; m_scene.RegionInfo.EstateSettings.terrainBase1 = texture;
break; break;
case 2: case 2:
m_scene.RegionInfo.EstateSettings.terrainBase2 = texture; m_scene.RegionInfo.EstateSettings.terrainBase2 = texture;
break; break;
case 3: case 3:
m_scene.RegionInfo.EstateSettings.terrainBase3 = texture; m_scene.RegionInfo.EstateSettings.terrainBase3 = texture;
break; break;
} }
} }
public void setEstateTerrainDetailTexture(IClientAPI client, int corner, LLUUID textureUUID) public void setEstateTerrainDetailTexture(IClientAPI client, int corner, LLUUID textureUUID)
{ {
switch (corner) switch (corner)
{ {
case 0: case 0:
m_scene.RegionInfo.EstateSettings.terrainDetail0 = textureUUID; m_scene.RegionInfo.EstateSettings.terrainDetail0 = textureUUID;
break; break;
case 1: case 1:
m_scene.RegionInfo.EstateSettings.terrainDetail1 = textureUUID; m_scene.RegionInfo.EstateSettings.terrainDetail1 = textureUUID;
break; break;
case 2: case 2:
m_scene.RegionInfo.EstateSettings.terrainDetail2 = textureUUID; m_scene.RegionInfo.EstateSettings.terrainDetail2 = textureUUID;
break; break;
case 3: case 3:
m_scene.RegionInfo.EstateSettings.terrainDetail3 = textureUUID; m_scene.RegionInfo.EstateSettings.terrainDetail3 = textureUUID;
break; break;
} }
} }
public void setEstateTerrainTextureHeights(IClientAPI client, int corner, float lowValue, float highValue) public void setEstateTerrainTextureHeights(IClientAPI client, int corner, float lowValue, float highValue)
{ {
switch (corner) switch (corner)
{ {
case 0: case 0:
m_scene.RegionInfo.EstateSettings.terrainStartHeight0 = lowValue; m_scene.RegionInfo.EstateSettings.terrainStartHeight0 = lowValue;
m_scene.RegionInfo.EstateSettings.terrainHeightRange0 = highValue; m_scene.RegionInfo.EstateSettings.terrainHeightRange0 = highValue;
break; break;
case 1: case 1:
m_scene.RegionInfo.EstateSettings.terrainStartHeight1 = lowValue; m_scene.RegionInfo.EstateSettings.terrainStartHeight1 = lowValue;
m_scene.RegionInfo.EstateSettings.terrainHeightRange1 = highValue; m_scene.RegionInfo.EstateSettings.terrainHeightRange1 = highValue;
break; break;
case 2: case 2:
m_scene.RegionInfo.EstateSettings.terrainStartHeight2 = lowValue; m_scene.RegionInfo.EstateSettings.terrainStartHeight2 = lowValue;
m_scene.RegionInfo.EstateSettings.terrainHeightRange2 = highValue; m_scene.RegionInfo.EstateSettings.terrainHeightRange2 = highValue;
break; break;
case 3: case 3:
m_scene.RegionInfo.EstateSettings.terrainStartHeight3 = lowValue; m_scene.RegionInfo.EstateSettings.terrainStartHeight3 = lowValue;
m_scene.RegionInfo.EstateSettings.terrainHeightRange3 = highValue; m_scene.RegionInfo.EstateSettings.terrainHeightRange3 = highValue;
break; break;
} }
} }
private void handleCommitEstateTerrainTextureRequest(IClientAPI remoteClient) private void handleCommitEstateTerrainTextureRequest(IClientAPI remoteClient)
{ {
sendRegionHandshakeToAll(); sendRegionHandshakeToAll();
} }
public void setRegionTerrainSettings(float WaterHeight, float TerrainRaiseLimit, float TerrainLowerLimit, public void setRegionTerrainSettings(float WaterHeight, float TerrainRaiseLimit, float TerrainLowerLimit,
bool UseFixedSun, float SunHour) bool UseFixedSun, float SunHour)
{ {
// Water Height // Water Height
m_scene.RegionInfo.EstateSettings.waterHeight = WaterHeight; m_scene.RegionInfo.EstateSettings.waterHeight = WaterHeight;
// Terraforming limits // Terraforming limits
m_scene.RegionInfo.EstateSettings.terrainRaiseLimit = TerrainRaiseLimit; m_scene.RegionInfo.EstateSettings.terrainRaiseLimit = TerrainRaiseLimit;
m_scene.RegionInfo.EstateSettings.terrainLowerLimit = TerrainLowerLimit; m_scene.RegionInfo.EstateSettings.terrainLowerLimit = TerrainLowerLimit;
// Time of day / fixed sun // Time of day / fixed sun
m_scene.RegionInfo.EstateSettings.useFixedSun = UseFixedSun; m_scene.RegionInfo.EstateSettings.useFixedSun = UseFixedSun;
m_scene.RegionInfo.EstateSettings.sunHour = SunHour; m_scene.RegionInfo.EstateSettings.sunHour = SunHour;
sendRegionInfoPacketToAll(); sendRegionInfoPacketToAll();
} }
private void handleEstateRestartSimRequest(IClientAPI remoteClient, int timeInSeconds) private void handleEstateRestartSimRequest(IClientAPI remoteClient, int timeInSeconds)
{ {
m_scene.Restart(timeInSeconds); m_scene.Restart(timeInSeconds);
} }
private void handleChangeEstateCovenantRequest(IClientAPI remoteClient, LLUUID estateCovenantID) private void handleChangeEstateCovenantRequest(IClientAPI remoteClient, LLUUID estateCovenantID)
{ {
m_scene.RegionInfo.CovenantID = estateCovenantID; m_scene.RegionInfo.CovenantID = estateCovenantID;
m_scene.RegionInfo.SaveEstatecovenantUUID(estateCovenantID); m_scene.RegionInfo.SaveEstatecovenantUUID(estateCovenantID);
} }
private void handleEstateAccessDeltaRequest(IClientAPI remote_client, LLUUID invoice, int estateAccessType, LLUUID user) private void handleEstateAccessDeltaRequest(IClientAPI remote_client, LLUUID invoice, int estateAccessType, LLUUID user)
{ {
// EstateAccessDelta handles Estate Managers, Sim Access, Sim Banlist, allowed Groups.. etc. // EstateAccessDelta handles Estate Managers, Sim Access, Sim Banlist, allowed Groups.. etc.
switch (estateAccessType) switch (estateAccessType)
{ {
case 256: case 256:
// This needs to be updated for SuperEstateOwnerUser.. a non existing user in the estatesettings.xml // This needs to be updated for SuperEstateOwnerUser.. a non existing user in the estatesettings.xml
// So make sure you really trust your region owners. because they can add other estate manaagers to your other estates // So make sure you really trust your region owners. because they can add other estate manaagers to your other estates
if (remote_client.AgentId == m_scene.RegionInfo.MasterAvatarAssignedUUID || m_scene.PermissionsMngr.BypassPermissions) if (remote_client.AgentId == m_scene.RegionInfo.MasterAvatarAssignedUUID || m_scene.PermissionsMngr.BypassPermissions)
{ {
m_scene.RegionInfo.EstateSettings.AddEstateManager(user); m_scene.RegionInfo.EstateSettings.AddEstateManager(user);
remote_client.sendEstateManagersList(invoice); remote_client.sendEstateManagersList(invoice);
} }
else else
{ {
remote_client.SendAlertMessage("Method EstateAccessDelta Failed, you don't have permissions"); remote_client.SendAlertMessage("Method EstateAccessDelta Failed, you don't have permissions");
} }
break; break;
case 512: case 512:
// This needs to be updated for SuperEstateOwnerUser.. a non existing user in the estatesettings.xml // This needs to be updated for SuperEstateOwnerUser.. a non existing user in the estatesettings.xml
// So make sure you really trust your region owners. because they can add other estate manaagers to your other estates // So make sure you really trust your region owners. because they can add other estate manaagers to your other estates
if (remote_client.AgentId == m_scene.RegionInfo.MasterAvatarAssignedUUID || m_scene.PermissionsMngr.BypassPermissions) if (remote_client.AgentId == m_scene.RegionInfo.MasterAvatarAssignedUUID || m_scene.PermissionsMngr.BypassPermissions)
{ {
m_scene.RegionInfo.EstateSettings.RemoveEstateManager(user); m_scene.RegionInfo.EstateSettings.RemoveEstateManager(user);
remote_client.sendEstateManagersList(invoice); remote_client.sendEstateManagersList(invoice);
} }
else else
{ {
remote_client.SendAlertMessage("Method EstateAccessDelta Failed, you don't have permissions"); remote_client.SendAlertMessage("Method EstateAccessDelta Failed, you don't have permissions");
} }
break; break;
default: default:
m_log.Error("EstateOwnerMessage: Unknown EstateAccessType requested in estateAccessDelta"); m_log.Error("EstateOwnerMessage: Unknown EstateAccessType requested in estateAccessDelta");
break; break;
} }
} }
private void SendSimulatorBlueBoxMessage(IClientAPI remote_client, LLUUID invoice, LLUUID senderID, LLUUID sessionID, string senderName, string message) private void SendSimulatorBlueBoxMessage(IClientAPI remote_client, LLUUID invoice, LLUUID senderID, LLUUID sessionID, string senderName, string message)
{ {
m_scene.SendRegionMessageFromEstateTools(senderID, sessionID, senderName, message); m_scene.SendRegionMessageFromEstateTools(senderID, sessionID, senderName, message);
} }
private void SendEstateBlueBoxMessage(IClientAPI remote_client, LLUUID invoice, LLUUID senderID, LLUUID sessionID, string senderName, string message) private void SendEstateBlueBoxMessage(IClientAPI remote_client, LLUUID invoice, LLUUID senderID, LLUUID sessionID, string senderName, string message)
{ {
m_scene.SendEstateMessageFromEstateTools(senderID, sessionID, senderName, message); m_scene.SendEstateMessageFromEstateTools(senderID, sessionID, senderName, message);
} }
private void handleEstateDebugRegionRequest(IClientAPI remote_client, LLUUID invoice, LLUUID senderID, bool scripted, bool collisionEvents, bool physics) private void handleEstateDebugRegionRequest(IClientAPI remote_client, LLUUID invoice, LLUUID senderID, bool scripted, bool collisionEvents, bool physics)
{ {
if (physics) if (physics)
{ {
m_scene.RegionInfo.EstateSettings.regionFlags |= Simulator.RegionFlags.SkipPhysics; m_scene.RegionInfo.EstateSettings.regionFlags |= Simulator.RegionFlags.SkipPhysics;
} }
else else
{ {
m_scene.RegionInfo.EstateSettings.regionFlags &= ~Simulator.RegionFlags.SkipPhysics; m_scene.RegionInfo.EstateSettings.regionFlags &= ~Simulator.RegionFlags.SkipPhysics;
} }
if (scripted) if (scripted)
{ {
m_scene.RegionInfo.EstateSettings.regionFlags |= Simulator.RegionFlags.SkipScripts; m_scene.RegionInfo.EstateSettings.regionFlags |= Simulator.RegionFlags.SkipScripts;
} }
else else
{ {
m_scene.RegionInfo.EstateSettings.regionFlags &= ~Simulator.RegionFlags.SkipScripts; m_scene.RegionInfo.EstateSettings.regionFlags &= ~Simulator.RegionFlags.SkipScripts;
} }
m_scene.SetSceneCoreDebug(scripted, collisionEvents, physics); m_scene.SetSceneCoreDebug(scripted, collisionEvents, physics);
} }
private void handleEstateTeleportOneUserHomeRequest(IClientAPI remover_client, LLUUID invoice, LLUUID senderID, LLUUID prey) private void handleEstateTeleportOneUserHomeRequest(IClientAPI remover_client, LLUUID invoice, LLUUID senderID, LLUUID prey)
{ {
if (prey != LLUUID.Zero) if (prey != LLUUID.Zero)
{ {
ScenePresence s = m_scene.GetScenePresence(prey); ScenePresence s = m_scene.GetScenePresence(prey);
if (s != null) if (s != null)
{ {
m_scene.TeleportClientHome(prey, s.ControllingClient); m_scene.TeleportClientHome(prey, s.ControllingClient);
} }
} }
} }
private static void HandleRegionInfoRequest(IClientAPI remote_client) private static void HandleRegionInfoRequest(IClientAPI remote_client)
{ {
remote_client.sendRegionInfoToEstateMenu(); remote_client.sendRegionInfoToEstateMenu();
} }
private static void HandleEstateCovenantRequest(IClientAPI remote_client) private static void HandleEstateCovenantRequest(IClientAPI remote_client)
{ {
remote_client.sendEstateCovenantInformation(); remote_client.sendEstateCovenantInformation();
} }
#endregion #endregion
#region Outgoing Packets #region Outgoing Packets
public void sendRegionInfoPacketToAll() public void sendRegionInfoPacketToAll()
{ {
List<ScenePresence> avatars = m_scene.GetAvatars(); List<ScenePresence> avatars = m_scene.GetAvatars();
for (int i = 0; i < avatars.Count; i++) for (int i = 0; i < avatars.Count; i++)
{ {
avatars[i].ControllingClient.sendRegionInfoToEstateMenu(); avatars[i].ControllingClient.sendRegionInfoToEstateMenu();
} }
} }
public void sendRegionHandshake(IClientAPI remoteClient) public void sendRegionHandshake(IClientAPI remoteClient)
{ {
remoteClient.SendRegionHandshake(m_scene.RegionInfo); remoteClient.SendRegionHandshake(m_scene.RegionInfo);
} }
public void sendRegionHandshakeToAll() public void sendRegionHandshakeToAll()
{ {
m_scene.Broadcast( m_scene.Broadcast(
sendRegionHandshake sendRegionHandshake
); );
} }
#endregion #endregion
#region IRegionModule Members #region IRegionModule Members
public void Initialise(Scene scene, IConfigSource source) public void Initialise(Scene scene, IConfigSource source)
{ {
m_scene = scene; m_scene = scene;
m_scene.EventManager.OnNewClient += EventManager_OnNewClient; m_scene.EventManager.OnNewClient += EventManager_OnNewClient;
m_scene.EventManager.OnRequestChangeWaterHeight += changeWaterHeight; m_scene.EventManager.OnRequestChangeWaterHeight += changeWaterHeight;
} }
public void PostInitialise() public void PostInitialise()
{ {
} }
public void Close() public void Close()
{ {
} }
public string Name public string Name
{ {
get { return "EstateManagementModule"; } get { return "EstateManagementModule"; }
} }
public bool IsSharedModule public bool IsSharedModule
{ {
get { return false; } get { return false; }
} }
#endregion #endregion
#region Other Functions #region Other Functions
public void changeWaterHeight(float height) public void changeWaterHeight(float height)
{ {
setRegionTerrainSettings(height, m_scene.RegionInfo.EstateSettings.terrainRaiseLimit, m_scene.RegionInfo.EstateSettings.terrainLowerLimit, setRegionTerrainSettings(height, m_scene.RegionInfo.EstateSettings.terrainRaiseLimit, m_scene.RegionInfo.EstateSettings.terrainLowerLimit,
m_scene.RegionInfo.EstateSettings.useFixedSun, m_scene.RegionInfo.EstateSettings.sunHour); m_scene.RegionInfo.EstateSettings.useFixedSun, m_scene.RegionInfo.EstateSettings.sunHour);
sendRegionInfoPacketToAll(); sendRegionInfoPacketToAll();
} }
#endregion #endregion
private void EventManager_OnNewClient(IClientAPI client) private void EventManager_OnNewClient(IClientAPI client)
{ {
client.OnDetailedEstateDataRequest += sendDetailedEstateData; client.OnDetailedEstateDataRequest += sendDetailedEstateData;
client.OnSetEstateFlagsRequest += estateSetRegionInfoHandler; client.OnSetEstateFlagsRequest += estateSetRegionInfoHandler;
client.OnSetEstateTerrainBaseTexture += setEstateTerrainBaseTexture; client.OnSetEstateTerrainBaseTexture += setEstateTerrainBaseTexture;
client.OnSetEstateTerrainDetailTexture += setEstateTerrainDetailTexture; client.OnSetEstateTerrainDetailTexture += setEstateTerrainDetailTexture;
client.OnSetEstateTerrainTextureHeights += setEstateTerrainTextureHeights; client.OnSetEstateTerrainTextureHeights += setEstateTerrainTextureHeights;
client.OnCommitEstateTerrainTextureRequest += handleCommitEstateTerrainTextureRequest; client.OnCommitEstateTerrainTextureRequest += handleCommitEstateTerrainTextureRequest;
client.OnSetRegionTerrainSettings += setRegionTerrainSettings; client.OnSetRegionTerrainSettings += setRegionTerrainSettings;
client.OnEstateRestartSimRequest += handleEstateRestartSimRequest; client.OnEstateRestartSimRequest += handleEstateRestartSimRequest;
client.OnEstateChangeCovenantRequest += handleChangeEstateCovenantRequest; client.OnEstateChangeCovenantRequest += handleChangeEstateCovenantRequest;
client.OnUpdateEstateAccessDeltaRequest += handleEstateAccessDeltaRequest; client.OnUpdateEstateAccessDeltaRequest += handleEstateAccessDeltaRequest;
client.OnSimulatorBlueBoxMessageRequest += SendSimulatorBlueBoxMessage; client.OnSimulatorBlueBoxMessageRequest += SendSimulatorBlueBoxMessage;
client.OnEstateBlueBoxMessageRequest += SendEstateBlueBoxMessage; client.OnEstateBlueBoxMessageRequest += SendEstateBlueBoxMessage;
client.OnEstateDebugRegionRequest += handleEstateDebugRegionRequest; client.OnEstateDebugRegionRequest += handleEstateDebugRegionRequest;
client.OnEstateTeleportOneUserHomeRequest += handleEstateTeleportOneUserHomeRequest; client.OnEstateTeleportOneUserHomeRequest += handleEstateTeleportOneUserHomeRequest;
client.OnRegionInfoRequest += HandleRegionInfoRequest; client.OnRegionInfoRequest += HandleRegionInfoRequest;
client.OnEstateCovenantRequest += HandleEstateCovenantRequest; client.OnEstateCovenantRequest += HandleEstateCovenantRequest;
sendRegionHandshake(client); sendRegionHandshake(client);
} }
} }
} }

View File

@ -1,167 +1,167 @@
/* /*
* Copyright (c) Contributors, http://opensimulator.org/ * Copyright (c) Contributors, http://opensimulator.org/
* See CONTRIBUTORS.TXT for a full list of copyright holders. * See CONTRIBUTORS.TXT for a full list of copyright holders.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright * * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer. * notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright * * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the * notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution. * documentation and/or other materials provided with the distribution.
* * Neither the name of the OpenSim Project nor the * * Neither the name of the OpenSim Project nor the
* names of its contributors may be used to endorse or promote products * names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission. * derived from this software without specific prior written permission.
* *
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * 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 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
using System; using System;
using System.Drawing; using System.Drawing;
using Nini.Config; using Nini.Config;
using OpenJPEGNet; using OpenJPEGNet;
using OpenSim.Region.Environment.Interfaces; using OpenSim.Region.Environment.Interfaces;
using OpenSim.Region.Environment.Scenes; using OpenSim.Region.Environment.Scenes;
namespace OpenSim.Region.Environment.Modules.World.WorldMap namespace OpenSim.Region.Environment.Modules.World.WorldMap
{ {
internal class MapImageModule : IMapImageGenerator, IRegionModule internal class MapImageModule : IMapImageGenerator, IRegionModule
{ {
private Scene m_scene; private Scene m_scene;
#region IMapImageGenerator Members #region IMapImageGenerator Members
public byte[] WriteJpeg2000Image(string gradientmap) public byte[] WriteJpeg2000Image(string gradientmap)
{ {
byte[] imageData = null; byte[] imageData = null;
Bitmap bmp = TerrainToBitmap(gradientmap); Bitmap bmp = TerrainToBitmap(gradientmap);
try try
{ {
imageData = OpenJPEG.EncodeFromImage(bmp, true); imageData = OpenJPEG.EncodeFromImage(bmp, true);
} }
catch (Exception e) // LEGIT: Catching problems caused by OpenJPEG p/invoke catch (Exception e) // LEGIT: Catching problems caused by OpenJPEG p/invoke
{ {
Console.WriteLine("Failed generating terrain map: " + e); Console.WriteLine("Failed generating terrain map: " + e);
} }
return imageData; return imageData;
} }
#endregion #endregion
#region IRegionModule Members #region IRegionModule Members
public void Initialise(Scene scene, IConfigSource source) public void Initialise(Scene scene, IConfigSource source)
{ {
m_scene = scene; m_scene = scene;
m_scene.RegisterModuleInterface<IMapImageGenerator>(this); m_scene.RegisterModuleInterface<IMapImageGenerator>(this);
} }
public void PostInitialise() public void PostInitialise()
{ {
} }
public void Close() public void Close()
{ {
} }
public string Name public string Name
{ {
get { return "MapImageModule"; } get { return "MapImageModule"; }
} }
public bool IsSharedModule public bool IsSharedModule
{ {
get { return false; } get { return false; }
} }
#endregion #endregion
private void ShadeBuildings(Bitmap map) private void ShadeBuildings(Bitmap map)
{ {
lock (map) lock (map)
{ {
lock (m_scene.Entities) lock (m_scene.Entities)
{ {
foreach (EntityBase entity in m_scene.Entities.Values) foreach (EntityBase entity in m_scene.Entities.Values)
{ {
if (entity is SceneObjectGroup) if (entity is SceneObjectGroup)
{ {
SceneObjectGroup sog = (SceneObjectGroup) entity; SceneObjectGroup sog = (SceneObjectGroup) entity;
foreach (SceneObjectPart primitive in sog.Children.Values) foreach (SceneObjectPart primitive in sog.Children.Values)
{ {
int x = (int) (primitive.AbsolutePosition.X - (primitive.Scale.X / 2)); int x = (int) (primitive.AbsolutePosition.X - (primitive.Scale.X / 2));
int y = (int) (primitive.AbsolutePosition.Y - (primitive.Scale.Y / 2)); int y = (int) (primitive.AbsolutePosition.Y - (primitive.Scale.Y / 2));
int w = (int) primitive.Scale.X; int w = (int) primitive.Scale.X;
int h = (int) primitive.Scale.Y; int h = (int) primitive.Scale.Y;
int dx; int dx;
for (dx = x; dx < x + w; dx++) for (dx = x; dx < x + w; dx++)
{ {
int dy; int dy;
for (dy = y; dy < y + h; dy++) for (dy = y; dy < y + h; dy++)
{ {
if (x < 0 || y < 0) if (x < 0 || y < 0)
continue; continue;
if (x >= map.Width || y >= map.Height) if (x >= map.Width || y >= map.Height)
continue; continue;
map.SetPixel(dx, dy, Color.DarkGray); map.SetPixel(dx, dy, Color.DarkGray);
} }
} }
} }
} }
} }
} }
} }
} }
private Bitmap TerrainToBitmap(string gradientmap) private Bitmap TerrainToBitmap(string gradientmap)
{ {
Bitmap gradientmapLd = new Bitmap(gradientmap); Bitmap gradientmapLd = new Bitmap(gradientmap);
int pallete = gradientmapLd.Height; int pallete = gradientmapLd.Height;
Bitmap bmp = new Bitmap(m_scene.Heightmap.Width, m_scene.Heightmap.Height); Bitmap bmp = new Bitmap(m_scene.Heightmap.Width, m_scene.Heightmap.Height);
Color[] colours = new Color[pallete]; Color[] colours = new Color[pallete];
for (int i = 0; i < pallete; i++) for (int i = 0; i < pallete; i++)
{ {
colours[i] = gradientmapLd.GetPixel(0, i); colours[i] = gradientmapLd.GetPixel(0, i);
} }
lock (m_scene.Heightmap) lock (m_scene.Heightmap)
{ {
ITerrainChannel copy = m_scene.Heightmap; ITerrainChannel copy = m_scene.Heightmap;
for (int y = 0; y < copy.Height; y++) for (int y = 0; y < copy.Height; y++)
{ {
for (int x = 0; x < copy.Width; x++) for (int x = 0; x < copy.Width; x++)
{ {
// 512 is the largest possible height before colours clamp // 512 is the largest possible height before colours clamp
int colorindex = (int) (Math.Max(Math.Min(1.0, copy[x, y] / 512.0), 0.0) * (pallete - 1)); int colorindex = (int) (Math.Max(Math.Min(1.0, copy[x, y] / 512.0), 0.0) * (pallete - 1));
// Handle error conditions // Handle error conditions
if (colorindex > pallete - 1 || colorindex < 0) if (colorindex > pallete - 1 || colorindex < 0)
bmp.SetPixel(x, copy.Height - y - 1, Color.Red); bmp.SetPixel(x, copy.Height - y - 1, Color.Red);
else else
bmp.SetPixel(x, copy.Height - y - 1, colours[colorindex]); bmp.SetPixel(x, copy.Height - y - 1, colours[colorindex]);
} }
} }
ShadeBuildings(bmp); ShadeBuildings(bmp);
return bmp; return bmp;
} }
} }
} }
} }