Merge branch 'master' into bulletsim
commit
c3f579046c
|
@ -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());
|
||||
|
||||
/*
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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++)
|
||||
|
|
|
@ -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");
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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?
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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");
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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");
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
|
@ -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"; } }
|
||||
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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");
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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))
|
||||
{
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
|
@ -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>
|
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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>
|
||||
-->
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
-->
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
-->
|
||||
|
||||
|
|
|
@ -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>
|
||||
-->
|
||||
|
||||
|
|
|
@ -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>
|
||||
-->
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
-->
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
|
Loading…
Reference in New Issue