Merge branch 'master' of git://opensimulator.org/git/opensim

iar_mods
Dan Lake 2011-11-23 16:11:17 -08:00
commit 5485e3da46
11 changed files with 231 additions and 27 deletions

View File

@ -70,7 +70,7 @@ namespace OpenSim
/// <param name="networkInfo"></param> /// <param name="networkInfo"></param>
/// <returns>A configuration that gets passed to modules</returns> /// <returns>A configuration that gets passed to modules</returns>
public OpenSimConfigSource LoadConfigSettings( public OpenSimConfigSource LoadConfigSettings(
IConfigSource argvSource, out ConfigSettings configSettings, IConfigSource argvSource, EnvConfigSource envConfigSource, out ConfigSettings configSettings,
out NetworkServersInfo networkInfo) out NetworkServersInfo networkInfo)
{ {
m_configSettings = configSettings = new ConfigSettings(); m_configSettings = configSettings = new ConfigSettings();
@ -195,6 +195,24 @@ namespace OpenSim
// Make sure command line options take precedence // Make sure command line options take precedence
m_config.Source.Merge(argvSource); m_config.Source.Merge(argvSource);
IConfig enVars = m_config.Source.Configs["Environment"];
if( enVars != null )
{
string[] env_keys = enVars.GetKeys();
foreach ( string key in env_keys )
{
envConfigSource.AddEnv(key, string.Empty);
}
envConfigSource.LoadEnv();
m_config.Source.Merge(envConfigSource);
m_config.Source.ExpandKeyValues();
}
ReadConfigSettings(); ReadConfigSettings();
return m_config; return m_config;

View File

@ -108,6 +108,13 @@ namespace OpenSim
get { return m_clientServers; } get { return m_clientServers; }
} }
protected EnvConfigSource m_EnvConfigSource = new EnvConfigSource();
public EnvConfigSource envConfigSource
{
get { return m_EnvConfigSource; }
}
protected List<IClientNetworkServer> m_clientServers = new List<IClientNetworkServer>(); protected List<IClientNetworkServer> m_clientServers = new List<IClientNetworkServer>();
public uint HttpServerPort public uint HttpServerPort
@ -142,7 +149,7 @@ namespace OpenSim
protected virtual void LoadConfigSettings(IConfigSource configSource) protected virtual void LoadConfigSettings(IConfigSource configSource)
{ {
m_configLoader = new ConfigurationLoader(); m_configLoader = new ConfigurationLoader();
m_config = m_configLoader.LoadConfigSettings(configSource, out m_configSettings, out m_networkServersInfo); m_config = m_configLoader.LoadConfigSettings(configSource, envConfigSource, out m_configSettings, out m_networkServersInfo);
ReadExtraConfigSettings(); ReadExtraConfigSettings();
} }

View File

@ -109,11 +109,13 @@ namespace OpenSim.Tests
// Prepare call to ConfigurationLoader.LoadConfigSettings() // Prepare call to ConfigurationLoader.LoadConfigSettings()
ConfigurationLoader cl = new ConfigurationLoader(); ConfigurationLoader cl = new ConfigurationLoader();
IConfigSource argvSource = new IniConfigSource(); IConfigSource argvSource = new IniConfigSource();
EnvConfigSource envConfigSource = new EnvConfigSource();
argvSource.AddConfig("Startup").Set("inifile", mainIniFile); argvSource.AddConfig("Startup").Set("inifile", mainIniFile);
ConfigSettings configSettings; ConfigSettings configSettings;
NetworkServersInfo networkInfo; NetworkServersInfo networkInfo;
OpenSimConfigSource source = cl.LoadConfigSettings(argvSource, out configSettings, out networkInfo); OpenSimConfigSource source = cl.LoadConfigSettings(argvSource, envConfigSource,
out configSettings, out networkInfo);
// Remove default config // Remove default config
config = source.Source.Configs["Startup"]; config = source.Source.Configs["Startup"];

View File

