Merge branch 'master' into bulletsim

bulletsim
Mic Bowman 2011-08-05 11:13:02 -07:00
commit c3f579046c
80 changed files with 2093 additions and 2018 deletions

View File

@ -488,11 +488,11 @@ namespace OpenSim.ApplicationPlugins.Rest.Inventory
rdata.userAppearance.AvatarHeight = (float) Convert.ToDouble(xml.Value);
indata = true;
}
if (xml.MoveToAttribute("Owner"))
{
rdata.userAppearance.Owner = (UUID)xml.Value;
indata = true;
}
// if (xml.MoveToAttribute("Owner"))
// {
// rdata.userAppearance.Owner = (UUID)xml.Value;
// indata = true;
// }
if (xml.MoveToAttribute("Serial"))
{
rdata.userAppearance.Serial = Convert.ToInt32(xml.Value);
@ -747,8 +747,8 @@ namespace OpenSim.ApplicationPlugins.Rest.Inventory
rdata.writer.WriteStartElement("Appearance");
rdata.writer.WriteAttributeString("Height", rdata.userAppearance.AvatarHeight.ToString());
if (rdata.userAppearance.Owner != UUID.Zero)
rdata.writer.WriteAttributeString("Owner", rdata.userAppearance.Owner.ToString());
// if (rdata.userAppearance.Owner != UUID.Zero)
// rdata.writer.WriteAttributeString("Owner", rdata.userAppearance.Owner.ToString());
rdata.writer.WriteAttributeString("Serial", rdata.userAppearance.Serial.ToString());
/*

View File

@ -168,8 +168,8 @@ namespace OpenSim.ApplicationPlugins.Rest.Inventory.Tests
float x = Convert.ToSingle(rdata.Parameters[PARM_MOVE_X]);
float y = Convert.ToSingle(rdata.Parameters[PARM_MOVE_Y]);
float z = Convert.ToSingle(rdata.Parameters[PARM_MOVE_Z]);
Vector3 vector = new Vector3(x,y,z);
presence.DoAutoPilot(0,vector,presence.ControllingClient);
Vector3 vector = new Vector3(x, y, z);
presence.MoveToTarget(vector);
}
catch (Exception e)
{

View File

@ -296,11 +296,12 @@ namespace OpenSim.Framework
if (args["start_pos"] != null)
Vector3.TryParse(args["start_pos"].AsString(), out startpos);
m_log.InfoFormat("[AGENTCIRCUITDATA] agentid={0}, child={1}, startpos={2}",AgentID,child,startpos.ToString());
m_log.InfoFormat("[AGENTCIRCUITDATA]: agentid={0}, child={1}, startpos={2}", AgentID, child, startpos);
try {
try
{
// Unpack various appearance elements
Appearance = new AvatarAppearance(AgentID);
Appearance = new AvatarAppearance();
// Eventually this code should be deprecated, use full appearance
// packing in packed_appearance
@ -313,7 +314,9 @@ namespace OpenSim.Framework
m_log.InfoFormat("[AGENTCIRCUITDATA] unpacked appearance");
}
else
m_log.Warn("[AGENTCIRCUITDATA] failed to find a valid packed_appearance");
{
m_log.Warn("[AGENTCIRCUITDATA]: failed to find a valid packed_appearance");
}
}
catch (Exception e)
{

View File

@ -47,7 +47,6 @@ namespace OpenSim.Framework
public readonly static int TEXTURE_COUNT = 21;
public readonly static byte[] BAKE_INDICES = new byte[] { 8, 9, 10, 11, 19, 20 };
protected UUID m_owner;
protected int m_serial = 0;
protected byte[] m_visualparams;
protected Primitive.TextureEntry m_texture;
@ -56,12 +55,6 @@ namespace OpenSim.Framework
protected float m_avatarHeight = 0;
protected float m_hipOffset = 0;
public virtual UUID Owner
{
get { return m_owner; }
set { m_owner = value; }
}
public virtual int Serial
{
get { return m_serial; }
@ -77,7 +70,11 @@ namespace OpenSim.Framework
public virtual Primitive.TextureEntry Texture
{
get { return m_texture; }
set { m_texture = value; }
set
{
// m_log.DebugFormat("[AVATAR APPEARANCE]: Set TextureEntry to {0}", value);
m_texture = value;
}
}
public virtual AvatarWearable[] Wearables
@ -97,38 +94,31 @@ namespace OpenSim.Framework
get { return m_hipOffset; }
}
public AvatarAppearance() : this(UUID.Zero) {}
public AvatarAppearance(UUID owner)
public AvatarAppearance()
{
// m_log.WarnFormat("[AVATAR APPEARANCE]: create empty appearance for {0}",owner);
// m_log.WarnFormat("[AVATAR APPEARANCE]: create empty appearance");
m_serial = 0;
m_owner = owner;
SetDefaultWearables();
SetDefaultTexture();
SetDefaultParams();
SetHeight();
m_attachments = new Dictionary<int, List<AvatarAttachment>>();
}
public AvatarAppearance(UUID avatarID, OSDMap map)
public AvatarAppearance(OSDMap map)
{
// m_log.WarnFormat("[AVATAR APPEARANCE]: create appearance for {0} from OSDMap",avatarID);
// m_log.WarnFormat("[AVATAR APPEARANCE]: create appearance from OSDMap");
m_owner = avatarID;
Unpack(map);
SetHeight();
}
public AvatarAppearance(UUID avatarID, AvatarWearable[] wearables, Primitive.TextureEntry textureEntry, byte[] visualParams)
public AvatarAppearance(AvatarWearable[] wearables, Primitive.TextureEntry textureEntry, byte[] visualParams)
{
// m_log.WarnFormat("[AVATAR APPEARANCE] create initialized appearance for {0}",avatarID);
// m_log.WarnFormat("[AVATAR APPEARANCE] create initialized appearance");
m_serial = 0;
m_owner = avatarID;
if (wearables != null)
m_wearables = wearables;
@ -161,24 +151,21 @@ namespace OpenSim.Framework
if (appearance == null)
{
m_serial = 0;
m_owner = UUID.Zero;
SetDefaultWearables();
SetDefaultTexture();
SetDefaultParams();
SetHeight();
m_attachments = new Dictionary<int, List<AvatarAttachment>>();
return;
}
m_serial = appearance.Serial;
m_owner = appearance.Owner;
m_wearables = new AvatarWearable[AvatarWearable.MAX_WEARABLES];
for (int i = 0; i < AvatarWearable.MAX_WEARABLES; i++)
m_wearables[i] = new AvatarWearable();
if (copyWearables && (appearance.Wearables != null))
{
for (int i = 0; i < AvatarWearable.MAX_WEARABLES; i++)

View File

@ -593,7 +593,7 @@ namespace OpenSim.Framework
// AgentTextures[i++] = o.AsUUID();
//}
Appearance = new AvatarAppearance(AgentID);
Appearance = new AvatarAppearance();
// The code to unpack textures, visuals, wearables and attachments
// should be removed; packed appearance contains the full appearance
@ -635,7 +635,7 @@ namespace OpenSim.Framework
// end of code to remove
if (args.ContainsKey("packed_appearance") && (args["packed_appearance"]).Type == OSDType.Map)
Appearance = new AvatarAppearance(AgentID,(OSDMap)args["packed_appearance"]);
Appearance = new AvatarAppearance((OSDMap)args["packed_appearance"]);
else
m_log.WarnFormat("[CHILDAGENTDATAUPDATE] No packed appearance");

View File

@ -935,7 +935,7 @@ namespace OpenSim.Framework
event ScriptReset OnScriptReset;
event GetScriptRunning OnGetScriptRunning;
event SetScriptRunning OnSetScriptRunning;
event UpdateVector OnAutoPilotGo;
event Action<Vector3> OnAutoPilotGo;
event TerrainUnacked OnUnackedTerrain;
event ActivateGesture OnActivateGesture;
@ -1395,7 +1395,7 @@ namespace OpenSim.Framework
void SendGroupTransactionsSummaryDetails(IClientAPI sender,UUID groupID, UUID transactionID, UUID sessionID,int amt);
void SendChangeUserRights(UUID agentID, UUID friendID, int rights);
void SendTextBoxRequest(string message, int chatChannel, string objectname, string ownerFirstName, string ownerLastName, UUID objectId);
void SendTextBoxRequest(string message, int chatChannel, string objectname, UUID ownerID, string ownerFirstName, string ownerLastName, UUID objectId);
void StopFlying(ISceneEntity presence);

View File

@ -27,13 +27,15 @@
using System;
using System.Collections.Generic;
using System.Reflection;
using log4net;
using OpenMetaverse;
namespace OpenSim.Framework
{
public class InventoryFolderImpl : InventoryFolderBase
{
//private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
public static readonly string PATH_DELIMITER = "/";
@ -402,6 +404,10 @@ namespace OpenSim.Framework
{
foreach (InventoryItemBase item in Items.Values)
{
// m_log.DebugFormat(
// "[INVENTORY FOLDER IMPL]: Returning item {0} {1}, OwnerPermissions {2:X}",
// item.Name, item.ID, item.CurrentPermissions);
itemList.Add(item);
}
}

View File

@ -144,6 +144,7 @@ namespace OpenSim.Framework
m_log.WarnFormat("[PACKETPOOL]: Failed to get packet of type {0}", type);
else
packet.FromBytes(bytes, ref i, ref packetEnd, zeroBuffer);
return packet;
}
@ -160,19 +161,18 @@ namespace OpenSim.Framework
case PacketType.ObjectUpdate:
ObjectUpdatePacket oup = (ObjectUpdatePacket)packet;
foreach (ObjectUpdatePacket.ObjectDataBlock oupod in
oup.ObjectData)
foreach (ObjectUpdatePacket.ObjectDataBlock oupod in oup.ObjectData)
ReturnDataBlock<ObjectUpdatePacket.ObjectDataBlock>(oupod);
oup.ObjectData = null;
break;
case PacketType.ImprovedTerseObjectUpdate:
ImprovedTerseObjectUpdatePacket itoup =
(ImprovedTerseObjectUpdatePacket)packet;
ImprovedTerseObjectUpdatePacket itoup = (ImprovedTerseObjectUpdatePacket)packet;
foreach (ImprovedTerseObjectUpdatePacket.ObjectDataBlock
itoupod in itoup.ObjectData)
foreach (ImprovedTerseObjectUpdatePacket.ObjectDataBlock itoupod in itoup.ObjectData)
ReturnDataBlock<ImprovedTerseObjectUpdatePacket.ObjectDataBlock>(itoupod);
itoup.ObjectData = null;
break;
}
@ -194,6 +194,7 @@ namespace OpenSim.Framework
{
pool[type] = new Stack<Packet>();
}
if ((pool[type]).Count < 50)
{
(pool[type]).Push(packet);
@ -223,6 +224,7 @@ namespace OpenSim.Framework
{
DataBlocks[typeof(T)] = new Stack<Object>();
}
return new T();
}
}
@ -234,6 +236,9 @@ namespace OpenSim.Framework
lock (DataBlocks)
{
if (!DataBlocks.ContainsKey(typeof(T)))
DataBlocks[typeof(T)] = new Stack<Object>();
if (DataBlocks[typeof(T)].Count < 50)
DataBlocks[typeof(T)].Push(block);
}

View File

@ -64,7 +64,7 @@ namespace OpenSim.Framework.Tests
SecureSessionId = UUID.Random();
SessionId = UUID.Random();
AvAppearance = new AvatarAppearance(AgentId);
AvAppearance = new AvatarAppearance();
VisualParams = new byte[218];
//body

View File

@ -68,7 +68,7 @@ namespace OpenSim.Framework.Tests
m_agentCircuitData1 = new AgentCircuitData();
m_agentCircuitData1.AgentID = AgentId1;
m_agentCircuitData1.Appearance = new AvatarAppearance(AgentId1);
m_agentCircuitData1.Appearance = new AvatarAppearance();
m_agentCircuitData1.BaseFolder = BaseFolder;
m_agentCircuitData1.CapsPath = CapsPath;
m_agentCircuitData1.child = false;
@ -83,7 +83,7 @@ namespace OpenSim.Framework.Tests
m_agentCircuitData2 = new AgentCircuitData();
m_agentCircuitData2.AgentID = AgentId2;
m_agentCircuitData2.Appearance = new AvatarAppearance(AgentId2);
m_agentCircuitData2.Appearance = new AvatarAppearance();
m_agentCircuitData2.BaseFolder = BaseFolder;
m_agentCircuitData2.CapsPath = CapsPath;
m_agentCircuitData2.child = false;

View File

@ -1499,25 +1499,30 @@ namespace OpenSim.Framework
public static void FireAndForget(System.Threading.WaitCallback callback, object obj)
{
// When OpenSim interacts with a database or sends data over the wire, it must send this in en_US culture
// so that we don't encounter problems where, for instance, data is saved with a culture that uses commas
// for decimals places but is read by a culture that treats commas as number seperators.
WaitCallback realCallback = delegate(object o) { Culture.SetCurrentCulture(); callback(o); };
switch (FireAndForgetMethod)
{
case FireAndForgetMethod.UnsafeQueueUserWorkItem:
ThreadPool.UnsafeQueueUserWorkItem(callback, obj);
ThreadPool.UnsafeQueueUserWorkItem(realCallback, obj);
break;
case FireAndForgetMethod.QueueUserWorkItem:
ThreadPool.QueueUserWorkItem(callback, obj);
ThreadPool.QueueUserWorkItem(realCallback, obj);
break;
case FireAndForgetMethod.BeginInvoke:
FireAndForgetWrapper wrapper = FireAndForgetWrapper.Instance;
wrapper.FireAndForget(callback, obj);
wrapper.FireAndForget(realCallback, obj);
break;
case FireAndForgetMethod.SmartThreadPool:
if (m_ThreadPool == null)
m_ThreadPool = new SmartThreadPool(2000, 15, 2);
m_ThreadPool.QueueWorkItem(SmartThreadPoolCallback, new object[] { callback, obj });
m_ThreadPool.QueueWorkItem(SmartThreadPoolCallback, new object[] { realCallback, obj });
break;
case FireAndForgetMethod.Thread:
Thread thread = new Thread(delegate(object o) { callback(o); });
Thread thread = new Thread(delegate(object o) { realCallback(o); });
thread.Start(obj);
break;
default:

View File

@ -73,6 +73,7 @@ namespace OpenSim
AppDomain.CurrentDomain.UnhandledException +=
new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
// Add the arguments supplied when running the application to the configuration
ArgvConfigSource configSource = new ArgvConfigSource(args);
@ -91,6 +92,9 @@ namespace OpenSim
m_log.Info("[OPENSIM MAIN]: configured log4net using default OpenSim.exe.config");
}
m_log.DebugFormat(
"[OPENSIM MAIN]: System Locale is {0}", System.Threading.Thread.CurrentThread.CurrentCulture);
// Increase the number of IOCP threads available. Mono defaults to a tragically low number
int workerThreads, iocpThreads;
System.Threading.ThreadPool.GetMaxThreads(out workerThreads, out iocpThreads);

View File

@ -130,7 +130,9 @@ namespace OpenSim
//m_log.InfoFormat("[OPENSIM MAIN]: GC Latency Mode: {0}", GCSettings.LatencyMode.ToString());
if (m_gui) // Driven by external GUI
{
m_console = new CommandConsole("Region");
}
else
{
switch (m_consoleType)

View File

@ -48,8 +48,8 @@ namespace OpenSim.Region.ClientStack.Linden
[Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule")]
public class BunchOfCapsModule : INonSharedRegionModule
{
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;

View File

@ -48,8 +48,8 @@ namespace OpenSim.Region.ClientStack.Linden
[Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule")]
public class MeshUploadFlagModule : INonSharedRegionModule
{
private static readonly ILog m_log =
LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
// private static readonly ILog m_log =
// LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
/// <summary>
/// Is this module enabled?

View File

@ -231,7 +231,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
public event ScriptReset OnScriptReset;
public event GetScriptRunning OnGetScriptRunning;
public event SetScriptRunning OnSetScriptRunning;
public event UpdateVector OnAutoPilotGo;
public event Action<Vector3> OnAutoPilotGo;
public event TerrainUnacked OnUnackedTerrain;
public event ActivateGesture OnActivateGesture;
public event DeactivateGesture OnDeactivateGesture;
@ -5266,6 +5266,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
AddLocalPacketHandler(PacketType.GroupVoteHistoryRequest, HandleGroupVoteHistoryRequest);
AddLocalPacketHandler(PacketType.SimWideDeletes, HandleSimWideDeletes);
AddLocalPacketHandler(PacketType.SendPostcard, HandleSendPostcard);
AddGenericPacketHandler("autopilot", HandleAutopilot);
}
#region Packet Handlers
@ -5308,7 +5310,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP
);
}
else
{
update = true;
}
// These should be ordered from most-likely to
// least likely to change. I've made an initial
@ -5316,6 +5320,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
if (update)
{
// m_log.DebugFormat("[LLCLIENTVIEW]: Triggered AgentUpdate for {0}", sener.Name);
AgentUpdateArgs arg = new AgentUpdateArgs();
arg.AgentID = x.AgentID;
arg.BodyRotation = x.BodyRotation;
@ -11609,55 +11615,22 @@ namespace OpenSim.Region.ClientStack.LindenUDP
return false;
}
/// <summary>
/// Breaks down the genericMessagePacket into specific events
/// </summary>
/// <param name="gmMethod"></param>
/// <param name="gmInvoice"></param>
/// <param name="gmParams"></param>
public void DecipherGenericMessage(string gmMethod, UUID gmInvoice, GenericMessagePacket.ParamListBlock[] gmParams)
protected void HandleAutopilot(Object sender, string method, List<String> args)
{
switch (gmMethod)
{
case "autopilot":
float locx;
float locy;
float locz;
float locx = 0;
float locy = 0;
float locz = 0;
uint regionX = 0;
uint regionY = 0;
try
{
uint regionX;
uint regionY;
Utils.LongToUInts(Scene.RegionInfo.RegionHandle, out regionX, out regionY);
locx = Convert.ToSingle(Utils.BytesToString(gmParams[0].Parameter)) - regionX;
locy = Convert.ToSingle(Utils.BytesToString(gmParams[1].Parameter)) - regionY;
locz = Convert.ToSingle(Utils.BytesToString(gmParams[2].Parameter));
}
catch (InvalidCastException)
{
m_log.Error("[CLIENT]: Invalid autopilot request");
return;
}
Utils.LongToUInts(m_scene.RegionInfo.RegionHandle, out regionX, out regionY);
locx = Convert.ToSingle(args[0]) - (float)regionX;
locy = Convert.ToSingle(args[1]) - (float)regionY;
locz = Convert.ToSingle(args[2]);
UpdateVector handlerAutoPilotGo = OnAutoPilotGo;
if (handlerAutoPilotGo != null)
{
handlerAutoPilotGo(0, new Vector3(locx, locy, locz), this);
}
m_log.InfoFormat("[CLIENT]: Client Requests autopilot to position <{0},{1},{2}>", locx, locy, locz);
break;
default:
m_log.Debug("[CLIENT]: Unknown Generic Message, Method: " + gmMethod + ". Invoice: " + gmInvoice + ". Dumping Params:");
for (int hi = 0; hi < gmParams.Length; hi++)
{
Console.WriteLine(gmParams[hi].ToString());
}
//gmpack.MethodData.
break;
}
Action<Vector3> handlerAutoPilotGo = OnAutoPilotGo;
if (handlerAutoPilotGo != null)
handlerAutoPilotGo(new Vector3(locx, locy, locz));
}
/// <summary>
@ -12083,7 +12056,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
OutPacket(packet, ThrottleOutPacketType.Task);
}
public void SendTextBoxRequest(string message, int chatChannel, string objectname, string ownerFirstName, string ownerLastName, UUID objectId)
public void SendTextBoxRequest(string message, int chatChannel, string objectname, UUID ownerID, string ownerFirstName, string ownerLastName, UUID objectId)
{
ScriptDialogPacket dialog = (ScriptDialogPacket)PacketPool.Instance.GetPacket(PacketType.ScriptDialog);
dialog.Data.ObjectID = objectId;
@ -12099,6 +12072,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP
buttons[0] = new ScriptDialogPacket.ButtonsBlock();
buttons[0].ButtonLabel = Util.StringToBytes256("!!llTextBox!!");
dialog.Buttons = buttons;
dialog.OwnerData = new ScriptDialogPacket.OwnerDataBlock[1];
dialog.OwnerData[0] = new ScriptDialogPacket.OwnerDataBlock();
dialog.OwnerData[0].OwnerID = ownerID;
OutPacket(dialog, ThrottleOutPacketType.Task);
}

View File

@ -160,6 +160,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
public Socket Server { get { return null; } }
private int m_malformedCount = 0; // Guard against a spamming attack
public LLUDPServer(IPAddress listenIP, ref uint port, int proxyPortOffsetParm, bool allow_alternate_port, IConfigSource configSource, AgentCircuitManager circuitManager)
: base(listenIP, (int)port)
{
@ -612,6 +614,21 @@ namespace OpenSim.Region.ClientStack.LindenUDP
#region Decoding
if (buffer.DataLength < 7)
return; // Drop undersizd packet
int headerLen = 7;
if (buffer.Data[6] == 0xFF)
{
if (buffer.Data[7] == 0xFF)
headerLen = 10;
else
headerLen = 8;
}
if (buffer.DataLength < headerLen)
return; // Malformed header
try
{
packet = Packet.BuildPacket(buffer.Data, ref packetEnd,
@ -621,6 +638,18 @@ namespace OpenSim.Region.ClientStack.LindenUDP
catch (MalformedDataException)
{
}
catch (IndexOutOfRangeException)
{
return; // Drop short packet
}
catch(Exception e)
{
if (m_malformedCount < 100)
m_log.DebugFormat("[LLUDPSERVER]: Dropped malformed packet: " + e.ToString());
m_malformedCount++;
if ((m_malformedCount % 100000) == 0)
m_log.DebugFormat("[LLUDPSERVER]: Received {0} malformed packets so far, probable network attack.", m_malformedCount);
}
// Fail-safe check
if (packet == null)

View File

@ -44,7 +44,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
private static Int32 m_counter = 0;
private Int32 m_identifier;
// private Int32 m_identifier;
/// <summary>
/// Number of ticks (ms) per quantum, drip rate and max burst
@ -173,7 +173,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
/// second. If zero, the bucket always remains full</param>
public TokenBucket(TokenBucket parent, Int64 dripRate)
{
m_identifier = m_counter++;
// m_identifier = m_counter++;
m_counter++;
Parent = parent;
RequestedDripRate = dripRate;
@ -320,7 +321,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
public class AdaptiveTokenBucket : TokenBucket
{
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
/// <summary>
/// The minimum rate for flow control. Minimum drip rate is one

View File

@ -301,7 +301,9 @@ namespace Flotsam.RegionModules.AssetCache
}
catch (Exception e)
{
LogException(e);
m_log.ErrorFormat(
"[FLOTSAM ASSET CACHE]: Failed to update cache for asset {0}. Exception {1} {2}",
asset.ID, e.Message, e.StackTrace);
}
}
@ -361,7 +363,9 @@ namespace Flotsam.RegionModules.AssetCache
}
catch (System.Runtime.Serialization.SerializationException e)
{
LogException(e);
m_log.ErrorFormat(
"[FLOTSAM ASSET CACHE]: Failed to get file {0} for asset {1}. Exception {2} {3}",
filename, id, e.Message, e.StackTrace);
// If there was a problem deserializing the asset, the asset may
// either be corrupted OR was serialized under an old format
@ -371,7 +375,9 @@ namespace Flotsam.RegionModules.AssetCache
}
catch (Exception e)
{
LogException(e);
m_log.ErrorFormat(
"[FLOTSAM ASSET CACHE]: Failed to get file {0} for asset {1}. Exception {2} {3}",
filename, id, e.Message, e.StackTrace);
}
finally
{
@ -380,7 +386,6 @@ namespace Flotsam.RegionModules.AssetCache
}
}
#if WAIT_ON_INPROGRESS_REQUESTS
// Check if we're already downloading this asset. If so, try to wait for it to
// download.
@ -403,7 +408,6 @@ namespace Flotsam.RegionModules.AssetCache
m_RequestsForInprogress++;
}
#endif
return asset;
}
@ -415,7 +419,7 @@ namespace Flotsam.RegionModules.AssetCache
if (m_MemoryCacheEnabled)
asset = GetFromMemoryCache(id);
else if (m_FileCacheEnabled)
if (asset == null && m_FileCacheEnabled)
asset = GetFromFileCache(id);
if (((m_LogLevel >= 1)) && (m_HitRateDisplay != 0) && (m_Requests % m_HitRateDisplay == 0))
@ -432,7 +436,6 @@ namespace Flotsam.RegionModules.AssetCache
}
m_log.InfoFormat("[FLOTSAM ASSET CACHE]: {0} unnessesary requests due to requests for assets that are currently downloading.", m_RequestsForInprogress);
}
return asset;
@ -446,7 +449,7 @@ namespace Flotsam.RegionModules.AssetCache
public void Expire(string id)
{
if (m_LogLevel >= 2)
m_log.DebugFormat("[FLOTSAM ASSET CACHE]: Expiring Asset {0}.", id);
m_log.DebugFormat("[FLOTSAM ASSET CACHE]: Expiring Asset {0}", id);
try
{
@ -464,7 +467,9 @@ namespace Flotsam.RegionModules.AssetCache
}
catch (Exception e)
{
LogException(e);
m_log.ErrorFormat(
"[FLOTSAM ASSET CACHE]: Failed to expire cached file {0}. Exception {1} {2}",
id, e.Message, e.StackTrace);
}
}
@ -602,7 +607,9 @@ namespace Flotsam.RegionModules.AssetCache
}
catch (Exception e)
{
LogException(e);
m_log.ErrorFormat(
"[FLOTSAM ASSET CACHE]: Failed to write asset {0} to cache. Directory {1}, tempname {2}, filename {3}. Exception {4} {5}.",
asset.ID, directory, tempname, filename, e.Message, e.StackTrace);
}
finally
{
@ -632,15 +639,6 @@ namespace Flotsam.RegionModules.AssetCache
}
}
private static void LogException(Exception e)
{
string[] text = e.ToString().Split(new char[] { '\n' });
foreach (string t in text)
{
m_log.ErrorFormat("[FLOTSAM ASSET CACHE]: {0} ", t);
}
}
/// <summary>
/// Scan through the file cache, and return number of assets currently cached.
/// </summary>
@ -693,8 +691,7 @@ namespace Flotsam.RegionModules.AssetCache
s.ForEachSOG(delegate(SceneObjectGroup e)
{
gatherer.GatherAssetUuids(e, assets);
}
);
});
}
foreach (UUID assetID in assets.Keys)
@ -727,7 +724,9 @@ namespace Flotsam.RegionModules.AssetCache
}
catch (Exception e)
{
LogException(e);
m_log.ErrorFormat(
"[FLOTSAM ASSET CACHE]: Couldn't clear asset cache directory {0} from {1}. Exception {2} {3}",
dir, m_CacheDirectory, e.Message, e.StackTrace);
}
}
@ -739,7 +738,9 @@ namespace Flotsam.RegionModules.AssetCache
}
catch (Exception e)
{
LogException(e);
m_log.ErrorFormat(
"[FLOTSAM ASSET CACHE]: Couldn't clear asset cache file {0} from {1}. Exception {1} {2}",
file, m_CacheDirectory, e.Message, e.StackTrace);
}
}
}
@ -765,7 +766,7 @@ namespace Flotsam.RegionModules.AssetCache
foreach (string s in Directory.GetFiles(m_CacheDirectory, "*.fac"))
{
m_log.Info("[FLOTSAM ASSET CACHE]: Deep Scans were performed on the following regions:");
m_log.Info("[FLOTSAM ASSET CACHE]: Deep scans have previously been performed on the following regions:");
string RegionID = s.Remove(0,s.IndexOf("_")).Replace(".fac","");
DateTime RegionDeepScanTMStamp = File.GetLastWriteTime(s);
@ -836,7 +837,6 @@ namespace Flotsam.RegionModules.AssetCache
Util.FireAndForget(delegate {
int assetsCached = CacheScenes();
m_log.InfoFormat("[FLOTSAM ASSET CACHE]: Completed Scene Caching, {0} assets found.", assetsCached);
});
break;
@ -891,7 +891,6 @@ namespace Flotsam.RegionModules.AssetCache
#region IAssetService Members
public AssetMetadata GetMetadata(string id)
{
AssetBase asset = Get(id);
@ -921,7 +920,6 @@ namespace Flotsam.RegionModules.AssetCache
Cache(asset);
return asset.ID;
}
public bool UpdateContent(string id, byte[] data)

View File

@ -151,6 +151,10 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
if (face == null)
continue;
// m_log.DebugFormat(
// "[AVFACTORY]: Looking for texture {0}, id {1} for {2} {3}",
// face.TextureID, idx, client.Name, client.AgentId);
// if the texture is one of the "defaults" then skip it
// this should probably be more intelligent (skirt texture doesnt matter
// if the avatar isnt wearing a skirt) but if any of the main baked
@ -305,6 +309,11 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
private void HandleAppearanceSave(UUID agentid)
{
// We must set appearance parameters in the en_US culture in order to avoid issues where values are saved
// in a culture where decimal points are commas and then reloaded in a culture which just treats them as
// number seperators.
Culture.SetCurrentCulture();
ScenePresence sp = m_scene.GetScenePresence(agentid);
if (sp == null)
{

View File

@ -141,10 +141,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Dialog
{
UserAccount account = m_scene.UserAccountService.GetUserAccount(m_scene.RegionInfo.ScopeID, ownerid);
string ownerFirstName, ownerLastName;
UUID ownerID = UUID.Zero;
if (account != null)
{
ownerFirstName = account.FirstName;
ownerLastName = account.LastName;
ownerID = account.PrincipalID;
}
else
{
@ -155,7 +157,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Dialog
ScenePresence sp = m_scene.GetScenePresence(avatarid);
if (sp != null)
sp.ControllingClient.SendTextBoxRequest(message, chatChannel, name, ownerFirstName, ownerLastName, objectid);
sp.ControllingClient.SendTextBoxRequest(message, chatChannel, name, ownerID, ownerFirstName, ownerLastName, objectid);
}
public void SendNotificationToUsersInRegion(

View File

@ -984,11 +984,14 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
public virtual bool CanGetAgentInventoryItem(IClientAPI remoteClient, UUID itemID, UUID requestID)
{
InventoryItemBase assetRequestItem = GetItem(remoteClient.AgentId, itemID);
if (assetRequestItem == null)
{
ILibraryService lib = m_Scene.RequestModuleInterface<ILibraryService>();
if (lib != null)
assetRequestItem = lib.LibraryRootFolder.FindItem(itemID);
if (assetRequestItem == null)
return false;
}
@ -1019,6 +1022,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
m_log.WarnFormat(
"[CLIENT]: {0} requested asset {1} from item {2} but this does not match item's asset {3}",
Name, requestID, itemID, assetRequestItem.AssetID);
return false;
}

View File

@ -185,6 +185,7 @@ namespace OpenSim.Region.CoreModules.Framework.Library
archread = new InventoryArchiveReadRequest(m_MockScene, uinfo, "/", iarFileName, false);
archread.Execute();
}
foreach (InventoryNodeBase node in nodes)
FixPerms(node);
}
@ -197,18 +198,19 @@ namespace OpenSim.Region.CoreModules.Framework.Library
archread.Close();
}
}
}
private void FixPerms(InventoryNodeBase node)
{
m_log.DebugFormat("[LIBRARY MODULE]: Fixing perms for {0} {1}", node.Name, node.ID);
if (node is InventoryItemBase)
{
InventoryItemBase item = (InventoryItemBase)node;
item.BasePermissions = 0x7FFFFFFF;
item.EveryOnePermissions = 0x7FFFFFFF;
item.CurrentPermissions = 0x7FFFFFFF;
item.NextPermissions = 0x7FFFFFFF;
item.BasePermissions = (uint)PermissionMask.All;
item.EveryOnePermissions = (uint)PermissionMask.All - (uint)PermissionMask.Modify;
item.CurrentPermissions = (uint)PermissionMask.All;
item.NextPermissions = (uint)PermissionMask.All;
}
}

View File

@ -39,8 +39,7 @@ using OpenMetaverse;
namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Authorization
{
public class LocalAuthorizationServicesConnector :
ISharedRegionModule, IAuthorizationService
public class LocalAuthorizationServicesConnector : ISharedRegionModule, IAuthorizationService
{
private static readonly ILog m_log =
LogManager.GetLogger(
@ -127,15 +126,15 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Authorization
if (!m_Enabled)
return;
m_log.InfoFormat("[AUTHORIZATION CONNECTOR]: Enabled local authorization for region {0}", scene.RegionInfo.RegionName);
m_log.InfoFormat(
"[AUTHORIZATION CONNECTOR]: Enabled local authorization for region {0}",
scene.RegionInfo.RegionName);
}
public bool IsAuthorizedForRegion(string userID, string regionID, out string message)
public bool IsAuthorizedForRegion(
string userID, string firstName, string lastName, string regionID, out string message)
{
return m_AuthorizationService.IsAuthorizedForRegion(userID, regionID, out message);
return m_AuthorizationService.IsAuthorizedForRegion(userID, firstName, lastName, regionID, out message);
}
}
}

View File

@ -117,12 +117,15 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Authorization
}
public bool IsAuthorizedForRegion(string userID, string regionID, out string message)
public bool IsAuthorizedForRegion(
string userID, string firstName, string lastName, string regionID, out string message)
{
m_log.InfoFormat("[REMOTE AUTHORIZATION CONNECTOR]: IsAuthorizedForRegion checking {0} for region {1}", userID, regionID);
m_log.InfoFormat(
"[REMOTE AUTHORIZATION CONNECTOR]: IsAuthorizedForRegion checking {0} for region {1}", userID, regionID);
bool isAuthorized = true;
message = String.Empty;
string mail = String.Empty;
// get the scene this call is being made for
Scene scene = null;
@ -140,17 +143,22 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Authorization
if (scene != null)
{
UserAccount account = scene.UserAccountService.GetUserAccount(UUID.Zero, new UUID(userID));
isAuthorized = IsAuthorizedForRegion(userID, account.FirstName, account.LastName,
account.Email, scene.RegionInfo.RegionName, regionID, out message);
if (account != null)
mail = account.Email;
isAuthorized
= IsAuthorizedForRegion(
userID, firstName, lastName, account.Email, scene.RegionInfo.RegionName, regionID, out message);
}
else
{
m_log.ErrorFormat("[REMOTE AUTHORIZATION CONNECTOR] IsAuthorizedForRegion, can't find scene to match region id of {0} ",regionID);
m_log.ErrorFormat(
"[REMOTE AUTHORIZATION CONNECTOR] IsAuthorizedForRegion, can't find scene to match region id of {0}",
regionID);
}
return isAuthorized;
}
}
}

View File

@ -64,10 +64,10 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid.Tests
}
/// <summary>
/// Test saving a V0.2 OpenSim Region Archive.
/// Test region registration.
/// </summary>
[Test]
public void TestRegisterRegionV0_2()
public void TestRegisterRegion()
{
SetUp();
@ -123,6 +123,9 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid.Tests
m_LocalConnector.RegisterRegion(UUID.Zero, r1);
GridRegion result = m_LocalConnector.GetRegionByName(UUID.Zero, "Test");
Assert.IsNull(result, "Retrieved GetRegionByName \"Test\" is not null");
result = m_LocalConnector.GetRegionByName(UUID.Zero, "Test Region 1");
Assert.IsNotNull(result, "Retrieved GetRegionByName is null");
Assert.That(result.RegionName, Is.EqualTo("Test Region 1"), "Retrieved region's name does not match");

View File

@ -470,53 +470,48 @@ namespace OpenSim.Region.CoreModules.World.Land
SendLandUpdate(avatar, false);
}
public void EventManagerOnSignificantClientMovement(IClientAPI remote_client)
public void EventManagerOnSignificantClientMovement(ScenePresence clientAvatar)
{
ScenePresence clientAvatar = m_scene.GetScenePresence(remote_client.AgentId);
if (clientAvatar != null)
SendLandUpdate(clientAvatar);
SendOutNearestBanLine(clientAvatar.ControllingClient);
ILandObject parcel = GetLandObject(clientAvatar.AbsolutePosition.X, clientAvatar.AbsolutePosition.Y);
if (parcel != null)
{
SendLandUpdate(clientAvatar);
SendOutNearestBanLine(remote_client);
ILandObject parcel = GetLandObject(clientAvatar.AbsolutePosition.X, clientAvatar.AbsolutePosition.Y);
if (parcel != null)
if (clientAvatar.AbsolutePosition.Z < LandChannel.BAN_LINE_SAFETY_HIEGHT &&
clientAvatar.sentMessageAboutRestrictedParcelFlyingDown)
{
if (clientAvatar.AbsolutePosition.Z < LandChannel.BAN_LINE_SAFETY_HIEGHT &&
clientAvatar.sentMessageAboutRestrictedParcelFlyingDown)
EventManagerOnAvatarEnteringNewParcel(clientAvatar, parcel.LandData.LocalID,
m_scene.RegionInfo.RegionID);
//They are going under the safety line!
if (!parcel.IsBannedFromLand(clientAvatar.UUID))
{
EventManagerOnAvatarEnteringNewParcel(clientAvatar, parcel.LandData.LocalID,
m_scene.RegionInfo.RegionID);
//They are going under the safety line!
if (!parcel.IsBannedFromLand(clientAvatar.UUID))
{
clientAvatar.sentMessageAboutRestrictedParcelFlyingDown = false;
}
clientAvatar.sentMessageAboutRestrictedParcelFlyingDown = false;
}
else if (clientAvatar.AbsolutePosition.Z < LandChannel.BAN_LINE_SAFETY_HIEGHT &&
parcel.IsBannedFromLand(clientAvatar.UUID))
}
else if (clientAvatar.AbsolutePosition.Z < LandChannel.BAN_LINE_SAFETY_HIEGHT &&
parcel.IsBannedFromLand(clientAvatar.UUID))
{
//once we've sent the message once, keep going toward the target until we are done
if (forcedPosition.ContainsKey(clientAvatar.ControllingClient.AgentId))
{
//once we've sent the message once, keep going toward the target until we are done
if (forcedPosition.ContainsKey(clientAvatar.ControllingClient.AgentId))
{
SendYouAreBannedNotice(clientAvatar);
ForceAvatarToPosition(clientAvatar, m_scene.GetNearestAllowedPosition(clientAvatar));
}
SendYouAreBannedNotice(clientAvatar);
ForceAvatarToPosition(clientAvatar, m_scene.GetNearestAllowedPosition(clientAvatar));
}
else if (parcel.IsRestrictedFromLand(clientAvatar.UUID))
}
else if (parcel.IsRestrictedFromLand(clientAvatar.UUID))
{
//once we've sent the message once, keep going toward the target until we are done
if (forcedPosition.ContainsKey(clientAvatar.ControllingClient.AgentId))
{
//once we've sent the message once, keep going toward the target until we are done
if (forcedPosition.ContainsKey(clientAvatar.ControllingClient.AgentId))
{
SendYouAreRestrictedNotice(clientAvatar);
ForceAvatarToPosition(clientAvatar, m_scene.GetNearestAllowedPosition(clientAvatar));
}
}
else
{
//when we are finally in a safe place, lets release the forced position lock
forcedPosition.Remove(clientAvatar.ControllingClient.AgentId);
SendYouAreRestrictedNotice(clientAvatar);
ForceAvatarToPosition(clientAvatar, m_scene.GetNearestAllowedPosition(clientAvatar));
}
}
else
{
//when we are finally in a safe place, lets release the forced position lock
forcedPosition.Remove(clientAvatar.ControllingClient.AgentId);
}
}
}

View File

@ -146,7 +146,7 @@ namespace OpenSim.Region.CoreModules.World.Permissions
= ParseUserSetConfigSetting(myConfig, "allowed_script_editors", m_allowedScriptEditors);
if (m_bypassPermissions)
m_log.Info("[PERMISSIONS]: serviceside_object_permissions = false in ini file so disabling all region service permission checks");
m_log.Info("[PERMISSIONS]: serverside_object_permissions = false in ini file so disabling all region service permission checks");
else
m_log.Debug("[PERMISSIONS]: Enabling all region service permission checks");

View File

@ -96,16 +96,7 @@ m_log.DebugFormat("MAP NAME=({0})", mapName);
// try to fetch from GridServer
List<GridRegion> regionInfos = m_scene.GridService.GetRegionsByName(m_scene.RegionInfo.ScopeID, mapName, 20);
if (regionInfos == null)
{
m_log.Warn("[MAPSEARCHMODULE]: RequestNamedRegions returned null. Old gridserver?");
// service wasn't available; maybe still an old GridServer. Try the old API, though it will return only one region
regionInfos = new List<GridRegion>();
GridRegion info = m_scene.GridService.GetRegionByName(m_scene.RegionInfo.ScopeID, mapName);
if (info != null)
regionInfos.Add(info);
}
else if (regionInfos.Count == 0)
if (regionInfos.Count == 0)
remoteClient.SendAlertMessage("Hyperlink could not be established.");
m_log.DebugFormat("[MAPSEARCHMODULE]: search {0} returned {1} regions. Flags={2}", mapName, regionInfos.Count, flags);

View File

@ -222,7 +222,7 @@ namespace OpenSim.Region.Examples.SimpleModule
public event ScriptReset OnScriptReset;
public event GetScriptRunning OnGetScriptRunning;
public event SetScriptRunning OnSetScriptRunning;
public event UpdateVector OnAutoPilotGo;
public event Action<Vector3> OnAutoPilotGo;
public event TerrainUnacked OnUnackedTerrain;
@ -1152,7 +1152,7 @@ namespace OpenSim.Region.Examples.SimpleModule
{
}
public void SendTextBoxRequest(string message, int chatChannel, string objectname, string ownerFirstName, string ownerLastName, UUID objectId)
public void SendTextBoxRequest(string message, int chatChannel, string objectname, UUID ownerID, string ownerFirstName, string ownerLastName, UUID objectId)
{
}

View File

@ -32,9 +32,39 @@ namespace OpenSim.Region.Framework.Interfaces
{
public interface INPCModule
{
/// <summary>
/// Create an NPC
/// </summary>
/// <param name="firstname"></param>
/// <param name="lastname"></param>
/// <param name="position"></param>
/// <param name="scene"></param>
/// <param name="cloneAppearanceFrom">The UUID of the avatar from which to clone the NPC's appearance from.</param>
/// <returns>The UUID of the ScenePresence created.</returns>
UUID CreateNPC(string firstname, string lastname, Vector3 position, Scene scene, UUID cloneAppearanceFrom);
void Autopilot(UUID agentID, Scene scene, Vector3 pos);
/// <summary>
/// Move an NPC to a target over time.
/// </summary>
/// <param name="agentID">The UUID of the NPC</param>
/// <param name="scene"></param>
/// <param name="pos"></param>
void MoveToTarget(UUID agentID, Scene scene, Vector3 pos);
/// <summary>
/// Get the NPC to say something.
/// </summary>
/// <param name="agentID">The UUID of the NPC</param>
/// <param name="scene"></param>
/// <param name="text"></param>
void Say(UUID agentID, Scene scene, string text);
/// <summary>
/// Delete an NPC.
/// </summary>
/// <param name="agentID">The UUID of the NPC</param>
/// <param name="scene"></param>
void DeleteNPC(UUID agentID, Scene scene);
}
}

View File

@ -27,6 +27,8 @@
using System;
using System.Collections.Generic;
using System.Reflection;
using log4net;
using OpenMetaverse;
using OpenSim.Framework;
using OpenSim.Region.Framework.Interfaces;
@ -40,6 +42,8 @@ namespace OpenSim.Region.Framework.Scenes.Animation
/// </summary>
public class ScenePresenceAnimator
{
// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
public AnimationSet Animations
{
get { return m_animations; }
@ -262,7 +266,7 @@ namespace OpenSim.Region.Framework.Scenes.Animation
m_animTickFall = 0;
if (move.Z > 0f)
if (move.Z > 0.2f)
{
// Jumping
if (!jumping)
@ -295,7 +299,7 @@ namespace OpenSim.Region.Framework.Scenes.Animation
if (move.X != 0f || move.Y != 0f)
{
// Walking / crouchwalking / running
if (move.Z < 0f)
if (move.Z < 0)
return "CROUCHWALK";
else if (m_scenePresence.SetAlwaysRun)
return "RUN";
@ -305,7 +309,7 @@ namespace OpenSim.Region.Framework.Scenes.Animation
else
{
// Not walking
if (move.Z < 0f)
if (move.Z < 0)
return "CROUCH";
else
return "STAND";
@ -323,6 +327,8 @@ namespace OpenSim.Region.Framework.Scenes.Animation
public void UpdateMovementAnimations()
{
m_movementAnimation = GetMovementAnimation();
// m_log.DebugFormat(
// "[SCENE PRESENCE ANIMATOR]: Got animation {0} for {1}", m_movementAnimation, m_scenePresence.Name);
TrySetMovementAnimation(m_movementAnimation);
}

View File

@ -165,8 +165,7 @@ namespace OpenSim.Region.Framework.Scenes
public delegate void AvatarEnteringNewParcel(ScenePresence avatar, int localLandID, UUID regionID);
public event AvatarEnteringNewParcel OnAvatarEnteringNewParcel;
public delegate void SignificantClientMovement(IClientAPI remote_client);
public event SignificantClientMovement OnSignificantClientMovement;
public event Action<ScenePresence> OnSignificantClientMovement;
public delegate void IncomingInstantMessage(GridInstantMessage message);
public event IncomingInstantMessage OnIncomingInstantMessage;
@ -1592,16 +1591,16 @@ namespace OpenSim.Region.Framework.Scenes
}
}
public void TriggerSignificantClientMovement(IClientAPI client)
public void TriggerSignificantClientMovement(ScenePresence presence)
{
SignificantClientMovement handlerSignificantClientMovement = OnSignificantClientMovement;
Action<ScenePresence> handlerSignificantClientMovement = OnSignificantClientMovement;
if (handlerSignificantClientMovement != null)
{
foreach (SignificantClientMovement d in handlerSignificantClientMovement.GetInvocationList())
foreach (Action<ScenePresence> d in handlerSignificantClientMovement.GetInvocationList())
{
try
{
d(client);
d(presence);
}
catch (Exception e)
{

View File

@ -724,7 +724,10 @@ namespace OpenSim.Region.Framework.Scenes
newName = item.Name;
}
if (remoteClient.AgentId == oldAgentID || (LibraryService != null && LibraryService.LibraryRootFolder != null && oldAgentID == LibraryService.LibraryRootFolder.Owner))
if (remoteClient.AgentId == oldAgentID
|| (LibraryService != null
&& LibraryService.LibraryRootFolder != null
&& oldAgentID == LibraryService.LibraryRootFolder.Owner))
{
CreateNewInventoryItem(
remoteClient, item.CreatorId, item.CreatorData, newFolderID, newName, item.Flags, callbackID, asset, (sbyte)item.InvType,

View File

@ -3079,7 +3079,7 @@ namespace OpenSim.Region.Framework.Scenes
if (aCircuit == null)
{
m_log.DebugFormat("[APPEARANCE] Client did not supply a circuit. Non-Linden? Creating default appearance.");
appearance = new AvatarAppearance(client.AgentId);
appearance = new AvatarAppearance();
return;
}
@ -3087,7 +3087,7 @@ namespace OpenSim.Region.Framework.Scenes
if (appearance == null)
{
m_log.DebugFormat("[APPEARANCE]: Appearance not found in {0}, returning default", RegionInfo.RegionName);
appearance = new AvatarAppearance(client.AgentId);
appearance = new AvatarAppearance();
}
}
@ -3553,11 +3553,12 @@ namespace OpenSim.Region.Framework.Scenes
if (AuthorizationService != null)
{
if (!AuthorizationService.IsAuthorizedForRegion(agent.AgentID.ToString(), RegionInfo.RegionID.ToString(),out reason))
if (!AuthorizationService.IsAuthorizedForRegion(
agent.AgentID.ToString(), agent.firstname, agent.lastname, RegionInfo.RegionID.ToString(), out reason))
{
m_log.WarnFormat("[CONNECTION BEGIN]: Denied access to: {0} ({1} {2}) at {3} because the user does not have access to the region",
agent.AgentID, agent.firstname, agent.lastname, RegionInfo.RegionName);
//reason = String.Format("You are not currently on the access list for {0}",RegionInfo.RegionName);
return false;
}
}
@ -3880,8 +3881,11 @@ namespace OpenSim.Region.Framework.Scenes
}
/// <summary>
/// Tries to teleport agent to other region.
/// Tries to teleport agent to another region.
/// </summary>
/// <remarks>
/// The region name must exactly match that given.
/// </remarks>
/// <param name="remoteClient"></param>
/// <param name="regionName"></param>
/// <param name="position"></param>
@ -3890,15 +3894,16 @@ namespace OpenSim.Region.Framework.Scenes
public void RequestTeleportLocation(IClientAPI remoteClient, string regionName, Vector3 position,
Vector3 lookat, uint teleportFlags)
{
List<GridRegion> regions = GridService.GetRegionsByName(RegionInfo.ScopeID, regionName, 1);
if (regions == null || regions.Count == 0)
GridRegion region = GridService.GetRegionByName(RegionInfo.ScopeID, regionName);
if (region == null)
{
// can't find the region: Tell viewer and abort
remoteClient.SendTeleportFailed("The region '" + regionName + "' could not be found.");
return;
}
RequestTeleportLocation(remoteClient, regions[0].RegionHandle, position, lookat, teleportFlags);
RequestTeleportLocation(remoteClient, region.RegionHandle, position, lookat, teleportFlags);
}
/// <summary>

View File

@ -1650,16 +1650,7 @@ namespace OpenSim.Region.Framework.Scenes
ScenePresence avatar = m_scene.GetScenePresence(rootpart.AttachedAvatar);
if (avatar != null)
{
List<string> coords = new List<string>();
uint regionX = 0;
uint regionY = 0;
Utils.LongToUInts(Scene.RegionInfo.RegionHandle, out regionX, out regionY);
target.X += regionX;
target.Y += regionY;
coords.Add(target.X.ToString());
coords.Add(target.Y.ToString());
coords.Add(target.Z.ToString());
avatar.DoMoveToPosition(avatar, "", coords);
avatar.MoveToTarget(target);
}
}
else

View File

@ -1038,7 +1038,7 @@ namespace OpenSim.Region.Framework.Scenes
{
actor.Size = m_shape.Scale;
if (((OpenMetaverse.SculptType)Shape.SculptType) == SculptType.Mesh)
if (Shape.SculptEntry)
CheckSculptAndLoad();
else
ParentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor);
@ -1751,95 +1751,110 @@ namespace OpenSim.Region.Framework.Scenes
return part;
}
/// <summary>
/// Do a physics property update for a NINJA joint.
/// </summary>
/// <param name="UsePhysics"></param>
/// <param name="isNew"></param>
protected void DoPhysicsPropertyUpdateForNinjaJoint(bool UsePhysics, bool isNew)
{
if (UsePhysics)
{
// by turning a joint proxy object physical, we cause creation of a joint in the ODE scene.
// note that, as a special case, joints have no bodies or geoms in the physics scene, even though they are physical.
PhysicsJointType jointType;
if (IsHingeJoint())
{
jointType = PhysicsJointType.Hinge;
}
else if (IsBallJoint())
{
jointType = PhysicsJointType.Ball;
}
else
{
jointType = PhysicsJointType.Ball;
}
List<string> bodyNames = new List<string>();
string RawParams = Description;
string[] jointParams = RawParams.Split(" ".ToCharArray(), System.StringSplitOptions.RemoveEmptyEntries);
string trackedBodyName = null;
if (jointParams.Length >= 2)
{
for (int iBodyName = 0; iBodyName < 2; iBodyName++)
{
string bodyName = jointParams[iBodyName];
bodyNames.Add(bodyName);
if (bodyName != "NULL")
{
if (trackedBodyName == null)
{
trackedBodyName = bodyName;
}
}
}
}
SceneObjectPart trackedBody = m_parentGroup.Scene.GetSceneObjectPart(trackedBodyName); // FIXME: causes a sequential lookup
Quaternion localRotation = Quaternion.Identity;
if (trackedBody != null)
{
localRotation = Quaternion.Inverse(trackedBody.RotationOffset) * this.RotationOffset;
}
else
{
// error, output it below
}
PhysicsJoint joint;
joint = m_parentGroup.Scene.PhysicsScene.RequestJointCreation(Name, jointType,
AbsolutePosition,
this.RotationOffset,
Description,
bodyNames,
trackedBodyName,
localRotation);
if (trackedBody == null)
{
ParentGroup.Scene.jointErrorMessage(joint, "warning: tracked body name not found! joint location will not be updated properly. joint: " + Name);
}
}
else
{
if (isNew)
{
// if the joint proxy is new, and it is not physical, do nothing. There is no joint in ODE to
// delete, and if we try to delete it, due to asynchronous processing, the deletion request
// will get processed later at an indeterminate time, which could cancel a later-arriving
// joint creation request.
}
else
{
// here we turn off the joint object, so remove the joint from the physics scene
m_parentGroup.Scene.PhysicsScene.RequestJointDeletion(Name); // FIXME: what if the name changed?
// make sure client isn't interpolating the joint proxy object
Velocity = Vector3.Zero;
AngularVelocity = Vector3.Zero;
Acceleration = Vector3.Zero;
}
}
}
/// <summary>
/// Do a physics propery update for this part.
/// </summary>
/// <param name="UsePhysics"></param>
/// <param name="isNew"></param>
public void DoPhysicsPropertyUpdate(bool UsePhysics, bool isNew)
{
if (IsJoint())
{
if (UsePhysics)
{
// by turning a joint proxy object physical, we cause creation of a joint in the ODE scene.
// note that, as a special case, joints have no bodies or geoms in the physics scene, even though they are physical.
PhysicsJointType jointType;
if (IsHingeJoint())
{
jointType = PhysicsJointType.Hinge;
}
else if (IsBallJoint())
{
jointType = PhysicsJointType.Ball;
}
else
{
jointType = PhysicsJointType.Ball;
}
List<string> bodyNames = new List<string>();
string RawParams = Description;
string[] jointParams = RawParams.Split(" ".ToCharArray(), System.StringSplitOptions.RemoveEmptyEntries);
string trackedBodyName = null;
if (jointParams.Length >= 2)
{
for (int iBodyName = 0; iBodyName < 2; iBodyName++)
{
string bodyName = jointParams[iBodyName];
bodyNames.Add(bodyName);
if (bodyName != "NULL")
{
if (trackedBodyName == null)
{
trackedBodyName = bodyName;
}
}
}
}
SceneObjectPart trackedBody = m_parentGroup.Scene.GetSceneObjectPart(trackedBodyName); // FIXME: causes a sequential lookup
Quaternion localRotation = Quaternion.Identity;
if (trackedBody != null)
{
localRotation = Quaternion.Inverse(trackedBody.RotationOffset) * this.RotationOffset;
}
else
{
// error, output it below
}
PhysicsJoint joint;
joint = m_parentGroup.Scene.PhysicsScene.RequestJointCreation(Name, jointType,
AbsolutePosition,
this.RotationOffset,
Description,
bodyNames,
trackedBodyName,
localRotation);
if (trackedBody == null)
{
ParentGroup.Scene.jointErrorMessage(joint, "warning: tracked body name not found! joint location will not be updated properly. joint: " + Name);
}
}
else
{
if (isNew)
{
// if the joint proxy is new, and it is not physical, do nothing. There is no joint in ODE to
// delete, and if we try to delete it, due to asynchronous processing, the deletion request
// will get processed later at an indeterminate time, which could cancel a later-arriving
// joint creation request.
}
else
{
// here we turn off the joint object, so remove the joint from the physics scene
m_parentGroup.Scene.PhysicsScene.RequestJointDeletion(Name); // FIXME: what if the name changed?
// make sure client isn't interpolating the joint proxy object
Velocity = Vector3.Zero;
AngularVelocity = Vector3.Zero;
Acceleration = Vector3.Zero;
}
}
DoPhysicsPropertyUpdateForNinjaJoint(UsePhysics, isNew);
}
else
{
@ -1906,7 +1921,7 @@ namespace OpenSim.Region.Framework.Scenes
// If this part is a sculpt then delay the physics update until we've asynchronously loaded the
// mesh data.
if (((OpenMetaverse.SculptType)Shape.SculptType) == SculptType.Mesh)
if (Shape.SculptEntry)
CheckSculptAndLoad();
else
m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor);
@ -4821,7 +4836,6 @@ namespace OpenSim.Region.Framework.Scenes
{
PhysActor.OnCollisionUpdate += PhysicsCollision;
PhysActor.SubscribeEvents(1000);
}
}
else

View File

@ -89,6 +89,13 @@ namespace OpenSim.Region.Framework.Scenes
/// </summary>
private static readonly Vector3 SIT_TARGET_ADJUSTMENT = new Vector3(0.1f, 0.0f, 0.3f);
/// <summary>
/// Movement updates for agents in neighboring regions are sent directly to clients.
/// This value only affects how often agent positions are sent to neighbor regions
/// for things such as distance-based update prioritization
/// </summary>
public static readonly float SIGNIFICANT_MOVEMENT = 2.0f;
public UUID currentParcelUUID = UUID.Zero;
private ISceneViewer m_sceneViewer;
@ -116,7 +123,7 @@ namespace OpenSim.Region.Framework.Scenes
private ScriptControlled IgnoredControls = ScriptControlled.CONTROL_ZERO;
private ScriptControlled LastCommands = ScriptControlled.CONTROL_ZERO;
private bool MouseDown = false;
private SceneObjectGroup proxyObjectGroup;
// private SceneObjectGroup proxyObjectGroup;
//private SceneObjectPart proxyObjectPart = null;
public Vector3 lastKnownAllowedPosition;
public bool sentMessageAboutRestrictedParcelFlyingDown;
@ -210,8 +217,8 @@ namespace OpenSim.Region.Framework.Scenes
private string m_nextSitAnimation = String.Empty;
//PauPaw:Proper PID Controler for autopilot************
private bool m_moveToPositionInProgress;
private Vector3 m_moveToPositionTarget;
public bool MovingToTarget { get; private set; }
public Vector3 MoveToPositionTarget { get; private set; }
private bool m_followCamAuto;
@ -779,8 +786,7 @@ namespace OpenSim.Region.Framework.Scenes
m_controllingClient.OnStartAnim += HandleStartAnim;
m_controllingClient.OnStopAnim += HandleStopAnim;
m_controllingClient.OnForceReleaseControls += HandleForceReleaseControls;
m_controllingClient.OnAutoPilotGo += DoAutoPilot;
m_controllingClient.AddGenericPacketHandler("autopilot", DoMoveToPosition);
m_controllingClient.OnAutoPilotGo += MoveToTarget;
// ControllingClient.OnChildAgentStatus += new StatusChange(this.ChildStatusChange);
// ControllingClient.OnStopMovement += new GenericCall2(this.StopMovement);
@ -916,7 +922,7 @@ namespace OpenSim.Region.Framework.Scenes
{
m_log.ErrorFormat("[SCENE PRESENCE]: null appearance in MakeRoot in {0}", Scene.RegionInfo.RegionName);
// emergency; this really shouldn't happen
m_appearance = new AvatarAppearance(UUID);
m_appearance = new AvatarAppearance();
}
AddToPhysicalScene(isFlying);
@ -1076,13 +1082,6 @@ namespace OpenSim.Region.Framework.Scenes
SendTerseUpdateToAllClients();
}
/// <summary>
///
/// </summary>
public void StopMovement()
{
}
public void StopFlying()
{
ControllingClient.StopFlying(this);
@ -1379,14 +1378,14 @@ namespace OpenSim.Region.Framework.Scenes
return;
}
bool update_movementflag = false;
if (m_allowMovement && !SitGround)
{
bool update_movementflag = false;
if (agentData.UseClientAgentPosition)
{
m_moveToPositionInProgress = (agentData.ClientAgentPosition - AbsolutePosition).Length() > 0.2f;
m_moveToPositionTarget = agentData.ClientAgentPosition;
MovingToTarget = (agentData.ClientAgentPosition - AbsolutePosition).Length() > 0.2f;
MoveToPositionTarget = agentData.ClientAgentPosition;
}
int i = 0;
@ -1417,7 +1416,6 @@ namespace OpenSim.Region.Framework.Scenes
if (m_parentID == 0)
{
bool bAllowUpdateMoveToPosition = false;
bool bResetMoveToPosition = false;
Vector3[] dirVectors;
@ -1430,13 +1428,14 @@ namespace OpenSim.Region.Framework.Scenes
// The fact that m_movementflag is a byte needs to be fixed
// it really should be a uint
// A DIR_CONTROL_FLAG occurs when the user is trying to move in a particular direction.
uint nudgehack = 250;
foreach (Dir_ControlFlags DCF in DIR_CONTROL_FLAGS)
{
if (((uint)flags & (uint)DCF) != 0)
{
bResetMoveToPosition = true;
DCFlagKeyPressed = true;
try
{
agent_control_v3 += dirVectors[i];
@ -1480,97 +1479,22 @@ namespace OpenSim.Region.Framework.Scenes
bAllowUpdateMoveToPosition = true;
}
}
i++;
}
//Paupaw:Do Proper PID for Autopilot here
if (bResetMoveToPosition)
if (MovingToTarget)
{
m_moveToPositionTarget = Vector3.Zero;
m_moveToPositionInProgress = false;
update_movementflag = true;
bAllowUpdateMoveToPosition = false;
}
if (bAllowUpdateMoveToPosition && (m_moveToPositionInProgress && !m_autopilotMoving))
{
//Check the error term of the current position in relation to the target position
if (Util.GetDistanceTo(AbsolutePosition, m_moveToPositionTarget) <= 0.5f)
// If the user has pressed a key then we want to cancel any move to target.
if (DCFlagKeyPressed)
{
// we are close enough to the target
m_moveToPositionTarget = Vector3.Zero;
m_moveToPositionInProgress = false;
ResetMoveToTarget();
update_movementflag = true;
}
else
else if (bAllowUpdateMoveToPosition)
{
try
{
// move avatar in 2D at one meter/second towards target, in avatar coordinate frame.
// This movement vector gets added to the velocity through AddNewMovement().
// Theoretically we might need a more complex PID approach here if other
// unknown forces are acting on the avatar and we need to adaptively respond
// to such forces, but the following simple approach seems to works fine.
Vector3 LocalVectorToTarget3D =
(m_moveToPositionTarget - AbsolutePosition) // vector from cur. pos to target in global coords
* Matrix4.CreateFromQuaternion(Quaternion.Inverse(bodyRotation)); // change to avatar coords
// Ignore z component of vector
Vector3 LocalVectorToTarget2D = new Vector3((float)(LocalVectorToTarget3D.X), (float)(LocalVectorToTarget3D.Y), 0f);
LocalVectorToTarget2D.Normalize();
agent_control_v3 += LocalVectorToTarget2D;
// update avatar movement flags. the avatar coordinate system is as follows:
//
// +X (forward)
//
// ^
// |
// |
// |
// |
// (left) +Y <--------o--------> -Y
// avatar
// |
// |
// |
// |
// v
// -X
//
// based on the above avatar coordinate system, classify the movement into
// one of left/right/back/forward.
if (LocalVectorToTarget2D.Y > 0)//MoveLeft
{
m_movementflag += (byte)(uint)Dir_ControlFlags.DIR_CONTROL_FLAG_LEFT;
//AgentControlFlags
AgentControlFlags |= (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_LEFT;
update_movementflag = true;
}
else if (LocalVectorToTarget2D.Y < 0) //MoveRight
{
m_movementflag += (byte)(uint)Dir_ControlFlags.DIR_CONTROL_FLAG_RIGHT;
AgentControlFlags |= (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_RIGHT;
update_movementflag = true;
}
if (LocalVectorToTarget2D.X < 0) //MoveBack
{
m_movementflag += (byte)(uint)Dir_ControlFlags.DIR_CONTROL_FLAG_BACK;
AgentControlFlags |= (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_BACK;
update_movementflag = true;
}
else if (LocalVectorToTarget2D.X > 0) //Move Forward
{
m_movementflag += (byte)(uint)Dir_ControlFlags.DIR_CONTROL_FLAG_FORWARD;
AgentControlFlags |= (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_FORWARD;
update_movementflag = true;
}
}
catch (Exception e)
{
//Avoid system crash, can be slower but...
m_log.DebugFormat("Crash! {0}", e.ToString());
}
if (HandleMoveToTargetUpdate(ref agent_control_v3, bodyRotation))
update_movementflag = true;
}
}
}
@ -1608,74 +1532,208 @@ namespace OpenSim.Region.Framework.Scenes
// "In {0} adding velocity to {1} of {2}", m_scene.RegionInfo.RegionName, Name, agent_control_v3);
AddNewMovement(agent_control_v3, q);
}
}
if (update_movementflag && ((flags & AgentManager.ControlFlags.AGENT_CONTROL_SIT_ON_GROUND) == 0) && (m_parentID == 0) && !SitGround)
Animator.UpdateMovementAnimations();
if (update_movementflag
&& ((flags & AgentManager.ControlFlags.AGENT_CONTROL_SIT_ON_GROUND) == 0)
&& (m_parentID == 0)
&& !SitGround)
Animator.UpdateMovementAnimations();
}
m_scene.EventManager.TriggerOnClientMovement(this);
m_scene.StatsReporter.AddAgentTime(Util.EnvironmentTickCountSubtract(m_perfMonMS));
}
public void DoAutoPilot(uint not_used, Vector3 Pos, IClientAPI remote_client)
/// <summary>
/// Calculate an update to move the presence to the set target.
/// </summary>
/// <remarks>
/// This doesn't actually perform the movement. Instead, it adds its vector to agent_control_v3.
/// </remarks>
/// <param value="agent_control_v3">Cumulative agent movement that this method will update.</param>
/// <param value="bodyRotation">New body rotation of the avatar.</param>
/// <returns>True if movement has been updated in some way. False otherwise.</returns>
public bool HandleMoveToTargetUpdate(ref Vector3 agent_control_v3, Quaternion bodyRotation)
{
m_autopilotMoving = true;
m_autoPilotTarget = Pos;
m_sitAtAutoTarget = false;
PrimitiveBaseShape proxy = PrimitiveBaseShape.Default;
//proxy.PCode = (byte)PCode.ParticleSystem;
// m_log.DebugFormat("[SCENE PRESENCE]: Called HandleMoveToTargetUpdate() for {0}", Name);
proxyObjectGroup = new SceneObjectGroup(UUID, Pos, Rotation, proxy);
proxyObjectGroup.AttachToScene(m_scene);
bool updated = false;
// Commented out this code since it could never have executed, but might still be informative.
// if (proxyObjectGroup != null)
// {
proxyObjectGroup.SendGroupFullUpdate();
remote_client.SendSitResponse(proxyObjectGroup.UUID, Vector3.Zero, Quaternion.Identity, true, Vector3.Zero, Vector3.Zero, false);
m_scene.DeleteSceneObject(proxyObjectGroup, false);
// }
// else
// {
// m_autopilotMoving = false;
// m_autoPilotTarget = Vector3.Zero;
// ControllingClient.SendAlertMessage("Autopilot cancelled");
// }
// m_log.DebugFormat(
// "[SCENE PRESENCE]: bAllowUpdateMoveToPosition {0}, m_moveToPositionInProgress {1}, m_autopilotMoving {2}",
// allowUpdate, m_moveToPositionInProgress, m_autopilotMoving);
if (!m_autopilotMoving)
{
double distanceToTarget = Util.GetDistanceTo(AbsolutePosition, MoveToPositionTarget);
// m_log.DebugFormat(
// "[SCENE PRESENCE]: Abs pos of {0} is {1}, target {2}, distance {3}",
// Name, AbsolutePosition, MoveToPositionTarget, distanceToTarget);
// Check the error term of the current position in relation to the target position
if (distanceToTarget <= 1)
{
// We are close enough to the target
AbsolutePosition = MoveToPositionTarget;
ResetMoveToTarget();
updated = true;
}
else
{
try
{
// move avatar in 3D at one meter/second towards target, in avatar coordinate frame.
// This movement vector gets added to the velocity through AddNewMovement().
// Theoretically we might need a more complex PID approach here if other
// unknown forces are acting on the avatar and we need to adaptively respond
// to such forces, but the following simple approach seems to works fine.
Vector3 LocalVectorToTarget3D =
(MoveToPositionTarget - AbsolutePosition) // vector from cur. pos to target in global coords
* Matrix4.CreateFromQuaternion(Quaternion.Inverse(bodyRotation)); // change to avatar coords
// Ignore z component of vector
// Vector3 LocalVectorToTarget2D = new Vector3((float)(LocalVectorToTarget3D.X), (float)(LocalVectorToTarget3D.Y), 0f);
LocalVectorToTarget3D.Normalize();
// update avatar movement flags. the avatar coordinate system is as follows:
//
// +X (forward)
//
// ^
// |
// |
// |
// |
// (left) +Y <--------o--------> -Y
// avatar
// |
// |
// |
// |
// v
// -X
//
// based on the above avatar coordinate system, classify the movement into
// one of left/right/back/forward.
if (LocalVectorToTarget3D.X < 0) //MoveBack
{
m_movementflag += (byte)(uint)Dir_ControlFlags.DIR_CONTROL_FLAG_BACK;
AgentControlFlags |= (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_BACK;
updated = true;
}
else if (LocalVectorToTarget3D.X > 0) //Move Forward
{
m_movementflag += (byte)(uint)Dir_ControlFlags.DIR_CONTROL_FLAG_FORWARD;
AgentControlFlags |= (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_FORWARD;
updated = true;
}
if (LocalVectorToTarget3D.Y > 0) //MoveLeft
{
m_movementflag += (byte)(uint)Dir_ControlFlags.DIR_CONTROL_FLAG_LEFT;
AgentControlFlags |= (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_LEFT;
updated = true;
}
else if (LocalVectorToTarget3D.Y < 0) //MoveRight
{
m_movementflag += (byte)(uint)Dir_ControlFlags.DIR_CONTROL_FLAG_RIGHT;
AgentControlFlags |= (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_RIGHT;
updated = true;
}
if (LocalVectorToTarget3D.Z > 0) //Up
{
// Don't set these flags for up or down - doing so will make the avatar crouch or
// keep trying to jump even if walking along level ground
//m_movementflag += (byte)(uint)Dir_ControlFlags.DIR_CONTROL_FLAG_UP;
//AgentControlFlags
//AgentControlFlags |= (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_UP;
updated = true;
}
else if (LocalVectorToTarget3D.Z < 0) //Down
{
//m_movementflag += (byte)(uint)Dir_ControlFlags.DIR_CONTROL_FLAG_DOWN;
//AgentControlFlags |= (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_DOWN;
updated = true;
}
// m_log.DebugFormat(
// "[SCENE PRESENCE]: HandleMoveToTargetUpdate adding {0} to move vector {1} for {2}",
// LocalVectorToTarget3D, agent_control_v3, Name);
agent_control_v3 += LocalVectorToTarget3D;
}
catch (Exception e)
{
//Avoid system crash, can be slower but...
m_log.DebugFormat("Crash! {0}", e.ToString());
}
}
}
return updated;
}
public void DoMoveToPosition(Object sender, string method, List<String> args)
/// <summary>
/// Move to the given target over time.
/// </summary>
/// <param name="pos"></param>
public void MoveToTarget(Vector3 pos)
{
try
{
float locx = 0f;
float locy = 0f;
float locz = 0f;
uint regionX = 0;
uint regionY = 0;
try
{
Utils.LongToUInts(Scene.RegionInfo.RegionHandle, out regionX, out regionY);
locx = Convert.ToSingle(args[0]) - (float)regionX;
locy = Convert.ToSingle(args[1]) - (float)regionY;
locz = Convert.ToSingle(args[2]);
}
catch (InvalidCastException)
{
m_log.Error("[CLIENT]: Invalid autopilot request");
return;
}
m_moveToPositionInProgress = true;
m_moveToPositionTarget = new Vector3(locx, locy, locz);
}
catch (Exception ex)
{
//Why did I get this error?
m_log.Error("[SCENEPRESENCE]: DoMoveToPosition" + ex);
}
// m_log.DebugFormat(
// "[SCENE PRESENCE]: Avatar {0} received request to move to position {1} in {2}",
// Name, pos, m_scene.RegionInfo.RegionName);
if (pos.X < 0 || pos.X >= Constants.RegionSize
|| pos.Y < 0 || pos.Y >= Constants.RegionSize
|| pos.Z < 0)
return;
// Vector3 heightAdjust = new Vector3(0, 0, Appearance.AvatarHeight / 2);
// pos += heightAdjust;
//
// // Anti duck-walking measure
// if (Math.Abs(pos.Z - AbsolutePosition.Z) < 0.2f)
// {
//// m_log.DebugFormat("[SCENE PRESENCE]: Adjusting MoveToPosition from {0} to {1}", pos, AbsolutePosition);
// pos.Z = AbsolutePosition.Z;
// }
float terrainHeight = (float)m_scene.Heightmap[(int)pos.X, (int)pos.Y];
pos.Z = Math.Max(terrainHeight, pos.Z);
// Fudge factor. It appears that if one clicks "go here" on a piece of ground, the go here request is
// always slightly higher than the actual terrain height.
// FIXME: This constrains NOC movements as well, so should be somewhere else.
if (pos.Z - terrainHeight < 0.2)
pos.Z = terrainHeight;
m_log.DebugFormat(
"[SCENE PRESENCE]: Avatar {0} set move to target {1} (terrain height {2}) in {3}",
Name, pos, terrainHeight, m_scene.RegionInfo.RegionName);
if (pos.Z > terrainHeight)
PhysicsActor.Flying = true;
MovingToTarget = true;
MoveToPositionTarget = pos;
Vector3 agent_control_v3 = new Vector3();
HandleMoveToTargetUpdate(ref agent_control_v3, Rotation);
AddNewMovement(agent_control_v3, Rotation);
}
/// <summary>
/// Reset the move to target.
/// </summary>
public void ResetMoveToTarget()
{
m_log.DebugFormat("[SCENE PRESENCE]: Resetting move to target for {0}", Name);
MovingToTarget = false;
MoveToPositionTarget = Vector3.Zero;
}
private void CheckAtSitTarget()
@ -1832,7 +1890,7 @@ namespace OpenSim.Region.Framework.Scenes
bool forceMouselook = false;
//SceneObjectPart part = m_scene.GetSceneObjectPart(targetID);
SceneObjectPart part = FindNextAvailableSitTarget(targetID);
SceneObjectPart part = FindNextAvailableSitTarget(targetID);
if (part != null)
{
// TODO: determine position to sit at based on scene geometry; don't trust offset from client
@ -1908,13 +1966,22 @@ namespace OpenSim.Region.Framework.Scenes
HandleAgentSit(remoteClient, UUID);
}
// public void HandleAgentRequestSit(IClientAPI remoteClient, UUID agentID, UUID targetID, Vector3 offset, string sitAnimation)
public void HandleAgentRequestSit(IClientAPI remoteClient, UUID agentID, UUID targetID, Vector3 offset)
{
if (m_parentID != 0)
{
StandUp();
}
// if (!String.IsNullOrEmpty(sitAnimation))
// {
// m_nextSitAnimation = sitAnimation;
// }
// else
// {
m_nextSitAnimation = "SIT";
// }
//SceneObjectPart part = m_scene.GetSceneObjectPart(targetID);
SceneObjectPart part = FindNextAvailableSitTarget(targetID);
@ -1940,7 +2007,6 @@ namespace OpenSim.Region.Framework.Scenes
}
else
{
m_log.Warn("Sit requested on unknown object: " + targetID.ToString());
}
@ -2138,44 +2204,7 @@ namespace OpenSim.Region.Framework.Scenes
SendSitResponse(ControllingClient, m_requestedSitTargetUUID, collisionPoint - m_requestedSitOffset, Quaternion.Identity);
}
*/
public void HandleAgentRequestSit(IClientAPI remoteClient, UUID agentID, UUID targetID, Vector3 offset, string sitAnimation)
{
if (m_parentID != 0)
{
StandUp();
}
if (!String.IsNullOrEmpty(sitAnimation))
{
m_nextSitAnimation = sitAnimation;
}
else
{
m_nextSitAnimation = "SIT";
}
//SceneObjectPart part = m_scene.GetSceneObjectPart(targetID);
SceneObjectPart part = FindNextAvailableSitTarget(targetID);
if (part != null)
{
m_requestedSitTargetID = part.LocalId;
//m_requestedSitOffset = offset;
m_requestedSitTargetUUID = targetID;
m_log.DebugFormat("[SIT]: Client requested Sit Position: {0}", offset);
if (m_scene.PhysicsScene.SupportsRayCast())
{
//SitRayCastAvatarPosition(part);
//return;
}
}
else
{
m_log.Warn("Sit requested on unknown object: " + targetID);
}
SendSitResponse(remoteClient, targetID, offset, Quaternion.Identity);
}
public void HandleAgentSit(IClientAPI remoteClient, UUID agentID)
{
@ -2647,10 +2676,11 @@ namespace OpenSim.Region.Framework.Scenes
/// <param name="avatar"></param>
public void SendAppearanceToAgent(ScenePresence avatar)
{
// m_log.WarnFormat("[SP] Send appearance from {0} to {1}",m_uuid,avatar.ControllingClient.AgentId);
// m_log.DebugFormat(
// "[SCENE PRESENCE] Send appearance from {0} {1} to {2} {3}", Name, m_uuid, avatar.Name, avatar.UUID);
avatar.ControllingClient.SendAppearance(
m_appearance.Owner, m_appearance.VisualParams, m_appearance.Texture.GetBytes());
UUID, m_appearance.VisualParams, m_appearance.Texture.GetBytes());
}
// Because appearance setting is in a module, we actually need
@ -2659,7 +2689,11 @@ namespace OpenSim.Region.Framework.Scenes
public AvatarAppearance Appearance
{
get { return m_appearance; }
set { m_appearance = value; }
set
{
m_appearance = value;
// m_log.DebugFormat("[SCENE PRESENCE]: Set appearance for {0} to {1}", Name, value);
}
}
#endregion
@ -2671,15 +2705,10 @@ namespace OpenSim.Region.Framework.Scenes
/// </summary>
protected void CheckForSignificantMovement()
{
// Movement updates for agents in neighboring regions are sent directly to clients.
// This value only affects how often agent positions are sent to neighbor regions
// for things such as distance-based update prioritization
const float SIGNIFICANT_MOVEMENT = 2.0f;
if (Util.GetDistanceTo(AbsolutePosition, posLastSignificantMove) > SIGNIFICANT_MOVEMENT)
{
posLastSignificantMove = AbsolutePosition;
m_scene.EventManager.TriggerSignificantClientMovement(m_controllingClient);
m_scene.EventManager.TriggerSignificantClientMovement(this);
}
// Minimum Draw distance is 64 meters, the Radius of the draw distance sphere is 32m

View File

@ -35,7 +35,7 @@ namespace OpenSim.Region.Framework.Scenes
{
public class UndoState
{
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
public Vector3 Position = Vector3.Zero;
public Vector3 Scale = Vector3.Zero;

View File

@ -806,7 +806,7 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server
public event ScriptReset OnScriptReset;
public event GetScriptRunning OnGetScriptRunning;
public event SetScriptRunning OnSetScriptRunning;
public event UpdateVector OnAutoPilotGo;
public event Action<Vector3> OnAutoPilotGo;
public event TerrainUnacked OnUnackedTerrain;
public event ActivateGesture OnActivateGesture;
public event DeactivateGesture OnDeactivateGesture;
@ -1678,7 +1678,7 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server
{
}
public void SendTextBoxRequest(string message, int chatChannel, string objectname, string ownerFirstName, string ownerLastName, UUID objectId)
public void SendTextBoxRequest(string message, int chatChannel, string objectname, UUID ownerID, string ownerFirstName, string ownerLastName, UUID objectId)
{
}

View File

@ -47,7 +47,7 @@ namespace OpenSim.Region.OptionalModules.Framework.Monitoring
{
protected Scene m_scene;
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
public string Name { get { return "Services Health Monitoring Module"; } }

View File

@ -99,6 +99,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC
{
}
public void SendSitResponse(UUID TargetID, Vector3 OffsetPos, Quaternion SitOrientation, bool autopilot,
Vector3 CameraAtOffset, Vector3 CameraEyeOffset, bool ForceMouseLook)
{
@ -327,7 +328,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC
public event ScriptReset OnScriptReset;
public event GetScriptRunning OnGetScriptRunning;
public event SetScriptRunning OnSetScriptRunning;
public event UpdateVector OnAutoPilotGo;
public event Action<Vector3> OnAutoPilotGo;
public event TerrainUnacked OnUnackedTerrain;
@ -1157,7 +1158,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC
{
}
public void SendTextBoxRequest(string message, int chatChannel, string objectname, string ownerFirstName, string ownerLastName, UUID objectId)
public void SendTextBoxRequest(string message, int chatChannel, string objectname, UUID ownerID, string ownerFirstName, string ownerLastName, UUID objectId)
{
}

View File

@ -44,14 +44,75 @@ namespace OpenSim.Region.OptionalModules.World.NPC
{
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
// private const bool m_enabled = false;
private Dictionary<UUID,NPCAvatar> m_avatars = new Dictionary<UUID, NPCAvatar>();
private Dictionary<UUID,AvatarAppearance> m_appearanceCache = new Dictionary<UUID, AvatarAppearance>();
private Dictionary<UUID, NPCAvatar> m_avatars = new Dictionary<UUID, NPCAvatar>();
private Dictionary<UUID, AvatarAppearance> m_appearanceCache = new Dictionary<UUID, AvatarAppearance>();
public void Initialise(Scene scene, IConfigSource source)
{
scene.RegisterModuleInterface<INPCModule>(this);
IConfig config = source.Configs["NPC"];
if (config != null && config.GetBoolean("Enabled", false))
{
scene.RegisterModuleInterface<INPCModule>(this);
scene.EventManager.OnSignificantClientMovement += HandleOnSignificantClientMovement;
}
}
public void HandleOnSignificantClientMovement(ScenePresence presence)
{
lock (m_avatars)
{
if (m_avatars.ContainsKey(presence.UUID) && presence.MovingToTarget)
{
double distanceToTarget = Util.GetDistanceTo(presence.AbsolutePosition, presence.MoveToPositionTarget);
// m_log.DebugFormat(
// "[NPC MODULE]: Abs pos of {0} is {1}, target {2}, distance {3}",
// presence.Name, presence.AbsolutePosition, presence.MoveToPositionTarget, distanceToTarget);
// Check the error term of the current position in relation to the target position
if (distanceToTarget <= ScenePresence.SIGNIFICANT_MOVEMENT)
{
// We are close enough to the target
m_log.DebugFormat("[NPC MODULE]: Stopping movement of npc {0}", presence.Name);
if (presence.PhysicsActor.Flying)
{
Vector3 targetPos = presence.MoveToPositionTarget;
float terrainHeight = (float)presence.Scene.Heightmap[(int)targetPos.X, (int)targetPos.Y];
if (targetPos.Z - terrainHeight < 0.2)
{
presence.PhysicsActor.Flying = false;
}
}
presence.Velocity = Vector3.Zero;
presence.AbsolutePosition = presence.MoveToPositionTarget;
presence.ResetMoveToTarget();
// FIXME: This doesn't work
if (presence.PhysicsActor.Flying)
presence.Animator.TrySetMovementAnimation("HOVER");
else
presence.Animator.TrySetMovementAnimation("STAND");
}
else
{
m_log.DebugFormat(
"[NPC MODULE]: Updating npc {0} at {1} for next movement to {2}",
presence.Name, presence.AbsolutePosition, presence.MoveToPositionTarget);
Vector3 agent_control_v3 = new Vector3();
presence.HandleMoveToTargetUpdate(ref agent_control_v3, presence.Rotation);
presence.AddNewMovement(agent_control_v3, presence.Rotation);
}
//
//// presence.DoMoveToPositionUpdate((0, presence.MoveToPositionTarget, null);
//
//
}
}
}
private AvatarAppearance GetAppearance(UUID target, Scene scene)
@ -59,14 +120,21 @@ namespace OpenSim.Region.OptionalModules.World.NPC
if (m_appearanceCache.ContainsKey(target))
return m_appearanceCache[target];
AvatarAppearance appearance = scene.AvatarService.GetAppearance(target);
if (appearance != null)
{
m_appearanceCache.Add(target, appearance);
return appearance;
}
ScenePresence originalPresence = scene.GetScenePresence(target);
return new AvatarAppearance();
if (originalPresence != null)
{
AvatarAppearance originalAppearance = originalPresence.Appearance;
m_appearanceCache.Add(target, originalAppearance);
return originalAppearance;
}
else
{
m_log.DebugFormat(
"[NPC MODULE]: Avatar {0} is not in the scene for us to grab baked textures from them. Using defaults.", target);
return new AvatarAppearance();
}
}
public UUID CreateNPC(string firstname, string lastname, Vector3 position, Scene scene, UUID cloneAppearanceFrom)
@ -88,6 +156,13 @@ namespace OpenSim.Region.OptionalModules.World.NPC
AvatarAppearance npcAppearance = new AvatarAppearance(originalAppearance, true);
acd.Appearance = npcAppearance;
// for (int i = 0; i < acd.Appearance.Texture.FaceTextures.Length; i++)
// {
// m_log.DebugFormat(
// "[NPC MODULE]: NPC avatar {0} has texture id {1} : {2}",
// acd.AgentID, i, acd.Appearance.Texture.FaceTextures[i]);
// }
scene.AuthenticateHandler.AddNewCircuit(npcAvatar.CircuitCode, acd);
scene.AddNewClient(npcAvatar);
@ -118,7 +193,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC
return npcAvatar.AgentId;
}
public void Autopilot(UUID agentID, Scene scene, Vector3 pos)
public void MoveToTarget(UUID agentID, Scene scene, Vector3 pos)
{
lock (m_avatars)
{
@ -126,7 +201,11 @@ namespace OpenSim.Region.OptionalModules.World.NPC
{
ScenePresence sp;
scene.TryGetScenePresence(agentID, out sp);
sp.DoAutoPilot(0, pos, m_avatars[agentID]);
m_log.DebugFormat(
"[NPC MODULE]: Moving {0} to {1} in {2}", sp.Name, pos, scene.RegionInfo.RegionName);
sp.MoveToTarget(pos);
}
}
}

View File

@ -27,11 +27,13 @@
using System;
using System.Reflection;
using log4net;
using Nini.Config;
using NUnit.Framework;
using OpenMetaverse;
using OpenSim.Framework;
using OpenSim.Framework.Communications;
using OpenSim.Region.CoreModules.Avatar.AvatarFactory;
using OpenSim.Region.CoreModules.ServiceConnectorsOut.Avatar;
using OpenSim.Region.Framework.Interfaces;
using OpenSim.Region.Framework.Scenes;
@ -51,21 +53,104 @@ namespace OpenSim.Region.OptionalModules.World.NPC.Tests
// log4net.Config.XmlConfigurator.Configure();
IConfigSource config = new IniConfigSource();
config.AddConfig("NPC");
config.Configs["NPC"].Set("Enabled", "true");
config.AddConfig("Modules");
config.Configs["Modules"].Set("AvatarServices", "LocalAvatarServicesConnector");
config.AddConfig("AvatarService");
config.Configs["AvatarService"].Set("LocalServiceModule", "OpenSim.Services.AvatarService.dll:AvatarService");
config.Configs["AvatarService"].Set("StorageProvider", "OpenSim.Data.Null.dll");
AvatarFactoryModule afm = new AvatarFactoryModule();
TestScene scene = SceneSetupHelpers.SetupScene();
SceneSetupHelpers.SetupSceneModules(scene, config, new NPCModule(), new LocalAvatarServicesConnector());
SceneSetupHelpers.SetupSceneModules(scene, config, afm, new NPCModule());
TestClient originalClient = SceneSetupHelpers.AddClient(scene, TestHelper.ParseTail(0x1));
// ScenePresence originalAvatar = scene.GetScenePresence(originalClient.AgentId);
// 8 is the index of the first baked texture in AvatarAppearance
UUID originalFace8TextureId = TestHelper.ParseTail(0x10);
Primitive.TextureEntry originalTe = new Primitive.TextureEntry(UUID.Zero);
Primitive.TextureEntryFace originalTef = originalTe.CreateFace(8);
originalTef.TextureID = originalFace8TextureId;
// We also need to add the texture to the asset service, otherwise the AvatarFactoryModule will tell
// ScenePresence.SendInitialData() to reset our entire appearance.
scene.AssetService.Store(AssetHelpers.CreateAsset(originalFace8TextureId));
afm.SetAppearance(originalClient, originalTe, null);
INPCModule npcModule = scene.RequestModuleInterface<INPCModule>();
UUID npcId = npcModule.CreateNPC("John", "Smith", new Vector3(128, 128, 30), scene, UUID.Zero);
UUID npcId = npcModule.CreateNPC("John", "Smith", new Vector3(128, 128, 30), scene, originalClient.AgentId);
ScenePresence npc = scene.GetScenePresence(npcId);
Assert.That(npc, Is.Not.Null);
Assert.That(npc.Appearance.Texture.FaceTextures[8].TextureID, Is.EqualTo(originalFace8TextureId));
}
[Test]
public void TestMove()
{
TestHelper.InMethod();
// log4net.Config.XmlConfigurator.Configure();
IConfigSource config = new IniConfigSource();
config.AddConfig("NPC");
config.Configs["NPC"].Set("Enabled", "true");
TestScene scene = SceneSetupHelpers.SetupScene();
SceneSetupHelpers.SetupSceneModules(scene, config, new NPCModule());
TestClient originalClient = SceneSetupHelpers.AddClient(scene, TestHelper.ParseTail(0x1));
// ScenePresence originalAvatar = scene.GetScenePresence(originalClient.AgentId);
Vector3 startPos = new Vector3(128, 128, 30);
INPCModule npcModule = scene.RequestModuleInterface<INPCModule>();
UUID npcId = npcModule.CreateNPC("John", "Smith", startPos, scene, originalClient.AgentId);
ScenePresence npc = scene.GetScenePresence(npcId);
Assert.That(npc.AbsolutePosition, Is.EqualTo(startPos));
// For now, we'll make the scene presence fly to simplify this test, but this needs to change.
npc.PhysicsActor.Flying = true;
scene.Update();
Assert.That(npc.AbsolutePosition, Is.EqualTo(startPos));
Vector3 targetPos = startPos + new Vector3(0, 0, 10);
npcModule.MoveToTarget(npc.UUID, scene, targetPos);
Assert.That(npc.AbsolutePosition, Is.EqualTo(startPos));
scene.Update();
// We should really check the exact figure.
Assert.That(npc.AbsolutePosition.X, Is.EqualTo(startPos.X));
Assert.That(npc.AbsolutePosition.Y, Is.EqualTo(startPos.Y));
Assert.That(npc.AbsolutePosition.Z, Is.GreaterThan(startPos.Z));
Assert.That(npc.AbsolutePosition.Z, Is.LessThan(targetPos.Z));
for (int i = 0; i < 10; i++)
scene.Update();
double distanceToTarget = Util.GetDistanceTo(npc.AbsolutePosition, targetPos);
Assert.That(distanceToTarget, Is.LessThan(1), "NPC not within 1 unit of target position on first move");
Assert.That(npc.AbsolutePosition, Is.EqualTo(targetPos));
// Try a second movement
startPos = npc.AbsolutePosition;
targetPos = startPos + new Vector3(10, 0, 0);
npcModule.MoveToTarget(npc.UUID, scene, targetPos);
scene.Update();
// We should really check the exact figure.
Assert.That(npc.AbsolutePosition.X, Is.GreaterThan(startPos.X));
Assert.That(npc.AbsolutePosition.X, Is.LessThan(targetPos.X));
Assert.That(npc.AbsolutePosition.Y, Is.EqualTo(startPos.Y));
Assert.That(npc.AbsolutePosition.Z, Is.EqualTo(startPos.Z));
for (int i = 0; i < 10; i++)
scene.Update();
distanceToTarget = Util.GetDistanceTo(npc.AbsolutePosition, targetPos);
Assert.That(distanceToTarget, Is.LessThan(1), "NPC not within 1 unit of target position on second move");
Assert.That(npc.AbsolutePosition, Is.EqualTo(targetPos));
}
}
}

View File

@ -123,11 +123,15 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin
actorPosition.X = ((int)Constants.RegionSize - 0.1f);
}
float height = _heightMap[(int)actor.Position.Y * Constants.RegionSize + (int)actor.Position.X] + actor.Size.Z;
float terrainHeight = 0;
if (_heightMap != null)
terrainHeight = _heightMap[(int)actor.Position.Y * Constants.RegionSize + (int)actor.Position.X];
float height = terrainHeight + actor.Size.Z;
if (actor.Flying)
{
if (actor.Position.Z + (actor.Velocity.Z*timeStep) <
_heightMap[(int)actor.Position.Y * Constants.RegionSize + (int)actor.Position.X] + 2)
if (actor.Position.Z + (actor.Velocity.Z * timeStep) < terrainHeight + 2)
{
actorPosition.Z = height;
actorVelocity.Z = 0;
@ -135,7 +139,7 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin
}
else
{
actorPosition.Z += actor.Velocity.Z*timeStep;
actorPosition.Z += actor.Velocity.Z * timeStep;
actor.IsColliding = false;
}
}

View File

@ -86,6 +86,10 @@ namespace OpenSim.Region.Physics.Manager
public abstract void RemoveAvatar(PhysicsActor actor);
/// <summary>
/// Remove a prim from the physics scene.
/// </summary>
/// <param name="prim"></param>
public abstract void RemovePrim(PhysicsActor prim);
public abstract PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, Vector3 position,

View File

@ -301,20 +301,22 @@ namespace OpenSim.Region.Physics.Meshing
}
}
/// <summary>
/// Create a physics mesh from data that comes with the prim. The actual data used depends on the prim type.
/// </summary>
/// <param name="primName"></param>
/// <param name="primShape"></param>
/// <param name="size"></param>
/// <param name="lod"></param>
/// <returns></returns>
private Mesh CreateMeshFromPrimMesher(string primName, PrimitiveBaseShape primShape, Vector3 size, float lod)
{
// m_log.DebugFormat(
// "[MESH]: Creating physics proxy for {0}, shape {1}",
// primName, (OpenMetaverse.SculptType)primShape.SculptType);
PrimMesh primMesh;
PrimMesher.SculptMesh sculptMesh;
List<Coord> coords = new List<Coord>();
List<Face> faces = new List<Face>();
Image idata = null;
string decodedSculptFileName = "";
List<Coord> coords;
List<Face> faces;
if (primShape.SculptEntry)
{
@ -323,312 +325,19 @@ namespace OpenSim.Region.Physics.Meshing
if (!useMeshiesPhysicsMesh)
return null;
m_log.DebugFormat("[MESH]: experimental mesh proxy generation for {0}", primName);
OSD meshOsd = null;
if (primShape.SculptData.Length <= 0)
{
m_log.Error("[MESH]: asset data is zero length");
if (!GenerateCoordsAndFacesFromPrimMeshData(primName, primShape, size, out coords, out faces))
return null;
}
long start = 0;
using (MemoryStream data = new MemoryStream(primShape.SculptData))
{
try
{
OSD osd = OSDParser.DeserializeLLSDBinary(data);
if (osd is OSDMap)
meshOsd = (OSDMap)osd;
else
{
m_log.Warn("[Mesh}: unable to cast mesh asset to OSDMap");
return null;
}
}
catch (Exception e)
{
m_log.Error("[MESH]: Exception deserializing mesh asset header:" + e.ToString());
}
start = data.Position;
}
if (meshOsd is OSDMap)
{
OSDMap physicsParms = null;
OSDMap map = (OSDMap)meshOsd;
if (map.ContainsKey("physics_shape"))
physicsParms = (OSDMap)map["physics_shape"]; // old asset format
else if (map.ContainsKey("physics_mesh"))
physicsParms = (OSDMap)map["physics_mesh"]; // new asset format
if (physicsParms == null)
{
m_log.Warn("[MESH]: no recognized physics mesh found in mesh asset");
return null;
}
int physOffset = physicsParms["offset"].AsInteger() + (int)start;
int physSize = physicsParms["size"].AsInteger();
if (physOffset < 0 || physSize == 0)
return null; // no mesh data in asset
OSD decodedMeshOsd = new OSD();
byte[] meshBytes = new byte[physSize];
System.Buffer.BlockCopy(primShape.SculptData, physOffset, meshBytes, 0, physSize);
// byte[] decompressed = new byte[physSize * 5];
try
{
using (MemoryStream inMs = new MemoryStream(meshBytes))
{
using (MemoryStream outMs = new MemoryStream())
{
using (ZOutputStream zOut = new ZOutputStream(outMs))
{
byte[] readBuffer = new byte[2048];
int readLen = 0;
while ((readLen = inMs.Read(readBuffer, 0, readBuffer.Length)) > 0)
{
zOut.Write(readBuffer, 0, readLen);
}
zOut.Flush();
outMs.Seek(0, SeekOrigin.Begin);
byte[] decompressedBuf = outMs.GetBuffer();
decodedMeshOsd = OSDParser.DeserializeLLSDBinary(decompressedBuf);
}
}
}
}
catch (Exception e)
{
m_log.Error("[MESH]: exception decoding physical mesh: " + e.ToString());
return null;
}
OSDArray decodedMeshOsdArray = null;
// physics_shape is an array of OSDMaps, one for each submesh
if (decodedMeshOsd is OSDArray)
{
// Console.WriteLine("decodedMeshOsd for {0} - {1}", primName, Util.GetFormattedXml(decodedMeshOsd));
decodedMeshOsdArray = (OSDArray)decodedMeshOsd;
foreach (OSD subMeshOsd in decodedMeshOsdArray)
{
if (subMeshOsd is OSDMap)
AddSubMesh(subMeshOsd as OSDMap, size, coords, faces);
}
}
}
}
else
{
if (cacheSculptMaps && primShape.SculptTexture != UUID.Zero)
{
decodedSculptFileName = System.IO.Path.Combine(decodedSculptMapPath, "smap_" + primShape.SculptTexture.ToString());
try
{
if (File.Exists(decodedSculptFileName))
{
idata = Image.FromFile(decodedSculptFileName);
}
}
catch (Exception e)
{
m_log.Error("[SCULPT]: unable to load cached sculpt map " + decodedSculptFileName + " " + e.Message);
}
//if (idata != null)
// m_log.Debug("[SCULPT]: loaded cached map asset for map ID: " + primShape.SculptTexture.ToString());
}
if (idata == null)
{
if (primShape.SculptData == null || primShape.SculptData.Length == 0)
return null;
try
{
OpenMetaverse.Imaging.ManagedImage unusedData;
OpenMetaverse.Imaging.OpenJPEG.DecodeToImage(primShape.SculptData, out unusedData, out idata);
unusedData = null;
//idata = CSJ2K.J2kImage.FromBytes(primShape.SculptData);
if (cacheSculptMaps && idata != null)
{
try { idata.Save(decodedSculptFileName, ImageFormat.MemoryBmp); }
catch (Exception e) { m_log.Error("[SCULPT]: unable to cache sculpt map " + decodedSculptFileName + " " + e.Message); }
}
}
catch (DllNotFoundException)
{
m_log.Error("[PHYSICS]: OpenJpeg is not installed correctly on this system. Physics Proxy generation failed. Often times this is because of an old version of GLIBC. You must have version 2.4 or above!");
return null;
}
catch (IndexOutOfRangeException)
{
m_log.Error("[PHYSICS]: OpenJpeg was unable to decode this. Physics Proxy generation failed");
return null;
}
catch (Exception ex)
{
m_log.Error("[PHYSICS]: Unable to generate a Sculpty physics proxy. Sculpty texture decode failed: " + ex.Message);
return null;
}
}
PrimMesher.SculptMesh.SculptType sculptType;
switch ((OpenMetaverse.SculptType)primShape.SculptType)
{
case OpenMetaverse.SculptType.Cylinder:
sculptType = PrimMesher.SculptMesh.SculptType.cylinder;
break;
case OpenMetaverse.SculptType.Plane:
sculptType = PrimMesher.SculptMesh.SculptType.plane;
break;
case OpenMetaverse.SculptType.Torus:
sculptType = PrimMesher.SculptMesh.SculptType.torus;
break;
case OpenMetaverse.SculptType.Sphere:
sculptType = PrimMesher.SculptMesh.SculptType.sphere;
break;
default:
sculptType = PrimMesher.SculptMesh.SculptType.plane;
break;
}
bool mirror = ((primShape.SculptType & 128) != 0);
bool invert = ((primShape.SculptType & 64) != 0);
sculptMesh = new PrimMesher.SculptMesh((Bitmap)idata, sculptType, (int)lod, false, mirror, invert);
idata.Dispose();
sculptMesh.DumpRaw(baseDir, primName, "primMesh");
sculptMesh.Scale(size.X, size.Y, size.Z);
coords = sculptMesh.coords;
faces = sculptMesh.faces;
if (!GenerateCoordsAndFacesFromPrimSculptData(primName, primShape, size, lod, out coords, out faces))
return null;
}
}
else
{
float pathShearX = primShape.PathShearX < 128 ? (float)primShape.PathShearX * 0.01f : (float)(primShape.PathShearX - 256) * 0.01f;
float pathShearY = primShape.PathShearY < 128 ? (float)primShape.PathShearY * 0.01f : (float)(primShape.PathShearY - 256) * 0.01f;
float pathBegin = (float)primShape.PathBegin * 2.0e-5f;
float pathEnd = 1.0f - (float)primShape.PathEnd * 2.0e-5f;
float pathScaleX = (float)(primShape.PathScaleX - 100) * 0.01f;
float pathScaleY = (float)(primShape.PathScaleY - 100) * 0.01f;
float profileBegin = (float)primShape.ProfileBegin * 2.0e-5f;
float profileEnd = 1.0f - (float)primShape.ProfileEnd * 2.0e-5f;
float profileHollow = (float)primShape.ProfileHollow * 2.0e-5f;
if (profileHollow > 0.95f)
profileHollow = 0.95f;
int sides = 4;
if ((primShape.ProfileCurve & 0x07) == (byte)ProfileShape.EquilateralTriangle)
sides = 3;
else if ((primShape.ProfileCurve & 0x07) == (byte)ProfileShape.Circle)
sides = 24;
else if ((primShape.ProfileCurve & 0x07) == (byte)ProfileShape.HalfCircle)
{ // half circle, prim is a sphere
sides = 24;
profileBegin = 0.5f * profileBegin + 0.5f;
profileEnd = 0.5f * profileEnd + 0.5f;
}
int hollowSides = sides;
if (primShape.HollowShape == HollowShape.Circle)
hollowSides = 24;
else if (primShape.HollowShape == HollowShape.Square)
hollowSides = 4;
else if (primShape.HollowShape == HollowShape.Triangle)
hollowSides = 3;
primMesh = new PrimMesh(sides, profileBegin, profileEnd, profileHollow, hollowSides);
if (primMesh.errorMessage != null)
if (primMesh.errorMessage.Length > 0)
m_log.Error("[ERROR] " + primMesh.errorMessage);
primMesh.topShearX = pathShearX;
primMesh.topShearY = pathShearY;
primMesh.pathCutBegin = pathBegin;
primMesh.pathCutEnd = pathEnd;
if (primShape.PathCurve == (byte)Extrusion.Straight || primShape.PathCurve == (byte) Extrusion.Flexible)
{
primMesh.twistBegin = primShape.PathTwistBegin * 18 / 10;
primMesh.twistEnd = primShape.PathTwist * 18 / 10;
primMesh.taperX = pathScaleX;
primMesh.taperY = pathScaleY;
if (profileBegin < 0.0f || profileBegin >= profileEnd || profileEnd > 1.0f)
{
ReportPrimError("*** CORRUPT PRIM!! ***", primName, primMesh);
if (profileBegin < 0.0f) profileBegin = 0.0f;
if (profileEnd > 1.0f) profileEnd = 1.0f;
}
#if SPAM
m_log.Debug("****** PrimMesh Parameters (Linear) ******\n" + primMesh.ParamsToDisplayString());
#endif
try
{
primMesh.ExtrudeLinear();
}
catch (Exception ex)
{
ReportPrimError("Extrusion failure: exception: " + ex.ToString(), primName, primMesh);
return null;
}
}
else
{
primMesh.holeSizeX = (200 - primShape.PathScaleX) * 0.01f;
primMesh.holeSizeY = (200 - primShape.PathScaleY) * 0.01f;
primMesh.radius = 0.01f * primShape.PathRadiusOffset;
primMesh.revolutions = 1.0f + 0.015f * primShape.PathRevolutions;
primMesh.skew = 0.01f * primShape.PathSkew;
primMesh.twistBegin = primShape.PathTwistBegin * 36 / 10;
primMesh.twistEnd = primShape.PathTwist * 36 / 10;
primMesh.taperX = primShape.PathTaperX * 0.01f;
primMesh.taperY = primShape.PathTaperY * 0.01f;
if (profileBegin < 0.0f || profileBegin >= profileEnd || profileEnd > 1.0f)
{
ReportPrimError("*** CORRUPT PRIM!! ***", primName, primMesh);
if (profileBegin < 0.0f) profileBegin = 0.0f;
if (profileEnd > 1.0f) profileEnd = 1.0f;
}
#if SPAM
m_log.Debug("****** PrimMesh Parameters (Circular) ******\n" + primMesh.ParamsToDisplayString());
#endif
try
{
primMesh.ExtrudeCircular();
}
catch (Exception ex)
{
ReportPrimError("Extrusion failure: exception: " + ex.ToString(), primName, primMesh);
return null;
}
}
primMesh.DumpRaw(baseDir, primName, "primMesh");
primMesh.Scale(size.X, size.Y, size.Z);
coords = primMesh.coords;
faces = primMesh.faces;
if (!GenerateCoordsAndFacesFromPrimShapeData(primName, primShape, size, out coords, out faces))
return null;
}
// Remove the reference to any JPEG2000 sculpt data so it can be GCed
@ -656,6 +365,376 @@ namespace OpenSim.Region.Physics.Meshing
return mesh;
}
/// <summary>
/// Generate the co-ords and faces necessary to construct a mesh from the mesh data the accompanies a prim.
/// </summary>
/// <param name="primName"></param>
/// <param name="primShape"></param>
/// <param name="size"></param>
/// <param name="coords">Coords are added to this list by the method.</param>
/// <param name="faces">Faces are added to this list by the method.</param>
/// <returns>true if coords and faces were successfully generated, false if not</returns>
private bool GenerateCoordsAndFacesFromPrimMeshData(
string primName, PrimitiveBaseShape primShape, Vector3 size, out List<Coord> coords, out List<Face> faces)
{
m_log.DebugFormat("[MESH]: experimental mesh proxy generation for {0}", primName);
coords = new List<Coord>();
faces = new List<Face>();
OSD meshOsd = null;
if (primShape.SculptData.Length <= 0)
{
m_log.Error("[MESH]: asset data is zero length");
return false;
}
long start = 0;
using (MemoryStream data = new MemoryStream(primShape.SculptData))
{
try
{
OSD osd = OSDParser.DeserializeLLSDBinary(data);
if (osd is OSDMap)
meshOsd = (OSDMap)osd;
else
{
m_log.Warn("[Mesh}: unable to cast mesh asset to OSDMap");
return false;
}
}
catch (Exception e)
{
m_log.Error("[MESH]: Exception deserializing mesh asset header:" + e.ToString());
}
start = data.Position;
}
if (meshOsd is OSDMap)
{
OSDMap physicsParms = null;
OSDMap map = (OSDMap)meshOsd;
if (map.ContainsKey("physics_shape"))
physicsParms = (OSDMap)map["physics_shape"]; // old asset format
else if (map.ContainsKey("physics_mesh"))
physicsParms = (OSDMap)map["physics_mesh"]; // new asset format
if (physicsParms == null)
{
m_log.Warn("[MESH]: no recognized physics mesh found in mesh asset");
return false;
}
int physOffset = physicsParms["offset"].AsInteger() + (int)start;
int physSize = physicsParms["size"].AsInteger();
if (physOffset < 0 || physSize == 0)
return false; // no mesh data in asset
OSD decodedMeshOsd = new OSD();
byte[] meshBytes = new byte[physSize];
System.Buffer.BlockCopy(primShape.SculptData, physOffset, meshBytes, 0, physSize);
// byte[] decompressed = new byte[physSize * 5];
try
{
using (MemoryStream inMs = new MemoryStream(meshBytes))
{
using (MemoryStream outMs = new MemoryStream())
{
using (ZOutputStream zOut = new ZOutputStream(outMs))
{
byte[] readBuffer = new byte[2048];
int readLen = 0;
while ((readLen = inMs.Read(readBuffer, 0, readBuffer.Length)) > 0)
{
zOut.Write(readBuffer, 0, readLen);
}
zOut.Flush();
outMs.Seek(0, SeekOrigin.Begin);
byte[] decompressedBuf = outMs.GetBuffer();
decodedMeshOsd = OSDParser.DeserializeLLSDBinary(decompressedBuf);
}
}
}
}
catch (Exception e)
{
m_log.Error("[MESH]: exception decoding physical mesh: " + e.ToString());
return false;
}
OSDArray decodedMeshOsdArray = null;
// physics_shape is an array of OSDMaps, one for each submesh
if (decodedMeshOsd is OSDArray)
{
// Console.WriteLine("decodedMeshOsd for {0} - {1}", primName, Util.GetFormattedXml(decodedMeshOsd));
decodedMeshOsdArray = (OSDArray)decodedMeshOsd;
foreach (OSD subMeshOsd in decodedMeshOsdArray)
{
if (subMeshOsd is OSDMap)
AddSubMesh(subMeshOsd as OSDMap, size, coords, faces);
}
}
}
return true;
}
/// <summary>
/// Generate the co-ords and faces necessary to construct a mesh from the sculpt data the accompanies a prim.
/// </summary>
/// <param name="primName"></param>
/// <param name="primShape"></param>
/// <param name="size"></param>
/// <param name="lod"></param>
/// <param name="coords">Coords are added to this list by the method.</param>
/// <param name="faces">Faces are added to this list by the method.</param>
/// <returns>true if coords and faces were successfully generated, false if not</returns>
private bool GenerateCoordsAndFacesFromPrimSculptData(
string primName, PrimitiveBaseShape primShape, Vector3 size, float lod, out List<Coord> coords, out List<Face> faces)
{
coords = new List<Coord>();
faces = new List<Face>();
PrimMesher.SculptMesh sculptMesh;
Image idata = null;
string decodedSculptFileName = "";
if (cacheSculptMaps && primShape.SculptTexture != UUID.Zero)
{
decodedSculptFileName = System.IO.Path.Combine(decodedSculptMapPath, "smap_" + primShape.SculptTexture.ToString());
try
{
if (File.Exists(decodedSculptFileName))
{
idata = Image.FromFile(decodedSculptFileName);
}
}
catch (Exception e)
{
m_log.Error("[SCULPT]: unable to load cached sculpt map " + decodedSculptFileName + " " + e.Message);
}
//if (idata != null)
// m_log.Debug("[SCULPT]: loaded cached map asset for map ID: " + primShape.SculptTexture.ToString());
}
if (idata == null)
{
if (primShape.SculptData == null || primShape.SculptData.Length == 0)
return false;
try
{
OpenMetaverse.Imaging.ManagedImage unusedData;
OpenMetaverse.Imaging.OpenJPEG.DecodeToImage(primShape.SculptData, out unusedData, out idata);
if (idata == null)
{
// In some cases it seems that the decode can return a null bitmap without throwing
// an exception
m_log.WarnFormat("[PHYSICS]: OpenJPEG decoded sculpt data for {0} to a null bitmap. Ignoring.", primName);
return false;
}
unusedData = null;
//idata = CSJ2K.J2kImage.FromBytes(primShape.SculptData);
if (cacheSculptMaps)
{
try { idata.Save(decodedSculptFileName, ImageFormat.MemoryBmp); }
catch (Exception e) { m_log.Error("[SCULPT]: unable to cache sculpt map " + decodedSculptFileName + " " + e.Message); }
}
}
catch (DllNotFoundException)
{
m_log.Error("[PHYSICS]: OpenJpeg is not installed correctly on this system. Physics Proxy generation failed. Often times this is because of an old version of GLIBC. You must have version 2.4 or above!");
return false;
}
catch (IndexOutOfRangeException)
{
m_log.Error("[PHYSICS]: OpenJpeg was unable to decode this. Physics Proxy generation failed");
return false;
}
catch (Exception ex)
{
m_log.Error("[PHYSICS]: Unable to generate a Sculpty physics proxy. Sculpty texture decode failed: " + ex.Message);
return false;
}
}
PrimMesher.SculptMesh.SculptType sculptType;
switch ((OpenMetaverse.SculptType)primShape.SculptType)
{
case OpenMetaverse.SculptType.Cylinder:
sculptType = PrimMesher.SculptMesh.SculptType.cylinder;
break;
case OpenMetaverse.SculptType.Plane:
sculptType = PrimMesher.SculptMesh.SculptType.plane;
break;
case OpenMetaverse.SculptType.Torus:
sculptType = PrimMesher.SculptMesh.SculptType.torus;
break;
case OpenMetaverse.SculptType.Sphere:
sculptType = PrimMesher.SculptMesh.SculptType.sphere;
break;
default:
sculptType = PrimMesher.SculptMesh.SculptType.plane;
break;
}
bool mirror = ((primShape.SculptType & 128) != 0);
bool invert = ((primShape.SculptType & 64) != 0);
sculptMesh = new PrimMesher.SculptMesh((Bitmap)idata, sculptType, (int)lod, false, mirror, invert);
idata.Dispose();
sculptMesh.DumpRaw(baseDir, primName, "primMesh");
sculptMesh.Scale(size.X, size.Y, size.Z);
coords = sculptMesh.coords;
faces = sculptMesh.faces;
return true;
}
/// <summary>
/// Generate the co-ords and faces necessary to construct a mesh from the shape data the accompanies a prim.
/// </summary>
/// <param name="primName"></param>
/// <param name="primShape"></param>
/// <param name="size"></param>
/// <param name="coords">Coords are added to this list by the method.</param>
/// <param name="faces">Faces are added to this list by the method.</param>
/// <returns>true if coords and faces were successfully generated, false if not</returns>
private bool GenerateCoordsAndFacesFromPrimShapeData(
string primName, PrimitiveBaseShape primShape, Vector3 size, out List<Coord> coords, out List<Face> faces)
{
PrimMesh primMesh;
coords = new List<Coord>();
faces = new List<Face>();
float pathShearX = primShape.PathShearX < 128 ? (float)primShape.PathShearX * 0.01f : (float)(primShape.PathShearX - 256) * 0.01f;
float pathShearY = primShape.PathShearY < 128 ? (float)primShape.PathShearY * 0.01f : (float)(primShape.PathShearY - 256) * 0.01f;
float pathBegin = (float)primShape.PathBegin * 2.0e-5f;
float pathEnd = 1.0f - (float)primShape.PathEnd * 2.0e-5f;
float pathScaleX = (float)(primShape.PathScaleX - 100) * 0.01f;
float pathScaleY = (float)(primShape.PathScaleY - 100) * 0.01f;
float profileBegin = (float)primShape.ProfileBegin * 2.0e-5f;
float profileEnd = 1.0f - (float)primShape.ProfileEnd * 2.0e-5f;
float profileHollow = (float)primShape.ProfileHollow * 2.0e-5f;
if (profileHollow > 0.95f)
profileHollow = 0.95f;
int sides = 4;
if ((primShape.ProfileCurve & 0x07) == (byte)ProfileShape.EquilateralTriangle)
sides = 3;
else if ((primShape.ProfileCurve & 0x07) == (byte)ProfileShape.Circle)
sides = 24;
else if ((primShape.ProfileCurve & 0x07) == (byte)ProfileShape.HalfCircle)
{ // half circle, prim is a sphere
sides = 24;
profileBegin = 0.5f * profileBegin + 0.5f;
profileEnd = 0.5f * profileEnd + 0.5f;
}
int hollowSides = sides;
if (primShape.HollowShape == HollowShape.Circle)
hollowSides = 24;
else if (primShape.HollowShape == HollowShape.Square)
hollowSides = 4;
else if (primShape.HollowShape == HollowShape.Triangle)
hollowSides = 3;
primMesh = new PrimMesh(sides, profileBegin, profileEnd, profileHollow, hollowSides);
if (primMesh.errorMessage != null)
if (primMesh.errorMessage.Length > 0)
m_log.Error("[ERROR] " + primMesh.errorMessage);
primMesh.topShearX = pathShearX;
primMesh.topShearY = pathShearY;
primMesh.pathCutBegin = pathBegin;
primMesh.pathCutEnd = pathEnd;
if (primShape.PathCurve == (byte)Extrusion.Straight || primShape.PathCurve == (byte) Extrusion.Flexible)
{
primMesh.twistBegin = primShape.PathTwistBegin * 18 / 10;
primMesh.twistEnd = primShape.PathTwist * 18 / 10;
primMesh.taperX = pathScaleX;
primMesh.taperY = pathScaleY;
if (profileBegin < 0.0f || profileBegin >= profileEnd || profileEnd > 1.0f)
{
ReportPrimError("*** CORRUPT PRIM!! ***", primName, primMesh);
if (profileBegin < 0.0f) profileBegin = 0.0f;
if (profileEnd > 1.0f) profileEnd = 1.0f;
}
#if SPAM
m_log.Debug("****** PrimMesh Parameters (Linear) ******\n" + primMesh.ParamsToDisplayString());
#endif
try
{
primMesh.ExtrudeLinear();
}
catch (Exception ex)
{
ReportPrimError("Extrusion failure: exception: " + ex.ToString(), primName, primMesh);
return false;
}
}
else
{
primMesh.holeSizeX = (200 - primShape.PathScaleX) * 0.01f;
primMesh.holeSizeY = (200 - primShape.PathScaleY) * 0.01f;
primMesh.radius = 0.01f * primShape.PathRadiusOffset;
primMesh.revolutions = 1.0f + 0.015f * primShape.PathRevolutions;
primMesh.skew = 0.01f * primShape.PathSkew;
primMesh.twistBegin = primShape.PathTwistBegin * 36 / 10;
primMesh.twistEnd = primShape.PathTwist * 36 / 10;
primMesh.taperX = primShape.PathTaperX * 0.01f;
primMesh.taperY = primShape.PathTaperY * 0.01f;
if (profileBegin < 0.0f || profileBegin >= profileEnd || profileEnd > 1.0f)
{
ReportPrimError("*** CORRUPT PRIM!! ***", primName, primMesh);
if (profileBegin < 0.0f) profileBegin = 0.0f;
if (profileEnd > 1.0f) profileEnd = 1.0f;
}
#if SPAM
m_log.Debug("****** PrimMesh Parameters (Circular) ******\n" + primMesh.ParamsToDisplayString());
#endif
try
{
primMesh.ExtrudeCircular();
}
catch (Exception ex)
{
ReportPrimError("Extrusion failure: exception: " + ex.ToString(), primName, primMesh);
return false;
}
}
primMesh.DumpRaw(baseDir, primName, "primMesh");
primMesh.Scale(size.X, size.Y, size.Z);
coords = primMesh.coords;
faces = primMesh.faces;
return true;
}
public IMesh CreateMesh(String primName, PrimitiveBaseShape primShape, Vector3 size, float lod)
{
return CreateMesh(primName, primShape, size, lod, false);

View File

@ -1220,18 +1220,23 @@ namespace OpenSim.Region.Physics.OdePlugin
{
m_requestedUpdateFrequency = ms;
m_eventsubscription = ms;
_parent_scene.addCollisionEventReporting(this);
_parent_scene.AddCollisionEventReporting(this);
}
public override void UnSubscribeEvents()
{
_parent_scene.remCollisionEventReporting(this);
_parent_scene.RemoveCollisionEventReporting(this);
m_requestedUpdateFrequency = 0;
m_eventsubscription = 0;
}
public void AddCollisionEvent(uint CollidedWith, ContactPoint contact)
{
if (m_eventsubscription > 0)
{
// m_log.DebugFormat(
// "[PHYSICS]: Adding collision event for {0}, collidedWith {1}, contact {2}", "", CollidedWith, contact);
CollisionEventsThisFrame.addCollider(CollidedWith, contact);
}
}
@ -1248,6 +1253,7 @@ namespace OpenSim.Region.Physics.OdePlugin
m_eventsubscription = 0;
}
}
public override bool SubscribedEvents()
{
if (m_eventsubscription > 0)

View File

@ -61,6 +61,22 @@ namespace OpenSim.Region.Physics.OdePlugin
{
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
private bool m_isphysical;
/// <summary>
/// Is this prim subject to physics? Even if not, it's still solid for collision purposes.
/// </summary>
public override bool IsPhysical
{
get { return m_isphysical; }
set
{
m_isphysical = value;
if (!m_isphysical) // Zero the remembered last velocity
m_lastVelocity = Vector3.Zero;
}
}
private Vector3 _position;
private Vector3 _velocity;
private Vector3 _torque;
@ -138,12 +154,15 @@ namespace OpenSim.Region.Physics.OdePlugin
private List<Vector3> m_forcelist = new List<Vector3>();
private List<Vector3> m_angularforcelist = new List<Vector3>();
private IMesh _mesh;
private PrimitiveBaseShape _pbs;
private OdeScene _parent_scene;
/// <summary>
/// The physics space which contains prim geometries
/// </summary>
public IntPtr m_targetSpace = IntPtr.Zero;
public IntPtr prim_geom;
public IntPtr prev_geom;
public IntPtr _triMeshData;
private IntPtr _linkJointGroup = IntPtr.Zero;
@ -153,7 +172,6 @@ namespace OpenSim.Region.Physics.OdePlugin
private List<OdePrim> childrenPrim = new List<OdePrim>();
private bool iscolliding;
private bool m_isphysical;
private bool m_isSelected;
internal bool m_isVolumeDetect; // If true, this prim only detects collisions but doesn't collide actively
@ -188,7 +206,7 @@ namespace OpenSim.Region.Physics.OdePlugin
internal int m_material = (int)Material.Wood;
public OdePrim(String primName, OdeScene parent_scene, Vector3 pos, Vector3 size,
Quaternion rotation, IMesh mesh, PrimitiveBaseShape pbs, bool pisPhysical, CollisionLocker dode)
Quaternion rotation, PrimitiveBaseShape pbs, bool pisPhysical, CollisionLocker dode)
{
Name = primName;
m_vehicle = new ODEDynamics();
@ -208,9 +226,7 @@ namespace OpenSim.Region.Physics.OdePlugin
// m_tensor = parent_scene.bodyMotorJointMaxforceTensor;
body_autodisable_frames = parent_scene.bodyFramesAutoDisable;
prim_geom = IntPtr.Zero;
prev_geom = IntPtr.Zero;
if (!pos.IsFinite())
{
@ -233,20 +249,21 @@ namespace OpenSim.Region.Physics.OdePlugin
_orientation = rotation;
m_taintrot = _orientation;
_mesh = mesh;
_pbs = pbs;
_parent_scene = parent_scene;
m_targetSpace = (IntPtr)0;
if (pos.Z < 0)
m_isphysical = false;
{
IsPhysical = false;
}
else
{
m_isphysical = pisPhysical;
IsPhysical = pisPhysical;
// If we're physical, we need to be in the master space for now.
// linksets *should* be in a space together.. but are not currently
if (m_isphysical)
if (IsPhysical)
m_targetSpace = _parent_scene.space;
}
@ -289,7 +306,7 @@ namespace OpenSim.Region.Physics.OdePlugin
// through it while it's selected
m_collisionscore = 0;
if ((m_isphysical && !_zeroFlag) || !value)
if ((IsPhysical && !_zeroFlag) || !value)
{
m_taintselected = value;
_parent_scene.AddPhysicsActorTaint(this);
@ -305,15 +322,21 @@ namespace OpenSim.Region.Physics.OdePlugin
}
}
/// <summary>
/// Set a new geometry for this prim.
/// </summary>
/// <param name="geom"></param>
public void SetGeom(IntPtr geom)
{
prev_geom = prim_geom;
prim_geom = geom;
//Console.WriteLine("SetGeom to " + prim_geom + " for " + Name);
if (prim_geom != IntPtr.Zero)
{
d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories);
d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags);
_parent_scene.geom_name_map[prim_geom] = Name;
_parent_scene.actor_name_map[prim_geom] = this;
}
if (childPrim)
@ -332,7 +355,7 @@ namespace OpenSim.Region.Physics.OdePlugin
{
if (!childPrim)
{
if (m_isphysical && Body != IntPtr.Zero)
if (IsPhysical && Body != IntPtr.Zero)
{
d.BodyEnable(Body);
if (m_vehicle.Type != Vehicle.TYPE_NONE)
@ -347,12 +370,15 @@ namespace OpenSim.Region.Physics.OdePlugin
{
m_disabled = true;
if (m_isphysical && Body != IntPtr.Zero)
if (IsPhysical && Body != IntPtr.Zero)
{
d.BodyDisable(Body);
}
}
/// <summary>
/// Make a prim subject to physics.
/// </summary>
public void enableBody()
{
// Don't enable this body if we're a child prim
@ -728,6 +754,9 @@ namespace OpenSim.Region.Physics.OdePlugin
}
}
/// <summary>
/// Stop a prim from being subject to physics.
/// </summary>
public void disableBody()
{
//this kills the body so things like 'mesh' can re-create it.
@ -778,6 +807,7 @@ namespace OpenSim.Region.Physics.OdePlugin
Body = IntPtr.Zero;
}
}
m_disabled = true;
m_collisionscore = 0;
}
@ -886,7 +916,7 @@ Console.WriteLine("ZProcessTaints for " + Name);
}
}
if (m_taintPhysics != m_isphysical && !(m_taintparent != _parent))
if (m_taintPhysics != IsPhysical && !(m_taintparent != _parent))
changePhysicsStatus(timestep);
if (!_size.ApproxEquals(m_taintsize, 0f))
@ -968,7 +998,7 @@ Console.WriteLine("ZProcessTaints for " + Name);
OdePrim obj = (OdePrim)m_taintparent;
//obj.disableBody();
//Console.WriteLine("changelink calls ParentPrim");
obj.ParentPrim(this);
obj.AddChildPrim(this);
/*
if (obj.Body != (IntPtr)0 && Body != (IntPtr)0 && obj.Body != Body)
@ -1005,14 +1035,16 @@ Console.WriteLine("ZProcessTaints for " + Name);
}
_parent = m_taintparent;
m_taintPhysics = m_isphysical;
m_taintPhysics = IsPhysical;
}
// I'm the parent
// prim is the child
public void ParentPrim(OdePrim prim)
/// <summary>
/// Add a child prim to this parent prim.
/// </summary>
/// <param name="prim">Child prim</param>
public void AddChildPrim(OdePrim prim)
{
//Console.WriteLine("ParentPrim " + Name);
//Console.WriteLine("AddChildPrim " + Name);
if (this.m_localID != prim.m_localID)
{
if (Body == IntPtr.Zero)
@ -1035,7 +1067,6 @@ Console.WriteLine("ZProcessTaints for " + Name);
d.MassSetZero(out m2);
d.MassSetBoxTotal(out m2, prim.CalculateMass(), prm._size.X, prm._size.Y, prm._size.Z);
d.Quaternion quat = new d.Quaternion();
quat.W = prm._orientation.W;
quat.X = prm._orientation.X;
@ -1105,6 +1136,7 @@ Console.WriteLine("ZProcessTaints for " + Name);
prm.Body = Body;
_parent_scene.addActivePrim(prm);
}
m_collisionCategories |= CollisionCategories.Body;
m_collisionFlags |= (CollisionCategories.Land | CollisionCategories.Wind);
@ -1113,7 +1145,6 @@ Console.WriteLine("ZProcessTaints for " + Name);
//Console.WriteLine(" Post GeomSetCategoryBits 2");
d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags);
d.Quaternion quat2 = new d.Quaternion();
quat2.W = _orientation.W;
quat2.X = _orientation.X;
@ -1135,7 +1166,6 @@ Console.WriteLine("ZProcessTaints for " + Name);
d.BodySetAutoDisableFlag(Body, true);
d.BodySetAutoDisableSteps(Body, body_autodisable_frames);
m_interpenetrationcount = 0;
m_collisionscore = 0;
m_disabled = false;
@ -1146,7 +1176,9 @@ Console.WriteLine("ZProcessTaints for " + Name);
createAMotor(m_angularlock);
}
d.BodySetPosition(Body, Position.X, Position.Y, Position.Z);
if (m_vehicle.Type != Vehicle.TYPE_NONE) m_vehicle.Enable(Body, _parent_scene);
if (m_vehicle.Type != Vehicle.TYPE_NONE)
m_vehicle.Enable(Body, _parent_scene);
_parent_scene.addActivePrim(this);
}
}
@ -1156,7 +1188,7 @@ Console.WriteLine("ZProcessTaints for " + Name);
private void ChildSetGeom(OdePrim odePrim)
{
//if (m_isphysical && Body != IntPtr.Zero)
//if (IsPhysical && Body != IntPtr.Zero)
lock (childrenPrim)
{
foreach (OdePrim prm in childrenPrim)
@ -1172,7 +1204,6 @@ Console.WriteLine("ZProcessTaints for " + Name);
}
disableBody();
if (Body != IntPtr.Zero)
{
_parent_scene.remActivePrim(this);
@ -1183,10 +1214,9 @@ Console.WriteLine("ZProcessTaints for " + Name);
foreach (OdePrim prm in childrenPrim)
{
//Console.WriteLine("ChildSetGeom calls ParentPrim");
ParentPrim(prm);
AddChildPrim(prm);
}
}
}
private void ChildDelink(OdePrim odePrim)
@ -1223,7 +1253,7 @@ Console.WriteLine("ZProcessTaints for " + Name);
foreach (OdePrim prm in childrenPrim)
{
//Console.WriteLine("ChildDelink calls ParentPrim");
ParentPrim(prm);
AddChildPrim(prm);
}
}
}
@ -1257,7 +1287,7 @@ Console.WriteLine("ZProcessTaints for " + Name);
// first 50 again. then the last 50 are disabled. then the first 50, which were just woken
// up, start simulating again, which in turn wakes up the last 50.
if (m_isphysical)
if (IsPhysical)
{
disableBodySoft();
}
@ -1268,7 +1298,7 @@ Console.WriteLine("ZProcessTaints for " + Name);
d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags);
}
if (m_isphysical)
if (IsPhysical)
{
disableBodySoft();
}
@ -1277,7 +1307,7 @@ Console.WriteLine("ZProcessTaints for " + Name);
{
m_collisionCategories = CollisionCategories.Geom;
if (m_isphysical)
if (IsPhysical)
m_collisionCategories |= CollisionCategories.Body;
m_collisionFlags = m_default_collisionFlags;
@ -1292,7 +1322,8 @@ Console.WriteLine("ZProcessTaints for " + Name);
d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories);
d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags);
}
if (m_isphysical)
if (IsPhysical)
{
if (Body != IntPtr.Zero)
{
@ -1311,7 +1342,7 @@ Console.WriteLine("ZProcessTaints for " + Name);
{
m_taintposition = _position;
m_taintrot = _orientation;
m_taintPhysics = m_isphysical;
m_taintPhysics = IsPhysical;
m_taintselected = m_isSelected;
m_taintsize = _size;
m_taintshape = false;
@ -1320,14 +1351,19 @@ Console.WriteLine("ZProcessTaints for " + Name);
m_taintVelocity = Vector3.Zero;
}
public void CreateGeom(IntPtr m_targetSpace, IMesh _mesh)
/// <summary>
/// Create a geometry for the given mesh in the given target space.
/// </summary>
/// <param name="m_targetSpace"></param>
/// <param name="mesh">If null, then a mesh is used that is based on the profile shape data.</param>
public void CreateGeom(IntPtr m_targetSpace, IMesh mesh)
{
#if SPAM
Console.WriteLine("CreateGeom:");
#endif
if (_mesh != null)
if (mesh != null)
{
setMesh(_parent_scene, _mesh);
setMesh(_parent_scene, mesh);
}
else
{
@ -1400,6 +1436,39 @@ Console.WriteLine("CreateGeom:");
}
}
/// <summary>
/// Remove the existing geom from this prim.
/// </summary>
/// <param name="m_targetSpace"></param>
/// <param name="mesh">If null, then a mesh is used that is based on the profile shape data.</param>
/// <returns>true if the geom was successfully removed, false if it was already gone or the remove failed.</returns>
public bool RemoveGeom()
{
if (prim_geom != IntPtr.Zero)
{
try
{
_parent_scene.geom_name_map.Remove(prim_geom);
_parent_scene.actor_name_map.Remove(prim_geom);
d.GeomDestroy(prim_geom);
prim_geom = IntPtr.Zero;
}
catch (System.AccessViolationException)
{
prim_geom = IntPtr.Zero;
m_log.ErrorFormat("[PHYSICS]: PrimGeom dead for {0}", Name);
return false;
}
return true;
}
else
{
return false;
}
}
public void changeadd(float timestep)
{
int[] iprimspaceArrItem = _parent_scene.calculateSpaceArrayItemFromPos(_position);
@ -1410,15 +1479,14 @@ Console.WriteLine("CreateGeom:");
m_targetSpace = targetspace;
if (_mesh == null)
IMesh mesh = null;
if (_parent_scene.needsMeshing(_pbs))
{
if (_parent_scene.needsMeshing(_pbs))
{
// Don't need to re-enable body.. it's done in SetMesh
_mesh = _parent_scene.mesher.CreateMesh(Name, _pbs, _size, _parent_scene.meshSculptLOD, IsPhysical);
// createmesh returns null when it's a shape that isn't a cube.
// m_log.Debug(m_localID);
}
// Don't need to re-enable body.. it's done in SetMesh
mesh = _parent_scene.mesher.CreateMesh(Name, _pbs, _size, _parent_scene.meshSculptLOD, IsPhysical);
// createmesh returns null when it's a shape that isn't a cube.
// m_log.Debug(m_localID);
}
lock (_parent_scene.OdeLock)
@ -1426,7 +1494,7 @@ Console.WriteLine("CreateGeom:");
#if SPAM
Console.WriteLine("changeadd 1");
#endif
CreateGeom(m_targetSpace, _mesh);
CreateGeom(m_targetSpace, mesh);
if (prim_geom != IntPtr.Zero)
{
@ -1439,15 +1507,12 @@ Console.WriteLine("changeadd 1");
d.GeomSetQuaternion(prim_geom, ref myrot);
}
if (m_isphysical && Body == IntPtr.Zero)
if (IsPhysical && Body == IntPtr.Zero)
{
enableBody();
}
}
_parent_scene.geom_name_map[prim_geom] = this.Name;
_parent_scene.actor_name_map[prim_geom] = (PhysicsActor)this;
changeSelectedStatus(timestep);
m_taintadd = false;
@ -1455,9 +1520,8 @@ Console.WriteLine("changeadd 1");
public void changemove(float timestep)
{
if (m_isphysical)
if (IsPhysical)
{
if (!m_disabled && !m_taintremove && !childPrim)
{
if (Body == IntPtr.Zero)
@ -1789,7 +1853,7 @@ Console.WriteLine(" JointCreateFixed");
{
// KF: If this is a root prim do BodySet
d.BodySetQuaternion(Body, ref myrot);
if (m_isphysical)
if (IsPhysical)
{
if (!m_angularlock.ApproxEquals(Vector3.One, 0f))
createAMotor(m_angularlock);
@ -1826,7 +1890,7 @@ Console.WriteLine(" JointCreateFixed");
public void changePhysicsStatus(float timestep)
{
if (m_isphysical == true)
if (IsPhysical)
{
if (Body == IntPtr.Zero)
{
@ -1846,25 +1910,12 @@ Console.WriteLine(" JointCreateFixed");
{
if (_pbs.SculptEntry && _parent_scene.meshSculptedPrim)
{
RemoveGeom();
if (prim_geom != IntPtr.Zero)
{
try
{
d.GeomDestroy(prim_geom);
prim_geom = IntPtr.Zero;
_mesh = null;
}
catch (System.AccessViolationException)
{
prim_geom = IntPtr.Zero;
m_log.ErrorFormat("[PHYSICS]: PrimGeom dead for {0}", Name);
}
}
//Console.WriteLine("changePhysicsStatus for " + Name);
changeadd(2f);
}
if (childPrim)
{
if (_parent != null)
@ -1883,7 +1934,7 @@ Console.WriteLine(" JointCreateFixed");
changeSelectedStatus(timestep);
resetCollisionAccounting();
m_taintPhysics = m_isphysical;
m_taintPhysics = IsPhysical;
}
public void changesize(float timestamp)
@ -1892,18 +1943,10 @@ Console.WriteLine(" JointCreateFixed");
m_log.DebugFormat("[ODE PRIM]: Called changesize");
#endif
string oldname = _parent_scene.geom_name_map[prim_geom];
if (_size.X <= 0) _size.X = 0.01f;
if (_size.Y <= 0) _size.Y = 0.01f;
if (_size.Z <= 0) _size.Z = 0.01f;
// Cleanup of old prim geometry
if (_mesh != null)
{
// TODO: Cleanup meshing here
}
//kill body to rebuild
if (IsPhysical && Body != IntPtr.Zero)
{
@ -1927,10 +1970,12 @@ Console.WriteLine(" JointCreateFixed");
d.SpaceRemove(m_targetSpace, prim_geom);
}
d.GeomDestroy(prim_geom);
prim_geom = IntPtr.Zero;
RemoveGeom();
// we don't need to do space calculation because the client sends a position update also.
IMesh mesh = null;
// Construction of new prim
if (_parent_scene.needsMeshing(_pbs))
{
@ -1940,27 +1985,11 @@ Console.WriteLine(" JointCreateFixed");
meshlod = _parent_scene.MeshSculptphysicalLOD;
// Don't need to re-enable body.. it's done in SetMesh
IMesh mesh = null;
if (_parent_scene.needsMeshing(_pbs))
mesh = _parent_scene.mesher.CreateMesh(oldname, _pbs, _size, meshlod, IsPhysical);
#if SPAM
Console.WriteLine("changesize 1");
#endif
CreateGeom(m_targetSpace, mesh);
}
else
{
_mesh = null;
#if SPAM
Console.WriteLine("changesize 2");
#endif
CreateGeom(m_targetSpace, _mesh);
mesh = _parent_scene.mesher.CreateMesh(Name, _pbs, _size, meshlod, IsPhysical);
}
CreateGeom(m_targetSpace, mesh);
d.GeomSetPosition(prim_geom, _position.X, _position.Y, _position.Z);
d.Quaternion myrot = new d.Quaternion();
myrot.X = _orientation.X;
@ -1978,8 +2007,6 @@ Console.WriteLine("changesize 2");
d.BodyEnable(Body);
}
_parent_scene.geom_name_map[prim_geom] = oldname;
changeSelectedStatus(timestamp);
if (childPrim)
{
@ -2013,8 +2040,6 @@ Console.WriteLine("changesize 2");
public void changeshape(float timestamp)
{
string oldname = _parent_scene.geom_name_map[prim_geom];
// Cleanup of old prim geometry and Bodies
if (IsPhysical && Body != IntPtr.Zero)
{
@ -2031,23 +2056,17 @@ Console.WriteLine("changesize 2");
disableBody();
}
}
try
{
d.GeomDestroy(prim_geom);
}
catch (System.AccessViolationException)
{
prim_geom = IntPtr.Zero;
m_log.ErrorFormat("[PHYSICS]: PrimGeom dead for {0}", Name);
}
prim_geom = IntPtr.Zero;
RemoveGeom();
// we don't need to do space calculation because the client sends a position update also.
if (_size.X <= 0) _size.X = 0.01f;
if (_size.Y <= 0) _size.Y = 0.01f;
if (_size.Z <= 0) _size.Z = 0.01f;
// Construction of new prim
IMesh mesh = null;
if (_parent_scene.needsMeshing(_pbs))
{
// Don't need to re-enable body.. it's done in CreateMesh
@ -2057,22 +2076,10 @@ Console.WriteLine("changesize 2");
meshlod = _parent_scene.MeshSculptphysicalLOD;
// createmesh returns null when it doesn't mesh.
IMesh mesh = _parent_scene.mesher.CreateMesh(oldname, _pbs, _size, meshlod, IsPhysical);
#if SPAM
Console.WriteLine("changeshape needed meshing");
#endif
CreateGeom(m_targetSpace, mesh);
}
else
{
_mesh = null;
#if SPAM
Console.WriteLine("changeshape not need meshing");
#endif
CreateGeom(m_targetSpace, null);
mesh = _parent_scene.mesher.CreateMesh(Name, _pbs, _size, meshlod, IsPhysical);
}
CreateGeom(m_targetSpace, mesh);
d.GeomSetPosition(prim_geom, _position.X, _position.Y, _position.Z);
d.Quaternion myrot = new d.Quaternion();
//myrot.W = _orientation.w;
@ -2093,7 +2100,6 @@ Console.WriteLine("changeshape not need meshing");
d.BodyEnable(Body);
}
}
_parent_scene.geom_name_map[prim_geom] = oldname;
changeSelectedStatus(timestamp);
if (childPrim)
@ -2216,16 +2222,6 @@ Console.WriteLine("changeshape not need meshing");
m_taintVelocity = Vector3.Zero;
}
public override bool IsPhysical
{
get { return m_isphysical; }
set {
m_isphysical = value;
if (!m_isphysical) // Zero the remembered last velocity
m_lastVelocity = Vector3.Zero;
}
}
public void setPrimForRemoval()
{
m_taintremove = true;
@ -2404,7 +2400,7 @@ Console.WriteLine("changeshape not need meshing");
{
get
{
if (!m_isphysical || Body == IntPtr.Zero)
if (!IsPhysical || Body == IntPtr.Zero)
return Vector3.Zero;
return _torque;
@ -2986,12 +2982,12 @@ Console.WriteLine("changeshape not need meshing");
public override void SubscribeEvents(int ms)
{
m_eventsubscription = ms;
_parent_scene.addCollisionEventReporting(this);
_parent_scene.AddCollisionEventReporting(this);
}
public override void UnSubscribeEvents()
{
_parent_scene.remCollisionEventReporting(this);
_parent_scene.RemoveCollisionEventReporting(this);
m_eventsubscription = 0;
}
@ -2999,6 +2995,7 @@ Console.WriteLine("changeshape not need meshing");
{
if (CollisionEventsThisFrame == null)
CollisionEventsThisFrame = new CollisionEventUpdate();
CollisionEventsThisFrame.addCollider(CollidedWith, contact);
}

File diff suppressed because it is too large Load Diff

View File

@ -2110,7 +2110,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
if (module != null)
{
Vector3 pos = new Vector3((float) position.x, (float) position.y, (float) position.z);
module.Autopilot(new UUID(npc.m_string), World, pos);
module.MoveToTarget(new UUID(npc.m_string), World, pos);
}
}

View File

@ -61,7 +61,7 @@ namespace OpenSim.Server.Handlers.Authorization
AuthorizationRequest Authorization = (AuthorizationRequest) xs.Deserialize(request);
string message = String.Empty;
bool authorized = m_AuthorizationService.IsAuthorizedForRegion(Authorization.ID, Authorization.RegionID,out message);
bool authorized = m_AuthorizationService.IsAuthorizedForRegion(Authorization.ID, Authorization.FirstName, Authorization.SurName, Authorization.RegionID, out message);
AuthorizationResponse result = new AuthorizationResponse(authorized, Authorization.ID + " has been authorized");

View File

@ -48,7 +48,8 @@ namespace OpenSim.Services.AuthorizationService
m_log.Info("[AUTHORIZATION CONNECTOR]: Local Authorization service enabled");
}
public bool IsAuthorizedForRegion(string userID, string regionID, out string message)
public bool IsAuthorizedForRegion(
string userID, string firstName, string lastName, string regionID, out string message)
{
message = "Authorized";
return true;

View File

@ -54,7 +54,7 @@ namespace OpenSim.Services.AvatarService
public AvatarAppearance GetAppearance(UUID principalID)
{
AvatarData avatar = GetAvatar(principalID);
return avatar.ToAvatarAppearance(principalID);
return avatar.ToAvatarAppearance();
}
public bool SetAppearance(UUID principalID, AvatarAppearance appearance)
@ -109,7 +109,33 @@ namespace OpenSim.Services.AvatarService
foreach (KeyValuePair<string,string> kvp in avatar.Data)
{
av.Data["Name"] = kvp.Key;
av.Data["Value"] = kvp.Value;
// justincc 20110730. Yes, this is a hack to get around the fact that a bug in OpenSim is causing
// various simulators on osgrid to inject bad values. Since these simulators might be around for a
// long time, we are going to manually police the value.
//
// It should be possible to remove this in half a year if we don't want to police values server side.
if (kvp.Key == "AvatarHeight")
{
float height;
if (!float.TryParse(kvp.Value, out height) || height < 0 || height > 10)
{
string rawHeight = kvp.Value.Replace(",", ".");
if (!float.TryParse(rawHeight, out height) || height < 0 || height > 10)
height = 1.771488f;
m_log.DebugFormat(
"[AVATAR SERVICE]: Rectifying height of avatar {0} from {1} to {2}",
principalID, kvp.Value, height);
}
av.Data["Value"] = height.ToString();
}
else
{
av.Data["Value"] = kvp.Value;
}
if (!m_Database.Store(av))
{

View File

@ -89,7 +89,7 @@ namespace OpenSim.Services.Connectors
public AvatarAppearance GetAppearance(UUID userID)
{
AvatarData avatar = GetAvatar(userID);
return avatar.ToAvatarAppearance(userID);
return avatar.ToAvatarAppearance();
}
public bool SetAppearance(UUID userID, AvatarAppearance appearance)

View File

@ -213,7 +213,7 @@ namespace OpenSim.Services.Connectors.SimianGrid
wearables[11] = new AvatarWearable(map["UnderpantsItem"].AsUUID(), map["UnderpantsAsset"].AsUUID());
wearables[12] = new AvatarWearable(map["SkirtItem"].AsUUID(), map["SkirtAsset"].AsUUID());
AvatarAppearance appearance = new AvatarAppearance(userID);
AvatarAppearance appearance = new AvatarAppearance();
appearance.Wearables = wearables;
appearance.AvatarHeight = (float)map["Height"].AsReal();
@ -257,7 +257,7 @@ namespace OpenSim.Services.Connectors.SimianGrid
if (avatar.AvatarType == 1) // LLAvatar
{
AvatarAppearance appearance = avatar.ToAvatarAppearance(userID);
AvatarAppearance appearance = avatar.ToAvatarAppearance();
OSDMap map = new OSDMap();

View File

@ -320,18 +320,25 @@ namespace OpenSim.Services.GridService
return null;
}
public GridRegion GetRegionByName(UUID scopeID, string regionName)
public GridRegion GetRegionByName(UUID scopeID, string name)
{
List<RegionData> rdatas = m_Database.Get(regionName + "%", scopeID);
List<RegionData> rdatas = m_Database.Get(name, scopeID);
if ((rdatas != null) && (rdatas.Count > 0))
return RegionData2RegionInfo(rdatas[0]); // get the first
if (m_AllowHypergridMapSearch)
{
GridRegion r = GetHypergridRegionByName(scopeID, name);
if (r != null)
return r;
}
return null;
}
public List<GridRegion> GetRegionsByName(UUID scopeID, string name, int maxNumber)
{
m_log.DebugFormat("[GRID SERVICE]: GetRegionsByName {0}", name);
// m_log.DebugFormat("[GRID SERVICE]: GetRegionsByName {0}", name);
List<RegionData> rdatas = m_Database.Get(name + "%", scopeID);
@ -340,7 +347,7 @@ namespace OpenSim.Services.GridService
if (rdatas != null)
{
m_log.DebugFormat("[GRID SERVICE]: Found {0} regions", rdatas.Count);
// m_log.DebugFormat("[GRID SERVICE]: Found {0} regions", rdatas.Count);
foreach (RegionData rdata in rdatas)
{
if (count++ < maxNumber)
@ -348,9 +355,9 @@ namespace OpenSim.Services.GridService
}
}
if (m_AllowHypergridMapSearch && (rdatas == null || (rdatas != null && rdatas.Count == 0)) && name.Contains("."))
if (m_AllowHypergridMapSearch && (rdatas == null || (rdatas != null && rdatas.Count == 0)))
{
GridRegion r = m_HypergridLinker.LinkRegion(scopeID, name);
GridRegion r = GetHypergridRegionByName(scopeID, name);
if (r != null)
rinfos.Add(r);
}
@ -358,6 +365,20 @@ namespace OpenSim.Services.GridService
return rinfos;
}
/// <summary>
/// Get a hypergrid region.
/// </summary>
/// <param name="scopeID"></param>
/// <param name="name"></param>
/// <returns>null if no hypergrid region could be found.</returns>
protected GridRegion GetHypergridRegionByName(UUID scopeID, string name)
{
if (name.Contains("."))
return m_HypergridLinker.LinkRegion(scopeID, name);
else
return null;
}
public List<GridRegion> GetRegionRange(UUID scopeID, int xmin, int xmax, int ymin, int ymax)
{
int xminSnap = (int)(xmin / Constants.RegionSize) * (int)Constants.RegionSize;

View File

@ -34,14 +34,21 @@ namespace OpenSim.Services.Interfaces
public interface IAuthorizationService
{
//////////////////////////////////////////////////////
// Authorized
//
// This method returns a simple true false indicating
// whether or not a user has access to the region
//
bool IsAuthorizedForRegion(string userID, string regionID, out string message);
/// <summary>
/// Check whether the user should be given access to the region.
/// </summary>
/// <remarks>
/// We also supply user first name and last name for situations where the user does not have an account
/// on the region (e.g. they're a visitor via Hypergrid).
/// </remarks>
/// <param name="userID"></param>
/// <param name="firstName">/param>
/// <param name="lastName"></param>
/// <param name="regionID"></param>
/// <param name="message"></param>
/// <returns></returns>
bool IsAuthorizedForRegion(
string userID, string firstName, string lastName, string regionID, out string message);
}
public class AuthorizationRequest
@ -63,7 +70,8 @@ namespace OpenSim.Services.Interfaces
m_regionID = RegionID;
}
public AuthorizationRequest(string ID,string FirstName, string SurName, string Email, string RegionName, string RegionID)
public AuthorizationRequest(
string ID, string FirstName, string SurName, string Email, string RegionName, string RegionID)
{
m_userID = ID;
m_firstname = FirstName;
@ -108,9 +116,6 @@ namespace OpenSim.Services.Interfaces
get { return m_regionID; }
set { m_regionID = value; }
}
}
public class AuthorizationResponse
@ -126,7 +131,6 @@ namespace OpenSim.Services.Interfaces
{
m_isAuthorized = isAuthorized;
m_message = message;
}
public bool IsAuthorized

View File

@ -180,9 +180,9 @@ namespace OpenSim.Services.Interfaces
}
}
public AvatarAppearance ToAvatarAppearance(UUID owner)
public AvatarAppearance ToAvatarAppearance()
{
AvatarAppearance appearance = new AvatarAppearance(owner);
AvatarAppearance appearance = new AvatarAppearance();
if (Data.Count == 0)
return appearance;

View File

@ -71,6 +71,12 @@ namespace OpenSim.Services.Interfaces
/// <returns></returns>
GridRegion GetRegionByPosition(UUID scopeID, int x, int y);
/// <summary>
/// Get information about a region which exactly matches the name given.
/// </summary>
/// <param name="scopeID"></param>
/// <param name="regionName"></param>
/// <returns>Returns the region information if the name matched. Null otherwise.</returns>
GridRegion GetRegionByName(UUID scopeID, string regionName);
/// <summary>

View File

@ -193,10 +193,11 @@ namespace OpenSim.Services.InventoryService
item.Description = config.GetString("description", item.Name);
item.InvType = config.GetInt("inventoryType", 0);
item.AssetType = config.GetInt("assetType", item.InvType);
item.CurrentPermissions = (uint)config.GetLong("currentPermissions", 0x7FFFFFFF);
item.NextPermissions = (uint)config.GetLong("nextPermissions", 0x7FFFFFFF);
item.EveryOnePermissions = (uint)config.GetLong("everyonePermissions", 0x7FFFFFFF);
item.BasePermissions = (uint)config.GetLong("basePermissions", 0x7FFFFFFF);
item.CurrentPermissions = (uint)config.GetLong("currentPermissions", (uint)PermissionMask.All);
item.NextPermissions = (uint)config.GetLong("nextPermissions", (uint)PermissionMask.All);
item.EveryOnePermissions
= (uint)config.GetLong("everyonePermissions", (uint)PermissionMask.All - (uint)PermissionMask.Modify);
item.BasePermissions = (uint)config.GetLong("basePermissions", (uint)PermissionMask.All);
item.Flags = (uint)config.GetInt("flags", 0);
if (libraryFolders.ContainsKey(item.Folder))

View File

@ -785,7 +785,7 @@ namespace OpenSim.Services.LLLoginService
if (avatar != null)
aCircuit.Appearance = new AvatarAppearance(avatar);
else
aCircuit.Appearance = new AvatarAppearance(account.PrincipalID);
aCircuit.Appearance = new AvatarAppearance();
//aCircuit.BaseFolder = irrelevant
aCircuit.CapsPath = CapsUtil.GetRandomCapsObjectPath();

View File

@ -42,7 +42,7 @@ namespace OpenSim.Tests.Common
/// <returns></returns>
public static AssetBase CreateAsset()
{
return CreateAsset(UUID.Random(), AssetType.Notecard, "hello", UUID.Random());
return CreateAsset(UUID.Random());
}
/// <summary>
@ -50,9 +50,9 @@ namespace OpenSim.Tests.Common
/// </summary>
/// <param name="creatorId">/param>
/// <returns></returns>
public static AssetBase CreateAsset(UUID creatorId)
public static AssetBase CreateAsset(UUID id)
{
return CreateAsset(UUID.Random(), AssetType.Notecard, "hello", creatorId);
return CreateAsset(id, AssetType.Notecard, "hello", UUID.Random());
}
/// <summary>

View File

@ -234,7 +234,7 @@ namespace OpenSim.Tests.Common.Mock
public event ScriptReset OnScriptReset;
public event GetScriptRunning OnGetScriptRunning;
public event SetScriptRunning OnSetScriptRunning;
public event UpdateVector OnAutoPilotGo;
public event Action<Vector3> OnAutoPilotGo;
public event TerrainUnacked OnUnackedTerrain;
@ -1214,7 +1214,7 @@ namespace OpenSim.Tests.Common.Mock
{
}
public void SendTextBoxRequest(string message, int chatChannel, string objectname, string ownerFirstName, string ownerLastName, UUID objectId)
public void SendTextBoxRequest(string message, int chatChannel, string objectname, UUID ownerID, string ownerFirstName, string ownerLastName, UUID objectId)
{
}

View File

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
</configSections>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="nunit.framework" publicKeyToken="96d09a1eb7f44a77" culture="Neutral" />
<bindingRedirect oldVersion="2.0.6.0" newVersion="2.4.6.0" />
<bindingRedirect oldVersion="2.1.4.0" newVersion="2.4.6.0" />
<bindingRedirect oldVersion="2.2.8.0" newVersion="2.4.6.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
<log4net>
<!-- A1 is set to be a ConsoleAppender -->
<appender name="A1" type="log4net.Appender.ConsoleAppender">
<!-- A1 uses PatternLayout -->
<layout type="log4net.Layout.PatternLayout">
<!-- Print the date in ISO 8601 format -->
<conversionPattern value="%date [%thread] %-5level %logger %ndc - %message%newline" />
</layout>
</appender>
<!-- Set root logger level to DEBUG and its only appender to A1 -->
<root>
<level value="DEBUG" />
<appender-ref ref="A1" />
</root>
</log4net>
</configuration>

View File

@ -39,6 +39,9 @@
;# {save_crashes} {} {Save crashes to disk?} {true false} false
;; Set this to true if you want to log crashes to disk
;; this can be useful when submitting bug reports.
;; However, this will only log crashes within OpenSimulator that cause the entire program to exit
;; It will not log crashes caused by virtual machine failures, which includes mono and ODE failures.
;; You will need to capture these native stack traces by recording the session log itself.
; save_crashes = false
;# {crash_dir} {save_crashes:true} {Directory to save crashes to?} {} crashes
@ -80,9 +83,11 @@
;; This can be overriden in the region config file.
; ClampPrimSize = false
;# {AllowScriptCrossing} {} {Allow scripts to cross into this region} {true false} false
;; Allow scripts to keep running when they cross region boundaries, rather than being restarted. Script code is recompiled on the destination region and the state reloaded.
; AllowScriptCrossing = false
;# {AllowScriptCrossing} {} {Allow scripts to cross into this region} {true false} true
;; Allow scripts to keep running when they cross region boundaries, rather than being restarted. State is reloaded on the destination region.
;; This only applies when crossing to a region running in a different simulator.
;; For crossings where the regions are on the same simulator the script is always kept running.
; AllowScriptCrossing = true
;# {TrustBinaries} {AllowScriptCrossing:true} {Accept compiled binary script code? (DANGEROUS!)} {true false} false
;; Allow compiled script binary code to cross region boundaries.
@ -711,6 +716,11 @@
; Enabled = true;
[NPC]
;# {Enabled} {} {Enable Non Player Character (NPC) facilities} {true false} false
; Enabled = false
[PrimLimitsModule]
;# {EnforcePrimLimits} {} {Enforce parcel prim limits} {true false} false
;; Enable parcel prim limits. Off by default to emulate pre-existing behavior.

View File

@ -5,6 +5,9 @@
[Startup]
; Set this to true if you want to log crashes to disk
; this can be useful when submitting bug reports.
; However, this will only log crashes within OpenSimulator that cause the entire program to exit
; It will not log crashes caused by virtual machine failures, which includes mono and ODE failures.
; You will need to capture these native stack traces by recording the session log itself.
save_crashes = false
; Directory to save crashes to if above is enabled
@ -77,8 +80,10 @@
; This can be overriden in the region config file.
ClampPrimSize = false
; Allow scripts to keep running when they cross region boundaries, rather than being restarted. Script code is recompiled on the destination region and the state reloaded.
AllowScriptCrossing = false
; Allow scripts to keep running when they cross region boundaries, rather than being restarted. State is reloaded on the destination region.
; This only applies when crossing to a region running in a different simulator.
; For crossings where the regions are on the same simulator the script is always kept running.
AllowScriptCrossing = true
; Allow compiled script binary code to cross region boundaries.
; If you set this to "true", any region that can teleport to you can
@ -170,8 +175,8 @@
; If set to false, then, in theory, the server never carries out permission checks (allowing anybody to copy
; any item, etc. This may not yet be implemented uniformally.
; If set to true, then all permissions checks are carried out
; Default is false
serverside_object_permissions = false
; Default is true
serverside_object_permissions = true
allow_grid_gods = false
@ -1403,6 +1408,10 @@
; Enable media on a prim facilities
Enabled = true;
[NPC]
;; Enable Non Player Character (NPC) facilities
Enabled = false
;;
;; If you are using a simian grid frontend you can enable
;; this module to upload tile images for the mapping fn

View File

@ -108,8 +108,6 @@
<Key Name="inventoryType" Value="19" />
</Section>
<!--
<Section Name="Example Library Item">
<Key Name="inventoryID" Value="30000000-0000-2222-4444-000000000001" />
@ -119,10 +117,6 @@
<Key Name="name" Value="Example Library Item" />
<Key Name="assetType" Value="7" />
<Key Name="inventoryType" Value="7" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
-->

View File

@ -9,10 +9,6 @@
<Key Name="name" Value="Example Library Item" />
<Key Name="assetType" Value="7" />
<Key Name="inventoryType" Value="7" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
-->
<!--
@ -24,10 +20,6 @@
<Key Name="name" Value="Hair" />
<Key Name="assetType" Value="13" />
<Key Name="inventoryType" Value="18" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
<Section Name="Skin">
@ -38,10 +30,6 @@
<Key Name="name" Value="Skin" />
<Key Name="assetType" Value="13" />
<Key Name="inventoryType" Value="18" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
-->
<!--
@ -53,10 +41,6 @@
<Key Name="name" Value="Jim Skin" />
<Key Name="assetType" Value="13" />
<Key Name="inventoryType" Value="13" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
<Section Name="Little Goblin Skin">
@ -67,10 +51,6 @@
<Key Name="name" Value="Little Goblin Skin" />
<Key Name="assetType" Value="13" />
<Key Name="inventoryType" Value="13" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
-->
<!--
@ -82,10 +62,6 @@
<Key Name="name" Value="Shape" />
<Key Name="assetType" Value="13" />
<Key Name="inventoryType" Value="18" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
-->
<!--
@ -97,10 +73,6 @@
<Key Name="name" Value="Jim Shape" />
<Key Name="assetType" Value="13" />
<Key Name="inventoryType" Value="13" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
<Section Name="Little Goblin Shape">
@ -111,10 +83,7 @@
<Key Name="name" Value="Little Goblin Shape" />
<Key Name="assetType" Value="13" />
<Key Name="inventoryType" Value="13" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
-->
</Nini>

View File

@ -9,10 +9,6 @@
<Key Name="name" Value="Example Library Item" />
<Key Name="assetType" Value="7" />
<Key Name="inventoryType" Value="7" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
-->
<!--
@ -24,11 +20,8 @@
<Key Name="name" Value="Shirt" />
<Key Name="assetType" Value="5" />
<Key Name="inventoryType" Value="18" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
<Section Name="Pants">
<Key Name="inventoryID" Value="d5e46211-b9d1-11dc-95ff-0800200c9a66" />
<Key Name="assetID" Value="00000000-38f9-1111-024e-222222111120" />
@ -37,10 +30,7 @@
<Key Name="name" Value="Pants" />
<Key Name="assetType" Value="5" />
<Key Name="inventoryType" Value="18" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
-->
</Nini>

View File

@ -7,11 +7,8 @@
<Key Name="name" Value="can we move along?" />
<Key Name="assetType" Value="21"/>
<Key Name="inventoryType" Value="20"/>
<Key Name="currentPermissions" Value="2147483647"/>
<Key Name="nextPermissions" Value="2147483647"/>
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647"/>
</Section>
<Section Name="me!">
<Key Name="inventoryID" Value="4c141851-1bef-4c00-9058-8c4d97ab48fe"/>
<Key Name="assetID" Value="652475bc-ffb7-4a18-b6bb-7731ddeb6a51"/>
@ -20,11 +17,8 @@
<Key Name="name" Value="me!" />
<Key Name="assetType" Value="21"/>
<Key Name="inventoryType" Value="20"/>
<Key Name="currentPermissions" Value="2147483647"/>
<Key Name="nextPermissions" Value="2147483647"/>
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647"/>
</Section>
<Section Name="clap">
<Key Name="inventoryID" Value="a5a30fdb-613f-44fa-8bc2-7806e4da67f6"/>
<Key Name="assetID" Value="712e81fd-a215-498c-ab1a-caf1f5bf950d"/>
@ -33,11 +27,8 @@
<Key Name="name" Value="clap" />
<Key Name="assetType" Value="21"/>
<Key Name="inventoryType" Value="20"/>
<Key Name="currentPermissions" Value="2147483647"/>
<Key Name="nextPermissions" Value="2147483647"/>
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647"/>
</Section>
<Section Name="no">
<Key Name="inventoryID" Value="514b3ca6-1571-4f58-a24e-f58eb5cb8460"/>
<Key Name="assetID" Value="6c123970-0f5a-448e-920a-07bae9aadf4c"/>
@ -46,11 +37,8 @@
<Key Name="name" Value="no" />
<Key Name="assetType" Value="21"/>
<Key Name="inventoryType" Value="20"/>
<Key Name="currentPermissions" Value="2147483647"/>
<Key Name="nextPermissions" Value="2147483647"/>
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647"/>
</Section>
<Section Name="suprised">
<Key Name="inventoryID" Value="120fb1f3-112b-4bc4-a7d3-a784ecc360af"/>
<Key Name="assetID" Value="dbaf104b-cba8-4df7-b5d3-0cb57d0d63b2"/>
@ -59,11 +47,8 @@
<Key Name="name" Value="suprised" />
<Key Name="assetType" Value="21"/>
<Key Name="inventoryType" Value="20"/>
<Key Name="currentPermissions" Value="2147483647"/>
<Key Name="nextPermissions" Value="2147483647"/>
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647"/>
</Section>
<Section Name="dance2">
<Key Name="inventoryID" Value="1ca0e368-5a11-4da1-8503-925a55e7c45f"/>
<Key Name="assetID" Value="3bd1792a-6756-4ee0-a54e-3ae6493c2036"/>
@ -72,11 +57,8 @@
<Key Name="name" Value="dance2" />
<Key Name="assetType" Value="21"/>
<Key Name="inventoryType" Value="20"/>
<Key Name="currentPermissions" Value="2147483647"/>
<Key Name="nextPermissions" Value="2147483647"/>
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647"/>
</Section>
<Section Name="definitely YES">
<Key Name="inventoryID" Value="022fa770-abb1-4266-963a-4ece4747b748"/>
<Key Name="assetID" Value="392c292f-3d27-45ff-9437-c79c06699237"/>
@ -85,11 +67,8 @@
<Key Name="name" Value="definitely YES" />
<Key Name="assetType" Value="21"/>
<Key Name="inventoryType" Value="20"/>
<Key Name="currentPermissions" Value="2147483647"/>
<Key Name="nextPermissions" Value="2147483647"/>
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647"/>
</Section>
<Section Name="Wave">
<Key Name="inventoryID" Value="6406a7c6-a690-44be-a444-ba723e50c17d"/>
<Key Name="assetID" Value="cce0e317-2c49-411e-8716-f9ce3007c715"/>
@ -98,11 +77,8 @@
<Key Name="name" Value="Wave" />
<Key Name="assetType" Value="21"/>
<Key Name="inventoryType" Value="20"/>
<Key Name="currentPermissions" Value="2147483647"/>
<Key Name="nextPermissions" Value="2147483647"/>
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647"/>
</Section>
<Section Name="take it outside">
<Key Name="inventoryID" Value="1488b988-c300-4c2e-b48a-3b8eacb93659"/>
<Key Name="assetID" Value="d082bd28-f655-43b7-a0eb-cb80db03753e"/>
@ -111,11 +87,8 @@
<Key Name="name" Value="take it outside" />
<Key Name="assetType" Value="21"/>
<Key Name="inventoryType" Value="20"/>
<Key Name="currentPermissions" Value="2147483647"/>
<Key Name="nextPermissions" Value="2147483647"/>
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647"/>
</Section>
<Section Name="whoohoo!">
<Key Name="inventoryID" Value="18c1a2fc-17f6-4af4-a519-827b272feaac"/>
<Key Name="assetID" Value="7f7384c0-848c-4bf0-8e83-50879981e1a4"/>
@ -124,11 +97,8 @@
<Key Name="name" Value="whoohoo!" />
<Key Name="assetType" Value="21"/>
<Key Name="inventoryType" Value="20"/>
<Key Name="currentPermissions" Value="2147483647"/>
<Key Name="nextPermissions" Value="2147483647"/>
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647"/>
</Section>
<Section Name="raise hand">
<Key Name="inventoryID" Value="5c0afacd-bbd0-4f66-a516-4ac4e380853c"/>
<Key Name="assetID" Value="2d0819cf-452b-4db8-b7ac-cda443bc89e7"/>
@ -137,11 +107,8 @@
<Key Name="name" Value="raise hand" />
<Key Name="assetType" Value="21"/>
<Key Name="inventoryType" Value="20"/>
<Key Name="currentPermissions" Value="2147483647"/>
<Key Name="nextPermissions" Value="2147483647"/>
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647"/>
</Section>
<Section Name="LOL">
<Key Name="inventoryID" Value="407f6a99-1a12-43c6-bec1-8fad974c8f42"/>
<Key Name="assetID" Value="d545ac78-09cc-4811-8700-8df1a37d7f56"/>
@ -150,11 +117,8 @@
<Key Name="name" Value="LOL" />
<Key Name="assetType" Value="21"/>
<Key Name="inventoryType" Value="20"/>
<Key Name="currentPermissions" Value="2147483647"/>
<Key Name="nextPermissions" Value="2147483647"/>
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647"/>
</Section>
<Section Name="dance1">
<Key Name="inventoryID" Value="59cce8ab-5c0c-49be-aa3b-036f05fbd7f4"/>
<Key Name="assetID" Value="9cc5bb24-bacf-44f9-a1d0-d409e6ccfa6c"/>
@ -163,11 +127,8 @@
<Key Name="name" Value="dance1" />
<Key Name="assetType" Value="21"/>
<Key Name="inventoryType" Value="20"/>
<Key Name="currentPermissions" Value="2147483647"/>
<Key Name="nextPermissions" Value="2147483647"/>
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647"/>
</Section>
<Section Name="wink!">
<Key Name="inventoryID" Value="ba33e8ab-b816-4ead-9302-c8475deb1845"/>
<Key Name="assetID" Value="67d47cd0-9634-4c99-97db-ddce9bda467c"/>
@ -176,11 +137,8 @@
<Key Name="name" Value="wink!" />
<Key Name="assetType" Value="21"/>
<Key Name="inventoryType" Value="20"/>
<Key Name="currentPermissions" Value="2147483647"/>
<Key Name="nextPermissions" Value="2147483647"/>
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647"/>
</Section>
<Section Name="not sure">
<Key Name="inventoryID" Value="02da80eb-cad0-4cd1-9ff7-d3d3dd150fbc"/>
<Key Name="assetID" Value="9bc46cd2-95cb-456d-9070-a4439e42af9e"/>
@ -189,11 +147,8 @@
<Key Name="name" Value="not sure" />
<Key Name="assetType" Value="21"/>
<Key Name="inventoryType" Value="20"/>
<Key Name="currentPermissions" Value="2147483647"/>
<Key Name="nextPermissions" Value="2147483647"/>
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647"/>
</Section>
<Section Name="dance3">
<Key Name="inventoryID" Value="05e53736-dacb-4935-a1e9-d9897b35b962"/>
<Key Name="assetID" Value="fd9ad83a-4921-4b6e-8b8e-558556d9f503"/>
@ -202,9 +157,6 @@
<Key Name="name" Value="dance3" />
<Key Name="assetType" Value="21"/>
<Key Name="inventoryType" Value="20"/>
<Key Name="currentPermissions" Value="2147483647"/>
<Key Name="nextPermissions" Value="2147483647"/>
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647"/>
</Section>
</Nini>

View File

@ -9,10 +9,6 @@
<Key Name="name" Value="Example Library Item" />
<Key Name="assetType" Value="7" />
<Key Name="inventoryType" Value="7" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
-->

View File

@ -9,10 +9,6 @@
<Key Name="name" Value="Example Library Item" />
<Key Name="assetType" Value="7" />
<Key Name="inventoryType" Value="7" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
-->
@ -24,11 +20,8 @@
<Key Name="name" Value="Welcome" />
<Key Name="assetType" Value="7" />
<Key Name="inventoryType" Value="7" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
<Section Name="Example notecard">
<Key Name="inventoryID" Value="a170ffc0-b9c7-11dc-95ff-0800200c9a66" />
<Key Name="assetID" Value="8d1ada50-b9c7-11dc-95ff-0800200c9a66" />
@ -37,9 +30,6 @@
<Key Name="name" Value="Example notecard" />
<Key Name="assetType" Value="7" />
<Key Name="inventoryType" Value="7" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
</Nini>

View File

@ -9,10 +9,6 @@
<Key Name="name" Value="Example Library Item" />
<Key Name="assetType" Value="7" />
<Key Name="inventoryType" Value="7" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
-->

View File

@ -10,10 +10,6 @@
<Key Name="name" Value="Example Library Item" />
<Key Name="assetType" Value="7" />
<Key Name="inventoryType" Value="7" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
-->

View File

@ -9,10 +9,6 @@
<Key Name="name" Value="Example Library Item" />
<Key Name="assetType" Value="7" />
<Key Name="inventoryType" Value="7" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
-->

View File

@ -25,11 +25,8 @@
<Key Name="name" Value="llAbs" />
<Key Name="assetType" Value="10" />
<Key Name="inventoryType" Value="10" />
<Key Name="currentPermissions" Value="257487132" />
<Key Name="nextPermissions" Value="257487132" />
<Key Name="everyonePermissions" Value="257487132" />
<Key Name="basePermissions" Value="257487132" />
</Section>
<Section Name="llAcos">
<Key Name="inventoryID" Value="6519bf38-b19f-11dc-8314-0800200c9a66" />
<Key Name="assetID" Value="6519bf39-b19f-11dc-8314-0800200c9a66" />
@ -38,11 +35,8 @@
<Key Name="name" Value="llAcos" />
<Key Name="assetType" Value="10" />
<Key Name="inventoryType" Value="10" />
<Key Name="currentPermissions" Value="257487132" />
<Key Name="nextPermissions" Value="257487132" />
<Key Name="everyonePermissions" Value="257487132" />
<Key Name="basePermissions" Value="257487132" />
</Section>
<Section Name="llAddToLandBanList">
<Key Name="inventoryID" Value="7ceba3f0-b1a0-11dc-8314-0800200c9a66" />
<Key Name="assetID" Value="7ceba3f1-b1a0-11dc-8314-0800200c9a66" />
@ -51,11 +45,8 @@
<Key Name="name" Value="llAddToLandBanList" />
<Key Name="assetType" Value="10" />
<Key Name="inventoryType" Value="10" />
<Key Name="currentPermissions" Value="257487132" />
<Key Name="nextPermissions" Value="257487132" />
<Key Name="everyonePermissions" Value="257487132" />
<Key Name="basePermissions" Value="257487132" />
</Section>
<Section Name="llAddToLandPassList">
<Key Name="inventoryID" Value="609047e6-b390-11dc-8314-0800200c9a66" />
<Key Name="assetID" Value="609047e7-b390-11dc-8314-0800200c9a66" />
@ -64,11 +55,8 @@
<Key Name="name" Value="llAddToLandPassList" />
<Key Name="assetType" Value="10" />
<Key Name="inventoryType" Value="10" />
<Key Name="currentPermissions" Value="257487132" />
<Key Name="nextPermissions" Value="257487132" />
<Key Name="everyonePermissions" Value="257487132" />
<Key Name="basePermissions" Value="257487132" />
</Section>
<Section Name="llAdjustSoundVolume">
<Key Name="inventoryID" Value="56df4bcc-b393-11dc-8314-0800200c9a66" />
<Key Name="assetID" Value="56df4bcd-b393-11dc-8314-0800200c9a66" />
@ -77,11 +65,8 @@
<Key Name="name" Value="llAdjustSoundVolume" />
<Key Name="assetType" Value="10" />
<Key Name="inventoryType" Value="10" />
<Key Name="currentPermissions" Value="257487132" />
<Key Name="nextPermissions" Value="257487132" />
<Key Name="everyonePermissions" Value="257487132" />
<Key Name="basePermissions" Value="257487132" />
</Section>
<Section Name="llAllowInventoryDrop">
<Key Name="inventoryID" Value="54d6962c-b394-11dc-8314-0800200c9a66" />
<Key Name="assetID" Value="54d6962d-b394-11dc-8314-0800200c9a66" />
@ -90,11 +75,8 @@
<Key Name="name" Value="llAllowInventoryDrop" />
<Key Name="assetType" Value="10" />
<Key Name="inventoryType" Value="10" />
<Key Name="currentPermissions" Value="257487132" />
<Key Name="nextPermissions" Value="257487132" />
<Key Name="everyonePermissions" Value="257487132" />
<Key Name="basePermissions" Value="257487132" />
</Section>
<Section Name="llAngleBetween">
<Key Name="inventoryID" Value="6b341608-b34e-11dc-8314-0800200c9a66" />
<Key Name="assetID" Value="6b341609-b34e-11dc-8314-0800200c9a66" />
@ -103,11 +85,8 @@
<Key Name="name" Value="llAngleBetween" />
<Key Name="assetType" Value="10" />
<Key Name="inventoryType" Value="10" />
<Key Name="currentPermissions" Value="257487132" />
<Key Name="nextPermissions" Value="257487132" />
<Key Name="everyonePermissions" Value="257487132" />
<Key Name="basePermissions" Value="257487132" />
</Section>
<Section Name="llAsin">
<Key Name="inventoryID" Value="7e7422ec-b425-11dc-8314-0800200c9a66" />
<Key Name="assetID" Value="7e7422ed-b425-11dc-8314-0800200c9a66" />
@ -116,11 +95,8 @@
<Key Name="name" Value="llAsin" />
<Key Name="assetType" Value="10" />
<Key Name="inventoryType" Value="10" />
<Key Name="currentPermissions" Value="257487132" />
<Key Name="nextPermissions" Value="257487132" />
<Key Name="everyonePermissions" Value="257487132" />
<Key Name="basePermissions" Value="257487132" />
</Section>
<Section Name="llAtan2">
<Key Name="inventoryID" Value="7e7422ee-b425-11dc-8314-0800200c9a66" />
<Key Name="assetID" Value="7e7422ef-b425-11dc-8314-0800200c9a66" />
@ -129,11 +105,8 @@
<Key Name="name" Value="llAtan2" />
<Key Name="assetType" Value="10" />
<Key Name="inventoryType" Value="10" />
<Key Name="currentPermissions" Value="257487132" />
<Key Name="nextPermissions" Value="257487132" />
<Key Name="everyonePermissions" Value="257487132" />
<Key Name="basePermissions" Value="257487132" />
</Section>
<Section Name="llApplyImpulse">
<Key Name="inventoryID" Value="714ec678-b419-11dc-8314-0800200c9a66" />
<Key Name="assetID" Value="714ec679-b419-11dc-8314-0800200c9a66" />
@ -142,11 +115,8 @@
<Key Name="name" Value="llApplyImpulse" />
<Key Name="assetType" Value="10" />
<Key Name="inventoryType" Value="10" />
<Key Name="currentPermissions" Value="257487132" />
<Key Name="nextPermissions" Value="257487132" />
<Key Name="everyonePermissions" Value="257487132" />
<Key Name="basePermissions" Value="257487132" />
</Section>
<Section Name="llAvatarOnSitTarget">
<Key Name="inventoryID" Value="579fc820-b426-11dc-8314-0800200c9a66" />
<Key Name="assetID" Value="579fc821-b426-11dc-8314-0800200c9a66" />
@ -155,11 +125,8 @@
<Key Name="name" Value="llAvatarOnSitTarget" />
<Key Name="assetType" Value="10" />
<Key Name="inventoryType" Value="10" />
<Key Name="currentPermissions" Value="257487132" />
<Key Name="nextPermissions" Value="257487132" />
<Key Name="everyonePermissions" Value="257487132" />
<Key Name="basePermissions" Value="257487132" />
</Section>
<!-- B == <Key Name="folderID" Value="30000112-000f-0000-0000-000100bba004"/> -->
<Section Name="llBase64ToString">
<Key Name="inventoryID" Value="1d4c71d8-b428-11dc-8314-0800200c9a66" />
@ -169,11 +136,8 @@
<Key Name="name" Value="llBase64ToString" />
<Key Name="assetType" Value="10" />
<Key Name="inventoryType" Value="10" />
<Key Name="currentPermissions" Value="257487132" />
<Key Name="nextPermissions" Value="257487132" />
<Key Name="everyonePermissions" Value="257487132" />
<Key Name="basePermissions" Value="257487132" />
</Section>
<!-- C == <Key Name="folderID" Value="30000112-000f-0000-0000-000100bba005"/> -->
<!-- D == <Key Name="folderID" Value="30000112-000f-0000-0000-000100bba006"/> -->
<!-- E == <Key Name="folderID" Value="30000112-000f-0000-0000-000100bba007"/> -->
@ -187,6 +151,7 @@
<!-- O == <Key Name="folderID" Value="30000112-000f-0000-0000-000100bba015"/> -->
<!-- P == <Key Name="folderID" Value="30000112-000f-0000-0000-000100bba016"/> -->
<!-- R == <Key Name="folderID" Value="30000112-000f-0000-0000-000100bba017"/> -->
<Section Name="llRemoveFromLandBanList">
<Key Name="inventoryID" Value="299b2100-b392-11dc-8314-0800200c9a66" />
<Key Name="assetID" Value="299b2101-b392-11dc-8314-0800200c9a66" />
@ -195,11 +160,8 @@
<Key Name="name" Value="llRemoveFromLandBanList" />
<Key Name="assetType" Value="10" />
<Key Name="inventoryType" Value="10" />
<Key Name="currentPermissions" Value="257487132" />
<Key Name="nextPermissions" Value="257487132" />
<Key Name="everyonePermissions" Value="257487132" />
<Key Name="basePermissions" Value="257487132" />
</Section>
<Section Name="llRemoveFromLandPassList">
<Key Name="inventoryID" Value="299b2102-b392-11dc-8314-0800200c9a66" />
<Key Name="assetID" Value="299b2103-b392-11dc-8314-0800200c9a66" />
@ -208,11 +170,8 @@
<Key Name="name" Value="llRemoveFromLandPassList" />
<Key Name="assetType" Value="10" />
<Key Name="inventoryType" Value="10" />
<Key Name="currentPermissions" Value="257487132" />
<Key Name="nextPermissions" Value="257487132" />
<Key Name="everyonePermissions" Value="257487132" />
<Key Name="basePermissions" Value="257487132" />
</Section>
<Section Name="llResetLandBanList">
<Key Name="inventoryID" Value="366ac8e6-b391-11dc-8314-0800200c9a66" />
<Key Name="assetID" Value="366ac8e7-b391-11dc-8314-0800200c9a66" />
@ -221,11 +180,8 @@
<Key Name="name" Value="llResetLandBanList" />
<Key Name="assetType" Value="10" />
<Key Name="inventoryType" Value="10" />
<Key Name="currentPermissions" Value="257487132" />
<Key Name="nextPermissions" Value="257487132" />
<Key Name="everyonePermissions" Value="257487132" />
<Key Name="basePermissions" Value="257487132" />
</Section>
<Section Name="llResetLandPassList">
<Key Name="inventoryID" Value="366ac8e8-b391-11dc-8314-0800200c9a66" />
<Key Name="assetID" Value="366ac8e9-b391-11dc-8314-0800200c9a66" />
@ -234,11 +190,8 @@
<Key Name="name" Value="llResetLandPassList" />
<Key Name="assetType" Value="10" />
<Key Name="inventoryType" Value="10" />
<Key Name="currentPermissions" Value="257487132" />
<Key Name="nextPermissions" Value="257487132" />
<Key Name="everyonePermissions" Value="257487132" />
<Key Name="basePermissions" Value="257487132" />
</Section>
<!-- S == <Key Name="folderID" Value="30000112-000f-0000-0000-000100bba018"/> -->
<Section Name="llSay">
<Key Name="inventoryID" Value="3af51d20-b38f-11dc-8314-0800200c9a66" />
@ -248,11 +201,8 @@
<Key Name="name" Value="llSay" />
<Key Name="assetType" Value="10" />
<Key Name="inventoryType" Value="10" />
<Key Name="currentPermissions" Value="257487132" />
<Key Name="nextPermissions" Value="257487132" />
<Key Name="everyonePermissions" Value="257487132" />
<Key Name="basePermissions" Value="257487132" />
</Section>
<Section Name="llSetParcelMusicURL">
<Key Name="inventoryID" Value="3603a4f9-b360-11dc-8314-0800200c9a66" />
<Key Name="assetID" Value="3603a4f8-b360-11dc-8314-0800200c9a66" />
@ -261,11 +211,8 @@
<Key Name="name" Value="llSetParcelMusicURL" />
<Key Name="assetType" Value="10" />
<Key Name="inventoryType" Value="10" />
<Key Name="currentPermissions" Value="257487132" />
<Key Name="nextPermissions" Value="257487132" />
<Key Name="everyonePermissions" Value="257487132" />
<Key Name="basePermissions" Value="257487132" />
</Section>
<Section Name="llSetRot">
<Key Name="inventoryID" Value="220baef8-b376-11dc-8314-0800200c9a66" />
<Key Name="assetID" Value="220baef9-b376-11dc-8314-0800200c9a66" />
@ -274,11 +221,8 @@
<Key Name="name" Value="llSetRot" />
<Key Name="assetType" Value="10" />
<Key Name="inventoryType" Value="10" />
<Key Name="currentPermissions" Value="257487132" />
<Key Name="nextPermissions" Value="257487132" />
<Key Name="everyonePermissions" Value="257487132" />
<Key Name="basePermissions" Value="257487132" />
</Section>
<!-- T == <Key Name="folderID" Value="30000112-000f-0000-0000-000100bba019"/> -->
<!-- U == <Key Name="folderID" Value="30000112-000f-0000-0000-000100bba020"/> -->
<!-- V == <Key Name="folderID" Value="30000112-000f-0000-0000-000100bba021"/> -->
@ -288,213 +232,166 @@
<Section Name="Kan-Ed Test1">
<Key Name="inventoryID" Value="42b6ac70-d21f-11dd-ad8b-0800200c9a66" />
<Key Name="assetID" Value="42b6ac70-d21f-11dd-ad8b-0800200c9a66" />
<Key Name="folderID" Value="30000112-000f-0000-0000-000100bba024"/>
<Key Name="folderID" Value="30000112-000f-0000-0000-000100bba024"/>
<Key Name="description" Value="Kan-Ed Test1" />
<Key Name="name" Value="Kan-Ed Test1" />
<Key Name="assetType" Value="10" />
<Key Name="inventoryType" Value="10" />
<Key Name="currentPermissions" Value="257487132" />
<Key Name="nextPermissions" Value="257487132" />
<Key Name="everyonePermissions" Value="257487132" />
<Key Name="basePermissions" Value="257487132" />
</Section>
<Section Name="Kan-Ed Test2">
<Key Name="inventoryID" Value="42b6ac71-d21f-11dd-ad8b-0800200c9a66" />
<Key Name="assetID" Value="42b6ac71-d21f-11dd-ad8b-0800200c9a66" />
<Key Name="folderID" Value="30000112-000f-0000-0000-000100bba024"/>
<Key Name="folderID" Value="30000112-000f-0000-0000-000100bba024"/>
<Key Name="description" Value="Kan-Ed Test2" />
<Key Name="name" Value="Kan-Ed Test2" />
<Key Name="assetType" Value="10" />
<Key Name="inventoryType" Value="10" />
<Key Name="currentPermissions" Value="257487132" />
<Key Name="nextPermissions" Value="257487132" />
<Key Name="everyonePermissions" Value="257487132" />
<Key Name="basePermissions" Value="257487132" />
</Section>
<Section Name="Kan-Ed Test3">
<Key Name="inventoryID" Value="42b6ac72-d21f-11dd-ad8b-0800200c9a66" />
<Key Name="assetID" Value="42b6ac72-d21f-11dd-ad8b-0800200c9a66" />
<Key Name="folderID" Value="30000112-000f-0000-0000-000100bba024"/>
<Key Name="folderID" Value="30000112-000f-0000-0000-000100bba024"/>
<Key Name="description" Value="Kan-Ed Test3" />
<Key Name="name" Value="Kan-Ed Test3" />
<Key Name="assetType" Value="10" />
<Key Name="inventoryType" Value="10" />
<Key Name="currentPermissions" Value="257487132" />
<Key Name="nextPermissions" Value="257487132" />
<Key Name="everyonePermissions" Value="257487132" />
<Key Name="basePermissions" Value="257487132" />
</Section>
<Section Name="Kan-Ed Test4">
<Key Name="inventoryID" Value="42b6ac73-d21f-11dd-ad8b-0800200c9a66" />
<Key Name="assetID" Value="42b6ac73-d21f-11dd-ad8b-0800200c9a66" />
<Key Name="folderID" Value="30000112-000f-0000-0000-000100bba024"/>
<Key Name="folderID" Value="30000112-000f-0000-0000-000100bba024"/>
<Key Name="description" Value="Kan-Ed Test4" />
<Key Name="name" Value="Kan-Ed Test4" />
<Key Name="assetType" Value="10" />
<Key Name="inventoryType" Value="10" />
<Key Name="currentPermissions" Value="257487132" />
<Key Name="nextPermissions" Value="257487132" />
<Key Name="everyonePermissions" Value="257487132" />
<Key Name="basePermissions" Value="257487132" />
</Section>
<Section Name="Kan-Ed Test5">
<Key Name="inventoryID" Value="42b6ac74-d21f-11dd-ad8b-0800200c9a66" />
<Key Name="assetID" Value="42b6ac74-d21f-11dd-ad8b-0800200c9a66" />
<Key Name="folderID" Value="30000112-000f-0000-0000-000100bba024"/>
<Key Name="folderID" Value="30000112-000f-0000-0000-000100bba024"/>
<Key Name="description" Value="Kan-Ed Test5" />
<Key Name="name" Value="Kan-Ed Test5" />
<Key Name="assetType" Value="10" />
<Key Name="inventoryType" Value="10" />
<Key Name="currentPermissions" Value="257487132" />
<Key Name="nextPermissions" Value="257487132" />
<Key Name="everyonePermissions" Value="257487132" />
<Key Name="basePermissions" Value="257487132" />
</Section>
<Section Name="Kan-Ed Test6">
<Key Name="inventoryID" Value="42b6ac75-d21f-11dd-ad8b-0800200c9a66" />
<Key Name="assetID" Value="42b6ac75-d21f-11dd-ad8b-0800200c9a66" />
<Key Name="folderID" Value="30000112-000f-0000-0000-000100bba024"/>
<Key Name="folderID" Value="30000112-000f-0000-0000-000100bba024"/>
<Key Name="description" Value="Kan-Ed Test6" />
<Key Name="name" Value="Kan-Ed Test6" />
<Key Name="assetType" Value="10" />
<Key Name="inventoryType" Value="10" />
<Key Name="currentPermissions" Value="257487132" />
<Key Name="nextPermissions" Value="257487132" />
<Key Name="everyonePermissions" Value="257487132" />
<Key Name="basePermissions" Value="257487132" />
</Section>
<Section Name="Kan-Ed Test7">
<Key Name="inventoryID" Value="42b6ac76-d21f-11dd-ad8b-0800200c9a66" />
<Key Name="assetID" Value="42b6ac76-d21f-11dd-ad8b-0800200c9a66" />
<Key Name="folderID" Value="30000112-000f-0000-0000-000100bba024"/>
<Key Name="folderID" Value="30000112-000f-0000-0000-000100bba024"/>
<Key Name="description" Value="Kan-Ed Test7" />
<Key Name="name" Value="Kan-Ed Test7" />
<Key Name="assetType" Value="10" />
<Key Name="inventoryType" Value="10" />
<Key Name="currentPermissions" Value="257487132" />
<Key Name="nextPermissions" Value="257487132" />
<Key Name="everyonePermissions" Value="257487132" />
<Key Name="basePermissions" Value="257487132" />
</Section>
<Section Name="Kan-Ed Test8">
<Key Name="inventoryID" Value="42b6ac77-d21f-11dd-ad8b-0800200c9a66" />
<Key Name="assetID" Value="42b6ac77-d21f-11dd-ad8b-0800200c9a66" />
<Key Name="folderID" Value="30000112-000f-0000-0000-000100bba024"/>
<Key Name="folderID" Value="30000112-000f-0000-0000-000100bba024"/>
<Key Name="description" Value="Kan-Ed Test8" />
<Key Name="name" Value="Kan-Ed Test8" />
<Key Name="assetType" Value="10" />
<Key Name="inventoryType" Value="10" />
<Key Name="currentPermissions" Value="257487132" />
<Key Name="nextPermissions" Value="257487132" />
<Key Name="everyonePermissions" Value="257487132" />
<Key Name="basePermissions" Value="257487132" />
</Section>
<Section Name="Kan-Ed Test9">
<Key Name="inventoryID" Value="42b6ac78-d21f-11dd-ad8b-0800200c9a66" />
<Key Name="assetID" Value="42b6ac78-d21f-11dd-ad8b-0800200c9a66" />
<Key Name="folderID" Value="30000112-000f-0000-0000-000100bba024"/>
<Key Name="folderID" Value="30000112-000f-0000-0000-000100bba024"/>
<Key Name="description" Value="Kan-Ed Test9" />
<Key Name="name" Value="Kan-Ed Test9" />
<Key Name="assetType" Value="10" />
<Key Name="inventoryType" Value="10" />
<Key Name="currentPermissions" Value="257487132" />
<Key Name="nextPermissions" Value="257487132" />
<Key Name="everyonePermissions" Value="257487132" />
<Key Name="basePermissions" Value="257487132" />
</Section>
<Section Name="Kan-Ed Test10">
<Key Name="inventoryID" Value="42b6ac79-d21f-11dd-ad8b-0800200c9a66" />
<Key Name="assetID" Value="42b6ac79-d21f-11dd-ad8b-0800200c9a66" />
<Key Name="folderID" Value="30000112-000f-0000-0000-000100bba024"/>
<Key Name="folderID" Value="30000112-000f-0000-0000-000100bba024"/>
<Key Name="description" Value="Kan-Ed Test10" />
<Key Name="name" Value="Kan-Ed Test10" />
<Key Name="assetType" Value="10" />
<Key Name="inventoryType" Value="10" />
<Key Name="currentPermissions" Value="257487132" />
<Key Name="nextPermissions" Value="257487132" />
<Key Name="everyonePermissions" Value="257487132" />
<Key Name="basePermissions" Value="257487132" />
</Section>
<Section Name="Kan-Ed Test11">
<Key Name="inventoryID" Value="42b6ac7a-d21f-11dd-ad8b-0800200c9a66" />
<Key Name="assetID" Value="42b6ac7a-d21f-11dd-ad8b-0800200c9a66" />
<Key Name="folderID" Value="30000112-000f-0000-0000-000100bba024"/>
<Key Name="folderID" Value="30000112-000f-0000-0000-000100bba024"/>
<Key Name="description" Value="Kan-Ed Test11" />
<Key Name="name" Value="Kan-Ed Test11" />
<Key Name="assetType" Value="10" />
<Key Name="inventoryType" Value="10" />
<Key Name="currentPermissions" Value="257487132" />
<Key Name="nextPermissions" Value="257487132" />
<Key Name="everyonePermissions" Value="257487132" />
<Key Name="basePermissions" Value="257487132" />
</Section>
<Section Name="Kan-Ed Test12">
<Key Name="inventoryID" Value="42b6ac7b-d21f-11dd-ad8b-0800200c9a66" />
<Key Name="assetID" Value="42b6ac7b-d21f-11dd-ad8b-0800200c9a66" />
<Key Name="folderID" Value="30000112-000f-0000-0000-000100bba024"/>
<Key Name="folderID" Value="30000112-000f-0000-0000-000100bba024"/>
<Key Name="description" Value="Kan-Ed Test12" />
<Key Name="name" Value="Kan-Ed Test12" />
<Key Name="assetType" Value="10" />
<Key Name="inventoryType" Value="10" />
<Key Name="currentPermissions" Value="257487132" />
<Key Name="nextPermissions" Value="257487132" />
<Key Name="everyonePermissions" Value="257487132" />
<Key Name="basePermissions" Value="257487132" />
</Section>
<Section Name="Kan-Ed Test13">
<Key Name="inventoryID" Value="42b6ac7c-d21f-11dd-ad8b-0800200c9a66" />
<Key Name="assetID" Value="42b6ac7c-d21f-11dd-ad8b-0800200c9a66" />
<Key Name="folderID" Value="30000112-000f-0000-0000-000100bba024"/>
<Key Name="folderID" Value="30000112-000f-0000-0000-000100bba024"/>
<Key Name="description" Value="Kan-Ed Test13" />
<Key Name="name" Value="Kan-Ed Test13" />
<Key Name="assetType" Value="10" />
<Key Name="inventoryType" Value="10" />
<Key Name="currentPermissions" Value="257487132" />
<Key Name="nextPermissions" Value="257487132" />
<Key Name="everyonePermissions" Value="257487132" />
<Key Name="basePermissions" Value="257487132" />
</Section>
<Section Name="Kan-Ed Test14">
<Key Name="inventoryID" Value="42b6ac7d-d21f-11dd-ad8b-0800200c9a66" />
<Key Name="assetID" Value="42b6ac7d-d21f-11dd-ad8b-0800200c9a66" />
<Key Name="folderID" Value="30000112-000f-0000-0000-000100bba024"/>
<Key Name="folderID" Value="30000112-000f-0000-0000-000100bba024"/>
<Key Name="description" Value="Kan-Ed Test14" />
<Key Name="name" Value="Kan-Ed Test14" />
<Key Name="assetType" Value="10" />
<Key Name="inventoryType" Value="10" />
<Key Name="currentPermissions" Value="257487132" />
<Key Name="nextPermissions" Value="257487132" />
<Key Name="everyonePermissions" Value="257487132" />
<Key Name="basePermissions" Value="257487132" />
</Section>
<Section Name="Kan-Ed Test15">
<Key Name="inventoryID" Value="42b6ac7e-d21f-11dd-ad8b-0800200c9a66" />
<Key Name="assetID" Value="42b6ac7e-d21f-11dd-ad8b-0800200c9a66" />
<Key Name="folderID" Value="30000112-000f-0000-0000-000100bba024"/>
<Key Name="folderID" Value="30000112-000f-0000-0000-000100bba024"/>
<Key Name="description" Value="Kan-Ed Test15" />
<Key Name="name" Value="Kan-Ed Test15" />
<Key Name="assetType" Value="10" />
<Key Name="inventoryType" Value="10" />
<Key Name="currentPermissions" Value="257487132" />
<Key Name="nextPermissions" Value="257487132" />
<Key Name="everyonePermissions" Value="257487132" />
<Key Name="basePermissions" Value="257487132" />
</Section>
<Section Name="Kan-Ed Test16">
<Key Name="inventoryID" Value="42b6ac7f-d21f-11dd-ad8b-0800200c9a66" />
<Key Name="assetID" Value="42b6ac7f-d21f-11dd-ad8b-0800200c9a66" />
<Key Name="folderID" Value="30000112-000f-0000-0000-000100bba024"/>
<Key Name="folderID" Value="30000112-000f-0000-0000-000100bba024"/>
<Key Name="description" Value="Kan-Ed Test16" />
<Key Name="name" Value="Kan-Ed Test16" />
<Key Name="assetType" Value="10" />
<Key Name="inventoryType" Value="10" />
<Key Name="currentPermissions" Value="257487132" />
<Key Name="nextPermissions" Value="257487132" />
<Key Name="everyonePermissions" Value="257487132" />
<Key Name="basePermissions" Value="257487132" />
</Section>
<!-- .Other testing scripts == <Key Name="folderID" Value="30000112-000f-0000-0000-000100bba025"/> -->
<!-- OpenSim Specific Scripts == <Key Name="folderID" Value="284858c8-9391-6bf1-ddf5-b936f73de853"/> -->
<Section Name="osTextBoard">
<Key Name="inventoryID" Value="2ddcb059-20c5-d169-4c42-673f16d3284b" />
<Key Name="assetID" Value="2ddcb059-20c5-d169-4c42-673f16d3284b" />
@ -503,11 +400,8 @@
<Key Name="name" Value="osTextBoard" />
<Key Name="assetType" Value="10" />
<Key Name="inventoryType" Value="10" />
<Key Name="currentPermissions" Value="257487132" />
<Key Name="nextPermissions" Value="257487132" />
<Key Name="everyonePermissions" Value="257487132" />
<Key Name="basePermissions" Value="257487132" />
</Section>
<Section Name="osWeatherMap">
<Key Name="inventoryID" Value="d63ad3ec-b687-6c38-410d-31ba3e50ce4d" />
<Key Name="assetID" Value="d63ad3ec-b687-6c38-410d-31ba3e50ce4d" />
@ -516,11 +410,8 @@
<Key Name="name" Value="osWeatherMap" />
<Key Name="assetType" Value="10" />
<Key Name="inventoryType" Value="10" />
<Key Name="currentPermissions" Value="257487132" />
<Key Name="nextPermissions" Value="257487132" />
<Key Name="everyonePermissions" Value="257487132" />
<Key Name="basePermissions" Value="257487132" />
</Section>
<Section Name="GrafittiBoard">
<Key Name="inventoryID" Value="81305ee4-8caa-9e0a-69a4-76ed57df0c8f" />
<Key Name="assetID" Value="81305ee4-8caa-9e0a-69a4-76ed57df0c8f" />
@ -529,9 +420,5 @@
<Key Name="name" Value="GrafittiBoard" />
<Key Name="assetType" Value="10" />
<Key Name="inventoryType" Value="10" />
<Key Name="currentPermissions" Value="257487132" />
<Key Name="nextPermissions" Value="257487132" />
<Key Name="everyonePermissions" Value="257487132" />
<Key Name="basePermissions" Value="257487132" />
</Section>
</Nini>

View File

@ -9,10 +9,6 @@
<Key Name="name" Value="Example Library Item" />
<Key Name="assetType" Value="7" />
<Key Name="inventoryType" Value="7" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
-->

View File

@ -9,10 +9,6 @@
<Key Name="name" Value="Example Library Item" />
<Key Name="assetType" Value="7" />
<Key Name="inventoryType" Value="7" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
-->
@ -24,11 +20,8 @@
<Key Name="name" Value="4-tile2" />
<Key Name="assetType" Value="0" />
<Key Name="inventoryType" Value="0" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
<Section Name="4-tile3 Texture">
<Key Name="inventoryID" Value="00000000-0000-2222-4444-100000001001" />
<Key Name="assetID" Value="00000000-0000-2222-3333-100000001001" />
@ -37,11 +30,8 @@
<Key Name="name" Value="4-tile3" />
<Key Name="assetType" Value="0" />
<Key Name="inventoryType" Value="0" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
<Section Name="brick1_256 Texture">
<Key Name="inventoryID" Value="00000000-0000-2222-4444-100000001002" />
<Key Name="assetID" Value="00000000-0000-2222-3333-100000001002" />
@ -50,11 +40,8 @@
<Key Name="name" Value="brick1_256" />
<Key Name="assetType" Value="0" />
<Key Name="inventoryType" Value="0" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
<Section Name="brick2_256 Texture">
<Key Name="inventoryID" Value="00000000-0000-2222-4444-100000001003" />
<Key Name="assetID" Value="00000000-0000-2222-3333-100000001003" />
@ -63,11 +50,8 @@
<Key Name="name" Value="brick2_256" />
<Key Name="assetType" Value="0" />
<Key Name="inventoryType" Value="0" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
<Section Name="brick_mono Texture">
<Key Name="inventoryID" Value="00000000-0000-2222-4444-100000001004" />
<Key Name="assetID" Value="00000000-0000-2222-3333-100000001004" />
@ -76,11 +60,8 @@
<Key Name="name" Value="brick_mono" />
<Key Name="assetType" Value="0" />
<Key Name="inventoryType" Value="0" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
<Section Name="cedar Texture">
<Key Name="inventoryID" Value="00000000-0000-2222-4444-100000001005" />
<Key Name="assetID" Value="00000000-0000-2222-3333-100000001005" />
@ -89,11 +70,8 @@
<Key Name="name" Value="cedar" />
<Key Name="assetType" Value="0" />
<Key Name="inventoryType" Value="0" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
<Section Name="cement_block Texture">
<Key Name="inventoryID" Value="00000000-0000-2222-4444-100000001006" />
<Key Name="assetID" Value="00000000-0000-2222-3333-100000001006" />
@ -102,11 +80,8 @@
<Key Name="name" Value="cement_block" />
<Key Name="assetType" Value="0" />
<Key Name="inventoryType" Value="0" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
<Section Name="clear Texture">
<Key Name="inventoryID" Value="00000000-0000-2222-4444-100000001007" />
<Key Name="assetID" Value="00000000-0000-2222-3333-100000001007" />
@ -115,11 +90,8 @@
<Key Name="name" Value="clear" />
<Key Name="assetType" Value="0" />
<Key Name="inventoryType" Value="0" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
<Section Name="cobbles Texture">
<Key Name="inventoryID" Value="00000000-0000-2222-4444-100000001008" />
<Key Name="assetID" Value="00000000-0000-2222-3333-100000001008" />
@ -128,11 +100,8 @@
<Key Name="name" Value="cobbles" />
<Key Name="assetType" Value="0" />
<Key Name="inventoryType" Value="0" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
<Section Name="creambrick Texture">
<Key Name="inventoryID" Value="00000000-0000-2222-4444-100000001009" />
<Key Name="assetID" Value="00000000-0000-2222-3333-100000001009" />
@ -141,11 +110,8 @@
<Key Name="name" Value="creambrick" />
<Key Name="assetType" Value="0" />
<Key Name="inventoryType" Value="0" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
<Section Name="fgrass Texture">
<Key Name="inventoryID" Value="00000000-0000-2222-4444-100000001010" />
<Key Name="assetID" Value="00000000-0000-2222-3333-100000001010" />
@ -154,11 +120,8 @@
<Key Name="name" Value="fgrass" />
<Key Name="assetType" Value="0" />
<Key Name="inventoryType" Value="0" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
<Section Name="glasstile2 Texture">
<Key Name="inventoryID" Value="00000000-0000-2222-4444-100000001011" />
<Key Name="assetID" Value="00000000-0000-2222-3333-100000001011" />
@ -167,11 +130,8 @@
<Key Name="name" Value="glasstile2" />
<Key Name="assetType" Value="0" />
<Key Name="inventoryType" Value="0" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
<Section Name="graniteblock Texture">
<Key Name="inventoryID" Value="00000000-0000-2222-4444-100000001012" />
<Key Name="assetID" Value="00000000-0000-2222-3333-100000001012" />
@ -180,11 +140,8 @@
<Key Name="name" Value="graniteblock" />
<Key Name="assetType" Value="0" />
<Key Name="inventoryType" Value="0" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
<Section Name="grass Texture">
<Key Name="inventoryID" Value="00000000-0000-2222-4444-100000001013" />
<Key Name="assetID" Value="00000000-0000-2222-3333-100000001013" />
@ -193,11 +150,8 @@
<Key Name="name" Value="grass" />
<Key Name="assetType" Value="0" />
<Key Name="inventoryType" Value="0" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
<Section Name="gravel Texture">
<Key Name="inventoryID" Value="00000000-0000-2222-4444-100000001014" />
<Key Name="assetID" Value="00000000-0000-2222-3333-100000001014" />
@ -206,11 +160,8 @@
<Key Name="name" Value="gravel" />
<Key Name="assetType" Value="0" />
<Key Name="inventoryType" Value="0" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
<Section Name="greybrick Texture">
<Key Name="inventoryID" Value="00000000-0000-2222-4444-100000001015" />
<Key Name="assetID" Value="00000000-0000-2222-3333-100000001015" />
@ -219,11 +170,8 @@
<Key Name="name" Value="greybrick" />
<Key Name="assetType" Value="0" />
<Key Name="inventoryType" Value="0" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
<Section Name="ivy Texture">
<Key Name="inventoryID" Value="00000000-0000-2222-4444-100000001016" />
<Key Name="assetID" Value="00000000-0000-2222-3333-100000001016" />
@ -232,11 +180,8 @@
<Key Name="name" Value="ivy" />
<Key Name="assetType" Value="0" />
<Key Name="inventoryType" Value="0" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
<Section Name="mahogany Texture">
<Key Name="inventoryID" Value="00000000-0000-2222-4444-100000001017" />
<Key Name="assetID" Value="00000000-0000-2222-3333-100000001017" />
@ -245,11 +190,8 @@
<Key Name="name" Value="mahogany" />
<Key Name="assetType" Value="0" />
<Key Name="inventoryType" Value="0" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
<Section Name="maple Texture">
<Key Name="inventoryID" Value="00000000-0000-2222-4444-100000001018" />
<Key Name="assetID" Value="00000000-0000-2222-3333-100000001018" />
@ -258,11 +200,8 @@
<Key Name="name" Value="maple" />
<Key Name="assetType" Value="0" />
<Key Name="inventoryType" Value="0" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
<Section Name="mosaic02 Texture">
<Key Name="inventoryID" Value="00000000-0000-2222-4444-100000001019" />
<Key Name="assetID" Value="00000000-0000-2222-3333-100000001019" />
@ -271,11 +210,8 @@
<Key Name="name" Value="mosaic02" />
<Key Name="assetType" Value="0" />
<Key Name="inventoryType" Value="0" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
<Section Name="palm1 Texture">
<Key Name="inventoryID" Value="00000000-0000-2222-4444-100000001020" />
<Key Name="assetID" Value="00000000-0000-2222-3333-100000001020" />
@ -284,11 +220,8 @@
<Key Name="name" Value="palm1" />
<Key Name="assetType" Value="0" />
<Key Name="inventoryType" Value="0" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
<Section Name="papaya Texture">
<Key Name="inventoryID" Value="00000000-0000-2222-4444-100000001021" />
<Key Name="assetID" Value="00000000-0000-2222-3333-100000001021" />
@ -297,11 +230,8 @@
<Key Name="name" Value="papaya" />
<Key Name="assetType" Value="0" />
<Key Name="inventoryType" Value="0" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
<Section Name="papaya_bark Texture">
<Key Name="inventoryID" Value="00000000-0000-2222-4444-100000001022" />
<Key Name="assetID" Value="00000000-0000-2222-3333-100000001022" />
@ -310,11 +240,8 @@
<Key Name="name" Value="papaya_bark" />
<Key Name="assetType" Value="0" />
<Key Name="inventoryType" Value="0" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
<Section Name="pastelbrick Texture">
<Key Name="inventoryID" Value="00000000-0000-2222-4444-100000001023" />
<Key Name="assetID" Value="00000000-0000-2222-3333-100000001023" />
@ -323,11 +250,8 @@
<Key Name="name" Value="pastelbrick" />
<Key Name="assetType" Value="0" />
<Key Name="inventoryType" Value="0" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
<Section Name="pine1_10m Texture">
<Key Name="inventoryID" Value="00000000-0000-2222-4444-100000001024" />
<Key Name="assetID" Value="00000000-0000-2222-3333-100000001024" />
@ -336,11 +260,8 @@
<Key Name="name" Value="pine1_10m" />
<Key Name="assetType" Value="0" />
<Key Name="inventoryType" Value="0" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
<Section Name="poplar Texture">
<Key Name="inventoryID" Value="00000000-0000-2222-4444-100000001025" />
<Key Name="assetID" Value="00000000-0000-2222-3333-100000001025" />
@ -349,11 +270,8 @@
<Key Name="name" Value="poplar" />
<Key Name="assetType" Value="0" />
<Key Name="inventoryType" Value="0" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
<Section Name="redtri_tile Texture">
<Key Name="inventoryID" Value="00000000-0000-2222-4444-100000001026" />
<Key Name="assetID" Value="00000000-0000-2222-3333-100000001026" />
@ -362,11 +280,8 @@
<Key Name="name" Value="redtri_tile" />
<Key Name="assetType" Value="0" />
<Key Name="inventoryType" Value="0" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
<Section Name="rockbuilding Texture">
<Key Name="inventoryID" Value="00000000-0000-2222-4444-100000001027" />
<Key Name="assetID" Value="00000000-0000-2222-3333-100000001027" />
@ -375,11 +290,8 @@
<Key Name="name" Value="rockbuilding" />
<Key Name="assetType" Value="0" />
<Key Name="inventoryType" Value="0" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
<Section Name="rockwallbig Texture">
<Key Name="inventoryID" Value="00000000-0000-2222-4444-100000001028" />
<Key Name="assetID" Value="00000000-0000-2222-3333-100000001028" />
@ -388,11 +300,8 @@
<Key Name="name" Value="rockwallbig" />
<Key Name="assetType" Value="0" />
<Key Name="inventoryType" Value="0" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
<Section Name="roof01 Texture">
<Key Name="inventoryID" Value="00000000-0000-2222-4444-100000001029" />
<Key Name="assetID" Value="00000000-0000-2222-3333-100000001029" />
@ -401,11 +310,8 @@
<Key Name="name" Value="roof01" />
<Key Name="assetType" Value="0" />
<Key Name="inventoryType" Value="0" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
<Section Name="rooftiles1 Texture">
<Key Name="inventoryID" Value="00000000-0000-2222-4444-100000001030" />
<Key Name="assetID" Value="00000000-0000-2222-3333-100000001030" />
@ -414,11 +320,8 @@
<Key Name="name" Value="rooftiles1" />
<Key Name="assetType" Value="0" />
<Key Name="inventoryType" Value="0" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
<Section Name="rooftiles2_peach Texture">
<Key Name="inventoryID" Value="00000000-0000-2222-4444-100000001031" />
<Key Name="assetID" Value="00000000-0000-2222-3333-100000001031" />
@ -427,11 +330,8 @@
<Key Name="name" Value="rooftiles2_peach" />
<Key Name="assetType" Value="0" />
<Key Name="inventoryType" Value="0" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
<Section Name="rooftiles2_roy Texture">
<Key Name="inventoryID" Value="00000000-0000-2222-4444-100000001032" />
<Key Name="assetID" Value="00000000-0000-2222-3333-100000001032" />
@ -440,11 +340,8 @@
<Key Name="name" Value="rooftiles2_roy" />
<Key Name="assetType" Value="0" />
<Key Name="inventoryType" Value="0" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
<Section Name="saguaro_8m Texture">
<Key Name="inventoryID" Value="00000000-0000-2222-4444-100000001033" />
<Key Name="assetID" Value="00000000-0000-2222-3333-100000001033" />
@ -453,11 +350,8 @@
<Key Name="name" Value="saguaro_8m" />
<Key Name="assetType" Value="0" />
<Key Name="inventoryType" Value="0" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
<Section Name="seawater Texture">
<Key Name="inventoryID" Value="00000000-0000-2222-4444-100000001034" />
<Key Name="assetID" Value="00000000-0000-2222-3333-100000001034" />
@ -466,11 +360,8 @@
<Key Name="name" Value="seawater" />
<Key Name="assetType" Value="0" />
<Key Name="inventoryType" Value="0" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
<Section Name="snow1 Texture">
<Key Name="inventoryID" Value="00000000-0000-2222-4444-100000001035" />
<Key Name="assetID" Value="00000000-0000-2222-3333-100000001035" />
@ -479,11 +370,8 @@
<Key Name="name" Value="snow1" />
<Key Name="assetType" Value="0" />
<Key Name="inventoryType" Value="0" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
<Section Name="steel Texture">
<Key Name="inventoryID" Value="00000000-0000-2222-4444-100000001036" />
<Key Name="assetID" Value="00000000-0000-2222-3333-100000001036" />
@ -492,11 +380,8 @@
<Key Name="name" Value="steel" />
<Key Name="assetType" Value="0" />
<Key Name="inventoryType" Value="0" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
<Section Name="stone1wall Texture">
<Key Name="inventoryID" Value="00000000-0000-2222-4444-100000001037" />
<Key Name="assetID" Value="00000000-0000-2222-3333-100000001037" />
@ -505,11 +390,8 @@
<Key Name="name" Value="stone1wall" />
<Key Name="assetType" Value="0" />
<Key Name="inventoryType" Value="0" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
<Section Name="stonetile Texture">
<Key Name="inventoryID" Value="00000000-0000-2222-4444-100000001038" />
<Key Name="assetID" Value="00000000-0000-2222-3333-100000001038" />
@ -518,11 +400,8 @@
<Key Name="name" Value="stonetile" />
<Key Name="assetType" Value="0" />
<Key Name="inventoryType" Value="0" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
<Section Name="street2 Texture">
<Key Name="inventoryID" Value="00000000-0000-2222-4444-100000001039" />
<Key Name="assetID" Value="00000000-0000-2222-3333-100000001039" />
@ -531,11 +410,8 @@
<Key Name="name" Value="street2" />
<Key Name="assetType" Value="0" />
<Key Name="inventoryType" Value="0" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
<Section Name="thatch Texture">
<Key Name="inventoryID" Value="00000000-0000-2222-4444-100000001040" />
<Key Name="assetID" Value="00000000-0000-2222-3333-100000001040" />
@ -544,11 +420,8 @@
<Key Name="name" Value="thatch" />
<Key Name="assetType" Value="0" />
<Key Name="inventoryType" Value="0" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
<Section Name="water1 Texture">
<Key Name="inventoryID" Value="00000000-0000-2222-4444-100000001041" />
<Key Name="assetID" Value="00000000-0000-2222-3333-100000001041" />
@ -557,11 +430,8 @@
<Key Name="name" Value="water1" />
<Key Name="assetType" Value="0" />
<Key Name="inventoryType" Value="0" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
<Section Name="water3 Texture">
<Key Name="inventoryID" Value="00000000-0000-2222-4444-100000001042" />
<Key Name="assetID" Value="00000000-0000-2222-3333-100000001042" />
@ -570,11 +440,8 @@
<Key Name="name" Value="water3" />
<Key Name="assetType" Value="0" />
<Key Name="inventoryType" Value="0" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
<Section Name="wood1 Texture">
<Key Name="inventoryID" Value="00000000-0000-2222-4444-100000001043" />
<Key Name="assetID" Value="00000000-0000-2222-3333-100000001043" />
@ -583,11 +450,8 @@
<Key Name="name" Value="wood1" />
<Key Name="assetType" Value="0" />
<Key Name="inventoryType" Value="0" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
<Section Name="bricks Texture">
<Key Name="inventoryID" Value="00000000-0000-2222-9999-000000000001"/>
<Key Name="assetID" Value="00000000-0000-1111-9999-000000000001"/>
@ -596,11 +460,8 @@
<Key Name="name" Value="bricks" />
<Key Name="assetType" Value="0" />
<Key Name="inventoryType" Value="0" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
<Section Name="granite Texture">
<Key Name="inventoryID" Value="00000000-0000-2222-9999-000000000004"/>
<Key Name="assetID" Value="00000000-0000-1111-9999-000000000004"/>
@ -609,11 +470,8 @@
<Key Name="name" Value="granite" />
<Key Name="assetType" Value="0" />
<Key Name="inventoryType" Value="0" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
<Section Name="hardwood Texture">
<Key Name="inventoryID" Value="00000000-0000-2222-9999-000000000005"/>
<Key Name="assetID" Value="00000000-0000-1111-9999-000000000005"/>
@ -622,11 +480,8 @@
<Key Name="name" Value="hardwood" />
<Key Name="assetType" Value="0" />
<Key Name="inventoryType" Value="0" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
<Section Name="rocks Texture">
<Key Name="inventoryID" Value="00000000-0000-2222-9999-000000000003"/>
<Key Name="assetID" Value="00000000-0000-1111-9999-000000000003"/>
@ -635,10 +490,6 @@
<Key Name="name" Value="rocks" />
<Key Name="assetType" Value="0" />
<Key Name="inventoryType" Value="0" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
<Section Name="Terrain Dirt">
@ -649,11 +500,8 @@
<Key Name="name" Value="Terrain Dirt" />
<Key Name="assetType" Value="0" />
<Key Name="inventoryType" Value="0" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
<Section Name="Terrain Grass">
<Key Name="inventoryID" Value="00000000-0000-2222-9999-000000000007"/>
<Key Name="assetID" Value="abb783e6-3e93-26c0-248a-247666855da3"/>
@ -662,11 +510,8 @@
<Key Name="name" Value="Terrain Grass" />
<Key Name="assetType" Value="0" />
<Key Name="inventoryType" Value="0" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
<Section Name="Terrain Mountain">
<Key Name="inventoryID" Value="00000000-0000-2222-9999-000000000008"/>
<Key Name="assetID" Value="179cdabd-398a-9b6b-1391-4dc333ba321f"/>
@ -675,11 +520,8 @@
<Key Name="name" Value="Terrain Mountain" />
<Key Name="assetType" Value="0" />
<Key Name="inventoryType" Value="0" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
<Section Name="Terrain Rock">
<Key Name="inventoryID" Value="00000000-0000-2222-9999-000000000009"/>
<Key Name="assetID" Value="beb169c7-11ea-fff2-efe5-0f24dc881df2"/>
@ -688,10 +530,6 @@
<Key Name="name" Value="Terrain Rock" />
<Key Name="assetType" Value="0" />
<Key Name="inventoryType" Value="0" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
<Section Name="Blank Texture">
@ -702,10 +540,6 @@
<Key Name="name" Value="Blank Texture" />
<Key Name="assetType" Value="0" />
<Key Name="inventoryType" Value="0" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
<Section Name="Default Media Texture">
@ -716,10 +550,6 @@
<Key Name="name" Value="Default Media Texture" />
<Key Name="assetType" Value="0" />
<Key Name="inventoryType" Value="0" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
<Section Name="Default Transparent Texture">
@ -730,9 +560,5 @@
<Key Name="name" Value="Default Transparent Texture" />
<Key Name="assetType" Value="0" />
<Key Name="inventoryType" Value="0" />
<Key Name="currentPermissions" Value="2147483647" />
<Key Name="nextPermissions" Value="2147483647" />
<Key Name="everyonePermissions" Value="2147483647" />
<Key Name="basePermissions" Value="2147483647" />
</Section>
</Nini>