@ -41,6 +41,8 @@ namespace pCampBot
/// </remarks> /// </remarks>
public class GrabbingBehaviour : IBehaviour public class GrabbingBehaviour : IBehaviour
{ {
public string Name { get { return "Grabbing"; } }
public void Action(Bot bot) public void Action(Bot bot)
{ {
Dictionary<UUID, Primitive> objects = bot.Objects; Dictionary<UUID, Primitive> objects = bot.Objects;

View File

@ -42,6 +42,8 @@ namespace pCampBot
/// </remarks> /// </remarks>
public class PhysicsBehaviour : IBehaviour public class PhysicsBehaviour : IBehaviour
{ {
public string Name { get { return "Physics"; } }
private string[] talkarray; private string[] talkarray;
public PhysicsBehaviour() public PhysicsBehaviour()

View File

@ -0,0 +1,75 @@
/*
* 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 OpenSimulator 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 System.Collections.Generic;
using System.Linq;
using System.Reflection;
using log4net;
using OpenMetaverse;
using pCampBot.Interfaces;
namespace pCampBot
{
/// <summary>
/// Teleport to a random region on the grid.
/// </summary>
public class TeleportBehaviour : IBehaviour
{
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
public string Name { get { return "Teleport"; } }
public void Action(Bot bot)
{
Random rng = bot.Manager.Rng;
GridRegion[] knownRegions;
lock (bot.Manager.RegionsKnown)
{
if (bot.Manager.RegionsKnown.Count == 0)
{
m_log.DebugFormat(
"[TELEPORT BEHAVIOUR]: Ignoring teleport action for {0} since no regions are known yet", bot.Name);
return;
}
knownRegions = bot.Manager.RegionsKnown.Values.ToArray();
}
Simulator sourceRegion = bot.Client.Network.CurrentSim;
GridRegion destRegion = knownRegions[rng.Next(knownRegions.Length)];
Vector3 destPosition = new Vector3(rng.Next(255), rng.Next(255), 50);
m_log.DebugFormat(
"[TELEPORT BEHAVIOUR]: Teleporting {0} from {1} {2} to {3} {4}",
bot.Name, sourceRegion.Name, bot.Client.Self.SimPosition, destRegion.Name, destPosition);
bot.Client.Self.Teleport(destRegion.RegionHandle, destPosition);
}
}
}

View File

@ -49,8 +49,15 @@ namespace pCampBot
public delegate void AnEvent(Bot callbot, EventType someevent); // event delegate for bot events public delegate void AnEvent(Bot callbot, EventType someevent); // event delegate for bot events
public BotManager BotManager { get; private set; } /// <summary>
private IConfig startupConfig; // bot config, passed from BotManager /// Bot manager.
/// </summary>
public BotManager Manager { get; private set; }
/// <summary>
/// Bot config, passed from BotManager.
/// </summary>
private IConfig startupConfig;
/// <summary> /// <summary>
/// Behaviours implemented by this bot. /// Behaviours implemented by this bot.
@ -132,7 +139,7 @@ namespace pCampBot
Password = password; Password = password;
LoginUri = loginUri; LoginUri = loginUri;
BotManager = bm; Manager = bm;
startupConfig = bm.Config; startupConfig = bm.Config;
readconfig(); readconfig();
@ -218,7 +225,19 @@ namespace pCampBot
{ {
MakeDefaultAppearance(wear); MakeDefaultAppearance(wear);
} }
Client.Self.Jump(true); Client.Self.Jump(true);
// Extract nearby region information.
Client.Grid.GridRegion += Manager.Grid_GridRegion;
uint xUint, yUint;
Utils.LongToUInts(Client.Network.CurrentSim.Handle, out xUint, out yUint);
ushort minX, minY, maxX, maxY;
minX = (ushort)Math.Min(0, xUint - 5);
minY = (ushort)Math.Min(0, yUint - 5);
maxX = (ushort)(xUint + 5);
maxY = (ushort)(yUint + 5);
Client.Grid.RequestMapBlocks(GridLayerType.Terrain, minX, minY, maxX, maxY, false);
} }
else else
{ {
@ -472,13 +491,13 @@ namespace pCampBot
private void GetTexture(UUID textureID) private void GetTexture(UUID textureID)
{ {
lock (BotManager.AssetsReceived) lock (Manager.AssetsReceived)
{ {
// Don't request assets more than once. // Don't request assets more than once.
if (BotManager.AssetsReceived.ContainsKey(textureID)) if (Manager.AssetsReceived.ContainsKey(textureID))
return; return;
BotManager.AssetsReceived[textureID] = false; Manager.AssetsReceived[textureID] = false;
Client.Assets.RequestImage(textureID, ImageType.Normal, Asset_TextureCallback_Texture); Client.Assets.RequestImage(textureID, ImageType.Normal, Asset_TextureCallback_Texture);
} }
} }
@ -490,8 +509,8 @@ namespace pCampBot
public void Asset_ReceivedCallback(AssetDownload transfer, Asset asset) public void Asset_ReceivedCallback(AssetDownload transfer, Asset asset)
{ {
lock (BotManager.AssetsReceived) lock (Manager.AssetsReceived)
BotManager.AssetsReceived[asset.AssetID] = true; Manager.AssetsReceived[asset.AssetID] = true;
// if (wear == "save") // if (wear == "save")
// { // {

View File

@ -27,6 +27,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using System.Reflection; using System.Reflection;
using System.Threading; using System.Threading;
using OpenMetaverse; using OpenMetaverse;
@ -48,9 +49,24 @@ namespace pCampBot
{ {
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
/// <summary>
/// Command console
/// </summary>
protected CommandConsole m_console; protected CommandConsole m_console;
/// <summary>
/// Created bots, whether active or inactive.
/// </summary>
protected List<Bot> m_lBot; protected List<Bot> m_lBot;
protected Random somthing = new Random(Environment.TickCount);
/// <summary>
/// Random number generator.
/// </summary>
public Random Rng { get; private set; }
/// <summary>
/// Overall configuration.
/// </summary>
public IConfig Config { get; private set; } public IConfig Config { get; private set; }
/// <summary> /// <summary>
@ -58,12 +74,19 @@ namespace pCampBot
/// </summary> /// </summary>
public Dictionary<UUID, bool> AssetsReceived { get; private set; } public Dictionary<UUID, bool> AssetsReceived { get; private set; }
/// <summary>
/// The regions that we know about.
/// </summary>
public Dictionary<ulong, GridRegion> RegionsKnown { get; private set; }
/// <summary> /// <summary>
/// Constructor Creates MainConsole.Instance to take commands and provide the place to write data /// Constructor Creates MainConsole.Instance to take commands and provide the place to write data
/// </summary> /// </summary>
public BotManager() public BotManager()
{ {
Rng = new Random(Environment.TickCount);
AssetsReceived = new Dictionary<UUID, bool>(); AssetsReceived = new Dictionary<UUID, bool>();
RegionsKnown = new Dictionary<ulong, GridRegion>();
m_console = CreateConsole(); m_console = CreateConsole();
MainConsole.Instance = m_console; MainConsole.Instance = m_console;
@ -93,8 +116,13 @@ namespace pCampBot
"Shutdown bots and exit", "Shutdown bots and exit",
HandleShutdown); HandleShutdown);
m_console.Commands.AddCommand("bot", false, "show status", m_console.Commands.AddCommand("bot", false, "show regions",
"show status", "show regions",
"Show regions known to bots",
HandleShowRegions);
m_console.Commands.AddCommand("bot", false, "show bots",
"show bots",
"Shows the status of all bots", "Shows the status of all bots",
HandleShowStatus); HandleShowStatus);
@ -123,19 +151,26 @@ namespace pCampBot
Array.ForEach<string>( Array.ForEach<string>(
cs.GetString("behaviours", "p").Split(new char[] { ',' }), b => behaviourSwitches.Add(b)); cs.GetString("behaviours", "p").Split(new char[] { ',' }), b => behaviourSwitches.Add(b));
List<IBehaviour> behaviours = new List<IBehaviour>();
// Hard-coded for now
if (behaviourSwitches.Contains("p"))
behaviours.Add(new PhysicsBehaviour());
if (behaviourSwitches.Contains("g"))
behaviours.Add(new GrabbingBehaviour());
if (behaviourSwitches.Contains("t"))
behaviours.Add(new TeleportBehaviour());
MainConsole.Instance.OutputFormat(
"[BOT MANAGER]: Bots configured for behaviours {0}",
string.Join(",", behaviours.ConvertAll<string>(b => b.Name).ToArray()));
for (int i = 0; i < botcount; i++) for (int i = 0; i < botcount; i++)
{ {
string lastName = string.Format("{0}_{1}", lastNameStem, i); string lastName = string.Format("{0}_{1}", lastNameStem, i);
List<IBehaviour> behaviours = new List<IBehaviour>();
// Hard-coded for now
if (behaviourSwitches.Contains("p"))
behaviours.Add(new PhysicsBehaviour());
if (behaviourSwitches.Contains("g"))
behaviours.Add(new GrabbingBehaviour());
StartBot(this, behaviours, firstName, lastName, password, loginUri); StartBot(this, behaviours, firstName, lastName, password, loginUri);
} }
} }
@ -240,17 +275,33 @@ namespace pCampBot
}); });
} }
private void HandleShowRegions(string module, string[] cmd)
{
string outputFormat = "{0,-30} {1, -20} {2, -5} {3, -5}";
MainConsole.Instance.OutputFormat(outputFormat, "Name", "Handle", "X", "Y");
lock (RegionsKnown)
{
foreach (GridRegion region in RegionsKnown.Values)
{
MainConsole.Instance.OutputFormat(
outputFormat, region.Name, region.RegionHandle, region.X, region.Y);
}
}
}
private void HandleShowStatus(string module, string[] cmd) private void HandleShowStatus(string module, string[] cmd)
{ {
string outputFormat = "{0,-30} {1,-14}"; string outputFormat = "{0,-30} {1, -30} {2,-14}";
MainConsole.Instance.OutputFormat(outputFormat, "Name", "Status"); MainConsole.Instance.OutputFormat(outputFormat, "Name", "Region", "Status");
lock (m_lBot) lock (m_lBot)
{ {
foreach (Bot pb in m_lBot) foreach (Bot pb in m_lBot)
{ {
MainConsole.Instance.OutputFormat( MainConsole.Instance.OutputFormat(
outputFormat, pb.Name, (pb.IsConnected ? "Connected" : "Disconnected")); outputFormat,
pb.Name, pb.Client.Network.CurrentSim.Name, pb.IsConnected ? "Connected" : "Disconnected");
} }
} }
} }
@ -274,5 +325,24 @@ namespace pCampBot
// if (newbots > 0) // if (newbots > 0)
// addbots(newbots); // addbots(newbots);
// } // }
internal void Grid_GridRegion(object o, GridRegionEventArgs args)
{
lock (RegionsKnown)
{
GridRegion newRegion = args.Region;
if (RegionsKnown.ContainsKey(newRegion.RegionHandle))
{
return;
}
else
{
m_log.DebugFormat(
"[BOT MANAGER]: Adding {0} {1} to known regions", newRegion.Name, newRegion.RegionHandle);
RegionsKnown[newRegion.RegionHandle] = newRegion;
}
}
}
} }
} }

View File

@ -31,6 +31,15 @@ namespace pCampBot.Interfaces
{ {
public interface IBehaviour public interface IBehaviour
{ {
/// <summary>
/// Name of this behaviour.
/// </summary>
string Name { get; }
/// <summary>
/// Action to take when this behaviour is invoked.
/// </summary>
/// <param name="bot"></param>
void Action(Bot bot); void Action(Bot bot);
} }
} }

View File

@ -111,7 +111,7 @@ namespace pCampBot
" -firstname first name for the bots\n" + " -firstname first name for the bots\n" +
" -lastname lastname for the bots. Each lastname will have _<bot-number> appended, e.g. Ima Bot_0\n" + " -lastname lastname for the bots. Each lastname will have _<bot-number> appended, e.g. Ima Bot_0\n" +
" -password password for the bots\n" + " -password password for the bots\n" +
" -b, behaviours behaviours for bots. Current options p (physics), g (grab). Comma separated, e.g. p,g. Default is p", " -b, behaviours behaviours for bots. Current options p (physics), g (grab), t (teleport). Comma separated, e.g. p,g. Default is p",
" -wear set appearance folder to load from (default: no)\n" + " -wear set appearance folder to load from (default: no)\n" +
" -h, -help show this message" " -h, -help show this message"
); );

Binary file not shown.