Merge branch 'master' into presence-refactor

slimupdates
Melanie 2010-02-15 00:20:48 +00:00
commit c033223c63
60 changed files with 1674 additions and 586 deletions

View File

@ -120,6 +120,7 @@ what it is today.
* tglion * tglion
* tlaukkan/Tommil (Tommi S. E. Laukkanen, Bubble Cloud) * tlaukkan/Tommil (Tommi S. E. Laukkanen, Bubble Cloud)
* tyre * tyre
* VikingErik
* Vytek * Vytek
* webmage (IBM) * webmage (IBM)
* Xantor * Xantor

View File

@ -29,6 +29,7 @@ using System;
using System.IO; using System.IO;
using System.Xml.Serialization; using System.Xml.Serialization;
using OpenMetaverse; using OpenMetaverse;
using OpenSim.Framework;
using OpenSim.Framework.Servers; using OpenSim.Framework.Servers;
using OpenSim.Framework.Servers.HttpServer; using OpenSim.Framework.Servers.HttpServer;
using OpenSim.Region.Framework.Interfaces; using OpenSim.Region.Framework.Interfaces;
@ -156,8 +157,8 @@ namespace OpenSim.ApplicationPlugins.Rest.Regions
Vector3 min, max; Vector3 min, max;
try try
{ {
min = new Vector3((float)Double.Parse(subregion[0]), (float)Double.Parse(subregion[1]), (float)Double.Parse(subregion[2])); min = new Vector3((float)Double.Parse(subregion[0], Culture.NumberFormatInfo), (float)Double.Parse(subregion[1], Culture.NumberFormatInfo), (float)Double.Parse(subregion[2], Culture.NumberFormatInfo));
max = new Vector3((float)Double.Parse(subregion[3]), (float)Double.Parse(subregion[4]), (float)Double.Parse(subregion[5])); max = new Vector3((float)Double.Parse(subregion[3], Culture.NumberFormatInfo), (float)Double.Parse(subregion[4], Culture.NumberFormatInfo), (float)Double.Parse(subregion[5], Culture.NumberFormatInfo));
} }
catch (Exception) catch (Exception)
{ {

View File

@ -698,6 +698,8 @@ namespace OpenSim.Client.MXP.ClientStack
public event UUIDNameRequest OnTeleportHomeRequest; public event UUIDNameRequest OnTeleportHomeRequest;
public event ScriptAnswer OnScriptAnswer; public event ScriptAnswer OnScriptAnswer;
public event AgentSit OnUndo; public event AgentSit OnUndo;
public event AgentSit OnRedo;
public event LandUndo OnLandUndo;
public event ForceReleaseControls OnForceReleaseControls; public event ForceReleaseControls OnForceReleaseControls;
public event GodLandStatRequest OnLandStatRequest; public event GodLandStatRequest OnLandStatRequest;
public event DetailedEstateDataRequest OnDetailedEstateDataRequest; public event DetailedEstateDataRequest OnDetailedEstateDataRequest;

View File

@ -343,6 +343,8 @@ namespace OpenSim.Client.Sirikata.ClientStack
public event UUIDNameRequest OnTeleportHomeRequest; public event UUIDNameRequest OnTeleportHomeRequest;
public event ScriptAnswer OnScriptAnswer; public event ScriptAnswer OnScriptAnswer;
public event AgentSit OnUndo; public event AgentSit OnUndo;
public event AgentSit OnRedo;
public event LandUndo OnLandUndo;
public event ForceReleaseControls OnForceReleaseControls; public event ForceReleaseControls OnForceReleaseControls;
public event GodLandStatRequest OnLandStatRequest; public event GodLandStatRequest OnLandStatRequest;
public event DetailedEstateDataRequest OnDetailedEstateDataRequest; public event DetailedEstateDataRequest OnDetailedEstateDataRequest;

View File

@ -347,6 +347,8 @@ namespace OpenSim.Client.VWoHTTP.ClientStack
public event UUIDNameRequest OnTeleportHomeRequest = delegate { }; public event UUIDNameRequest OnTeleportHomeRequest = delegate { };
public event ScriptAnswer OnScriptAnswer = delegate { }; public event ScriptAnswer OnScriptAnswer = delegate { };
public event AgentSit OnUndo = delegate { }; public event AgentSit OnUndo = delegate { };
public event AgentSit OnRedo = delegate { };
public event LandUndo OnLandUndo = delegate { };
public event ForceReleaseControls OnForceReleaseControls = delegate { }; public event ForceReleaseControls OnForceReleaseControls = delegate { };
public event GodLandStatRequest OnLandStatRequest = delegate { }; public event GodLandStatRequest OnLandStatRequest = delegate { };
public event DetailedEstateDataRequest OnDetailedEstateDataRequest = delegate { }; public event DetailedEstateDataRequest OnDetailedEstateDataRequest = delegate { };

View File

@ -622,11 +622,6 @@ namespace OpenSim.Data.MySQL
return false; return false;
} }
/// <summary>
/// Appearance
/// TODO: stubs for now to get us to a compiling state gently
/// override
/// </summary>
public override AvatarAppearance GetUserAppearance(UUID user) public override AvatarAppearance GetUserAppearance(UUID user)
{ {
try try

View File

@ -617,18 +617,42 @@ namespace OpenSim.Data.SQLite
{ {
lock (ds) lock (ds)
{ {
using (SqliteCommand cmd = new SqliteCommand("delete from land where UUID=:UUID", m_conn)) // Can't use blanket SQL statements when using SqlAdapters unless you re-read the data into the adapter
// after you're done.
// replaced below code with the SqliteAdapter version.
//using (SqliteCommand cmd = new SqliteCommand("delete from land where UUID=:UUID", m_conn))
//{
// cmd.Parameters.Add(new SqliteParameter(":UUID", globalID.ToString()));
// cmd.ExecuteNonQuery();
//}
//using (SqliteCommand cmd = new SqliteCommand("delete from landaccesslist where LandUUID=:UUID", m_conn))
//{
// cmd.Parameters.Add(new SqliteParameter(":UUID", globalID.ToString()));
// cmd.ExecuteNonQuery();
//}
DataTable land = ds.Tables["land"];
DataTable landaccesslist = ds.Tables["landaccesslist"];
DataRow landRow = land.Rows.Find(globalID.ToString());
if (landRow != null)
{ {
cmd.Parameters.Add(new SqliteParameter(":UUID", globalID.ToString())); land.Rows.Remove(landRow);
cmd.ExecuteNonQuery(); }
List<DataRow> rowsToDelete = new List<DataRow>();
foreach (DataRow rowToCheck in landaccesslist.Rows)
{
if (rowToCheck["LandUUID"].ToString() == globalID.ToString())
rowsToDelete.Add(rowToCheck);
}
for (int iter = 0; iter < rowsToDelete.Count; iter++)
{
landaccesslist.Rows.Remove(rowsToDelete[iter]);
} }
using (SqliteCommand cmd = new SqliteCommand("delete from landaccesslist where LandUUID=:UUID", m_conn))
{
cmd.Parameters.Add(new SqliteParameter(":UUID", globalID.ToString()));
cmd.ExecuteNonQuery();
}
} }
Commit();
} }
/// <summary> /// <summary>
@ -655,12 +679,27 @@ namespace OpenSim.Data.SQLite
} }
// I know this caused someone issues before, but OpenSim is unusable if we leave this stuff around // I know this caused someone issues before, but OpenSim is unusable if we leave this stuff around
using (SqliteCommand cmd = new SqliteCommand("delete from landaccesslist where LandUUID=:LandUUID", m_conn)) //using (SqliteCommand cmd = new SqliteCommand("delete from landaccesslist where LandUUID=:LandUUID", m_conn))
{ //{
cmd.Parameters.Add(new SqliteParameter(":LandUUID", parcel.LandData.GlobalID.ToString())); // cmd.Parameters.Add(new SqliteParameter(":LandUUID", parcel.LandData.GlobalID.ToString()));
cmd.ExecuteNonQuery(); // cmd.ExecuteNonQuery();
}
// }
// This is the slower.. but more appropriate thing to do
// We can't modify the table with direct queries before calling Commit() and re-filling them.
List<DataRow> rowsToDelete = new List<DataRow>();
foreach (DataRow rowToCheck in landaccesslist.Rows)
{
if (rowToCheck["LandUUID"].ToString() == parcel.LandData.GlobalID.ToString())
rowsToDelete.Add(rowToCheck);
}
for (int iter = 0; iter < rowsToDelete.Count; iter++)
{
landaccesslist.Rows.Remove(rowsToDelete[iter]);
}
rowsToDelete.Clear();
foreach (ParcelManager.ParcelAccessEntry entry in parcel.LandData.ParcelAccessList) foreach (ParcelManager.ParcelAccessEntry entry in parcel.LandData.ParcelAccessList)
{ {
DataRow newAccessRow = landaccesslist.NewRow(); DataRow newAccessRow = landaccesslist.NewRow();
@ -1711,7 +1750,7 @@ namespace OpenSim.Data.SQLite
row["terrain_raise_limit"] = settings.TerrainRaiseLimit; row["terrain_raise_limit"] = settings.TerrainRaiseLimit;
row["terrain_lower_limit"] = settings.TerrainLowerLimit; row["terrain_lower_limit"] = settings.TerrainLowerLimit;
row["use_estate_sun"] = settings.UseEstateSun; row["use_estate_sun"] = settings.UseEstateSun;
row["sandbox"] = settings.Sandbox; row["Sandbox"] = settings.Sandbox; // database uses upper case S for sandbox
row["sunvectorx"] = settings.SunVector.X; row["sunvectorx"] = settings.SunVector.X;
row["sunvectory"] = settings.SunVector.Y; row["sunvectory"] = settings.SunVector.Y;
row["sunvectorz"] = settings.SunVector.Z; row["sunvectorz"] = settings.SunVector.Z;
@ -1813,6 +1852,7 @@ namespace OpenSim.Data.SQLite
/// <param name="regionUUID"></param> /// <param name="regionUUID"></param>
private void addPrim(SceneObjectPart prim, UUID sceneGroupID, UUID regionUUID) private void addPrim(SceneObjectPart prim, UUID sceneGroupID, UUID regionUUID)
{ {
DataTable prims = ds.Tables["prims"]; DataTable prims = ds.Tables["prims"];
DataTable shapes = ds.Tables["primshapes"]; DataTable shapes = ds.Tables["primshapes"];
@ -1961,6 +2001,40 @@ namespace OpenSim.Data.SQLite
return cmd; return cmd;
} }
/// <summary>
/// create an update command
/// </summary>
/// <param name="table">table name</param>
/// <param name="pk"></param>
/// <param name="dt"></param>
/// <returns>the created command</returns>
private static SqliteCommand createUpdateCommand(string table, string pk1, string pk2, DataTable dt)
{
string sql = "update " + table + " set ";
string subsql = String.Empty;
foreach (DataColumn col in dt.Columns)
{
if (subsql.Length > 0)
{
// a map function would rock so much here
subsql += ", ";
}
subsql += col.ColumnName + "= :" + col.ColumnName;
}
sql += subsql;
sql += " where " + pk1 + " and " + pk2;
SqliteCommand cmd = new SqliteCommand(sql);
// this provides the binding for all our parameters, so
// much less code than it used to be
foreach (DataColumn col in dt.Columns)
{
cmd.Parameters.Add(createSqliteParameter(col.ColumnName, col.DataType));
}
return cmd;
}
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>
@ -2079,6 +2153,11 @@ namespace OpenSim.Data.SQLite
da.UpdateCommand = createUpdateCommand("land", "UUID=:UUID", ds.Tables["land"]); da.UpdateCommand = createUpdateCommand("land", "UUID=:UUID", ds.Tables["land"]);
da.UpdateCommand.Connection = conn; da.UpdateCommand.Connection = conn;
SqliteCommand delete = new SqliteCommand("delete from land where UUID=:UUID");
delete.Parameters.Add(createSqliteParameter("UUID", typeof(String)));
da.DeleteCommand = delete;
da.DeleteCommand.Connection = conn;
} }
/// <summary> /// <summary>
@ -2090,6 +2169,16 @@ namespace OpenSim.Data.SQLite
{ {
da.InsertCommand = createInsertCommand("landaccesslist", ds.Tables["landaccesslist"]); da.InsertCommand = createInsertCommand("landaccesslist", ds.Tables["landaccesslist"]);
da.InsertCommand.Connection = conn; da.InsertCommand.Connection = conn;
da.UpdateCommand = createUpdateCommand("landaccesslist", "LandUUID=:landUUID", "AccessUUID=:AccessUUID", ds.Tables["landaccesslist"]);
da.UpdateCommand.Connection = conn;
SqliteCommand delete = new SqliteCommand("delete from landaccesslist where LandUUID= :LandUUID and AccessUUID= :AccessUUID");
delete.Parameters.Add(createSqliteParameter("LandUUID", typeof(String)));
delete.Parameters.Add(createSqliteParameter("AccessUUID", typeof(String)));
da.DeleteCommand = delete;
da.DeleteCommand.Connection = conn;
} }
private void setupRegionSettingsCommands(SqliteDataAdapter da, SqliteConnection conn) private void setupRegionSettingsCommands(SqliteDataAdapter da, SqliteConnection conn)

View File

@ -71,8 +71,6 @@ namespace OpenSim.Framework
public readonly static int VISUALPARAM_COUNT = 218; public readonly static int VISUALPARAM_COUNT = 218;
protected UUID m_owner; protected UUID m_owner;
public virtual UUID Owner public virtual UUID Owner
@ -346,11 +344,7 @@ namespace OpenSim.Framework
} }
*/ */
public AvatarAppearance() : this(UUID.Zero) {}
public AvatarAppearance()
: this(UUID.Zero)
{
}
public AvatarAppearance(UUID owner) public AvatarAppearance(UUID owner)
{ {
@ -368,10 +362,8 @@ namespace OpenSim.Framework
SetDefaultParams(m_visualparams); SetDefaultParams(m_visualparams);
SetDefaultWearables(); SetDefaultWearables();
m_texture = GetDefaultTexture(); m_texture = GetDefaultTexture();
} }
public AvatarAppearance(UUID avatarID, AvatarWearable[] wearables, byte[] visualParams) public AvatarAppearance(UUID avatarID, AvatarWearable[] wearables, byte[] visualParams)
{ {
m_owner = avatarID; m_owner = avatarID;
@ -398,11 +390,12 @@ namespace OpenSim.Framework
+ 0.08f * (float)m_visualparams[(int)VPElement.SHOES_PLATFORM_HEIGHT] / 255.0f // Shoe platform height + 0.08f * (float)m_visualparams[(int)VPElement.SHOES_PLATFORM_HEIGHT] / 255.0f // Shoe platform height
+ 0.07f * (float)m_visualparams[(int)VPElement.SHOES_HEEL_HEIGHT] / 255.0f // Shoe heel height + 0.07f * (float)m_visualparams[(int)VPElement.SHOES_HEEL_HEIGHT] / 255.0f // Shoe heel height
+ 0.076f * (float)m_visualparams[(int)VPElement.SHAPE_NECK_LENGTH] / 255.0f; // Neck length + 0.076f * (float)m_visualparams[(int)VPElement.SHAPE_NECK_LENGTH] / 255.0f; // Neck length
m_hipOffset = (0.615385f // Half of avatar m_hipOffset = (((1.23077f // Half of avatar
+ 0.516945f * (float)m_visualparams[(int)VPElement.SHAPE_HEIGHT] / 255.0f // Body height
+ 0.3836f * (float)m_visualparams[(int)VPElement.SHAPE_LEG_LENGTH] / 255.0f // Leg length
+ 0.08f * (float)m_visualparams[(int)VPElement.SHOES_PLATFORM_HEIGHT] / 255.0f // Shoe platform height + 0.08f * (float)m_visualparams[(int)VPElement.SHOES_PLATFORM_HEIGHT] / 255.0f // Shoe platform height
+ 0.07f * (float)m_visualparams[(int)VPElement.SHOES_HEEL_HEIGHT] / 255.0f // Shoe heel height + 0.07f * (float)m_visualparams[(int)VPElement.SHOES_HEEL_HEIGHT] / 255.0f // Shoe heel height
+ 0.3836f * (float)m_visualparams[(int)VPElement.SHAPE_LEG_LENGTH] / 255.0f // Leg length ) / 2) - m_avatarHeight / 2) * 0.31f - 0.0425f;
- m_avatarHeight / 2) * 0.3f - 0.04f;

View File

@ -33,7 +33,7 @@ namespace OpenSim.Framework
{ {
public class Culture public class Culture
{ {
private static readonly CultureInfo m_cultureInfo = new CultureInfo("en-US", true); private static readonly CultureInfo m_cultureInfo = new CultureInfo("en-US", false);
public static NumberFormatInfo NumberFormatInfo public static NumberFormatInfo NumberFormatInfo
{ {

View File

@ -152,6 +152,8 @@ namespace OpenSim.Framework
public delegate void AgentSit(IClientAPI remoteClient, UUID agentID); public delegate void AgentSit(IClientAPI remoteClient, UUID agentID);
public delegate void LandUndo(IClientAPI remoteClient);
public delegate void AvatarPickerRequest(IClientAPI remoteClient, UUID agentdata, UUID queryID, string UserQuery); public delegate void AvatarPickerRequest(IClientAPI remoteClient, UUID agentdata, UUID queryID, string UserQuery);
public delegate void GrabObject( public delegate void GrabObject(
@ -421,7 +423,7 @@ namespace OpenSim.Framework
public delegate void DeclineCallingCard(IClientAPI remoteClient, UUID transactionID); public delegate void DeclineCallingCard(IClientAPI remoteClient, UUID transactionID);
public delegate void SoundTrigger( public delegate void SoundTrigger(
UUID soundId, UUID ownerid, UUID objid, UUID parentid, double Gain, Vector3 Position, UInt64 Handle); UUID soundId, UUID ownerid, UUID objid, UUID parentid, double Gain, Vector3 Position, UInt64 Handle, float radius);
public delegate void StartLure(byte lureType, string message, UUID targetID, IClientAPI client); public delegate void StartLure(byte lureType, string message, UUID targetID, IClientAPI client);
public delegate void TeleportLureRequest(UUID lureID, uint teleportFlags, IClientAPI client); public delegate void TeleportLureRequest(UUID lureID, uint teleportFlags, IClientAPI client);
@ -993,6 +995,8 @@ namespace OpenSim.Framework
event ScriptAnswer OnScriptAnswer; event ScriptAnswer OnScriptAnswer;
event AgentSit OnUndo; event AgentSit OnUndo;
event AgentSit OnRedo;
event LandUndo OnLandUndo;
event ForceReleaseControls OnForceReleaseControls; event ForceReleaseControls OnForceReleaseControls;
event GodLandStatRequest OnLandStatRequest; event GodLandStatRequest OnLandStatRequest;

View File

@ -358,6 +358,32 @@ namespace OpenSim.Framework
} }
} }
private int[] _mediaSize = new int[2];
public int[] MediaSize
{
get
{
return _mediaSize;
}
set
{
_mediaSize = value;
}
}
private string _mediaType = "";
public string MediaType
{
get
{
return _mediaType;
}
set
{
_mediaType = value;
}
}
/// <summary> /// <summary>
/// URL to the shoutcast music stream to play on the parcel /// URL to the shoutcast music stream to play on the parcel
/// </summary> /// </summary>

View File

@ -109,7 +109,7 @@ namespace OpenSim.Framework.Serialization.External
settings.AgentLimit = int.Parse(xtr.ReadElementContentAsString()); settings.AgentLimit = int.Parse(xtr.ReadElementContentAsString());
break; break;
case "ObjectBonus": case "ObjectBonus":
settings.ObjectBonus = double.Parse(xtr.ReadElementContentAsString()); settings.ObjectBonus = double.Parse(xtr.ReadElementContentAsString(), Culture.NumberFormatInfo);
break; break;
} }
} }
@ -134,28 +134,28 @@ namespace OpenSim.Framework.Serialization.External
settings.TerrainTexture4 = UUID.Parse(xtr.ReadElementContentAsString()); settings.TerrainTexture4 = UUID.Parse(xtr.ReadElementContentAsString());
break; break;
case "ElevationLowSW": case "ElevationLowSW":
settings.Elevation1SW = double.Parse(xtr.ReadElementContentAsString()); settings.Elevation1SW = double.Parse(xtr.ReadElementContentAsString(), Culture.NumberFormatInfo);
break; break;
case "ElevationLowNW": case "ElevationLowNW":
settings.Elevation1NW = double.Parse(xtr.ReadElementContentAsString()); settings.Elevation1NW = double.Parse(xtr.ReadElementContentAsString(), Culture.NumberFormatInfo);
break; break;
case "ElevationLowSE": case "ElevationLowSE":
settings.Elevation1SE = double.Parse(xtr.ReadElementContentAsString()); settings.Elevation1SE = double.Parse(xtr.ReadElementContentAsString(), Culture.NumberFormatInfo);
break; break;
case "ElevationLowNE": case "ElevationLowNE":
settings.Elevation1NE = double.Parse(xtr.ReadElementContentAsString()); settings.Elevation1NE = double.Parse(xtr.ReadElementContentAsString(), Culture.NumberFormatInfo);
break; break;
case "ElevationHighSW": case "ElevationHighSW":
settings.Elevation2SW = double.Parse(xtr.ReadElementContentAsString()); settings.Elevation2SW = double.Parse(xtr.ReadElementContentAsString(), Culture.NumberFormatInfo);
break; break;
case "ElevationHighNW": case "ElevationHighNW":
settings.Elevation2NW = double.Parse(xtr.ReadElementContentAsString()); settings.Elevation2NW = double.Parse(xtr.ReadElementContentAsString(), Culture.NumberFormatInfo);
break; break;
case "ElevationHighSE": case "ElevationHighSE":
settings.Elevation2SE = double.Parse(xtr.ReadElementContentAsString()); settings.Elevation2SE = double.Parse(xtr.ReadElementContentAsString(), Culture.NumberFormatInfo);
break; break;
case "ElevationHighNE": case "ElevationHighNE":
settings.Elevation2NE = double.Parse(xtr.ReadElementContentAsString()); settings.Elevation2NE = double.Parse(xtr.ReadElementContentAsString(), Culture.NumberFormatInfo);
break; break;
} }
} }
@ -168,13 +168,13 @@ namespace OpenSim.Framework.Serialization.External
switch (xtr.Name) switch (xtr.Name)
{ {
case "WaterHeight": case "WaterHeight":
settings.WaterHeight = double.Parse(xtr.ReadElementContentAsString()); settings.WaterHeight = double.Parse(xtr.ReadElementContentAsString(), Culture.NumberFormatInfo);
break; break;
case "TerrainRaiseLimit": case "TerrainRaiseLimit":
settings.TerrainRaiseLimit = double.Parse(xtr.ReadElementContentAsString()); settings.TerrainRaiseLimit = double.Parse(xtr.ReadElementContentAsString(), Culture.NumberFormatInfo);
break; break;
case "TerrainLowerLimit": case "TerrainLowerLimit":
settings.TerrainLowerLimit = double.Parse(xtr.ReadElementContentAsString()); settings.TerrainLowerLimit = double.Parse(xtr.ReadElementContentAsString(), Culture.NumberFormatInfo);
break; break;
case "UseEstateSun": case "UseEstateSun":
settings.UseEstateSun = bool.Parse(xtr.ReadElementContentAsString()); settings.UseEstateSun = bool.Parse(xtr.ReadElementContentAsString());

View File

@ -1055,14 +1055,14 @@ namespace OpenSim
} }
if (cmdparams.Length > 4) if (cmdparams.Length > 4)
{ {
loadOffset.X = (float) Convert.ToDecimal(cmdparams[4]); loadOffset.X = (float)Convert.ToDecimal(cmdparams[4], Culture.NumberFormatInfo);
if (cmdparams.Length > 5) if (cmdparams.Length > 5)
{ {
loadOffset.Y = (float) Convert.ToDecimal(cmdparams[5]); loadOffset.Y = (float)Convert.ToDecimal(cmdparams[5], Culture.NumberFormatInfo);
} }
if (cmdparams.Length > 6) if (cmdparams.Length > 6)
{ {
loadOffset.Z = (float) Convert.ToDecimal(cmdparams[6]); loadOffset.Z = (float)Convert.ToDecimal(cmdparams[6], Culture.NumberFormatInfo);
} }
MainConsole.Instance.Output(String.Format("loadOffsets <X,Y,Z> = <{0},{1},{2}>",loadOffset.X,loadOffset.Y,loadOffset.Z)); MainConsole.Instance.Output(String.Format("loadOffsets <X,Y,Z> = <{0},{1},{2}>",loadOffset.X,loadOffset.Y,loadOffset.Z));
} }

View File

@ -232,6 +232,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
public event ObjectBuy OnObjectBuy; public event ObjectBuy OnObjectBuy;
public event BuyObjectInventory OnBuyObjectInventory; public event BuyObjectInventory OnBuyObjectInventory;
public event AgentSit OnUndo; public event AgentSit OnUndo;
public event AgentSit OnRedo;
public event LandUndo OnLandUndo;
public event ForceReleaseControls OnForceReleaseControls; public event ForceReleaseControls OnForceReleaseControls;
public event GodLandStatRequest OnLandStatRequest; public event GodLandStatRequest OnLandStatRequest;
public event RequestObjectPropertiesFamily OnObjectGroupRequest; public event RequestObjectPropertiesFamily OnObjectGroupRequest;
@ -3307,9 +3309,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP
awb.ItemID = wearables[i].ItemID; awb.ItemID = wearables[i].ItemID;
aw.WearableData[i] = awb; aw.WearableData[i] = awb;
// m_log.DebugFormat( // m_log.DebugFormat(
// "[APPEARANCE]: Sending wearable item/asset {0} {1} (index {2}) for {3}", // "[APPEARANCE]: Sending wearable item/asset {0} {1} (index {2}) for {3}",
// awb.ItemID, awb.AssetID, i, Name); // awb.ItemID, awb.AssetID, i, Name);
} }
OutPacket(aw, ThrottleOutPacketType.Task); OutPacket(aw, ThrottleOutPacketType.Task);
@ -4668,6 +4670,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
AddLocalPacketHandler(PacketType.ObjectName, HandleObjectName, false); AddLocalPacketHandler(PacketType.ObjectName, HandleObjectName, false);
AddLocalPacketHandler(PacketType.ObjectPermissions, HandleObjectPermissions, false); AddLocalPacketHandler(PacketType.ObjectPermissions, HandleObjectPermissions, false);
AddLocalPacketHandler(PacketType.Undo, HandleUndo, false); AddLocalPacketHandler(PacketType.Undo, HandleUndo, false);
AddLocalPacketHandler(PacketType.UndoLand, HandleLandUndo, false);
AddLocalPacketHandler(PacketType.Redo, HandleRedo, false);
AddLocalPacketHandler(PacketType.ObjectDuplicateOnRay, HandleObjectDuplicateOnRay); AddLocalPacketHandler(PacketType.ObjectDuplicateOnRay, HandleObjectDuplicateOnRay);
AddLocalPacketHandler(PacketType.RequestObjectPropertiesFamily, HandleRequestObjectPropertiesFamily, false); AddLocalPacketHandler(PacketType.RequestObjectPropertiesFamily, HandleRequestObjectPropertiesFamily, false);
AddLocalPacketHandler(PacketType.ObjectIncludeInSearch, HandleObjectIncludeInSearch); AddLocalPacketHandler(PacketType.ObjectIncludeInSearch, HandleObjectIncludeInSearch);
@ -5838,7 +5842,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
handlerSoundTrigger(soundTriggerPacket.SoundData.SoundID, soundTriggerPacket.SoundData.OwnerID, handlerSoundTrigger(soundTriggerPacket.SoundData.SoundID, soundTriggerPacket.SoundData.OwnerID,
soundTriggerPacket.SoundData.ObjectID, soundTriggerPacket.SoundData.ParentID, soundTriggerPacket.SoundData.ObjectID, soundTriggerPacket.SoundData.ParentID,
soundTriggerPacket.SoundData.Gain, soundTriggerPacket.SoundData.Position, soundTriggerPacket.SoundData.Gain, soundTriggerPacket.SoundData.Position,
soundTriggerPacket.SoundData.Handle); soundTriggerPacket.SoundData.Handle, 0);
} }
return true; return true;
@ -6736,6 +6740,56 @@ namespace OpenSim.Region.ClientStack.LindenUDP
return true; return true;
} }
private bool HandleLandUndo(IClientAPI sender, Packet Pack)
{
UndoLandPacket undolanditem = (UndoLandPacket)Pack;
#region Packet Session and User Check
if (m_checkPackets)
{
if (undolanditem.AgentData.SessionID != SessionId ||
undolanditem.AgentData.AgentID != AgentId)
return true;
}
#endregion
LandUndo handlerOnUndo = OnLandUndo;
if (handlerOnUndo != null)
{
handlerOnUndo(this);
}
return true;
}
private bool HandleRedo(IClientAPI sender, Packet Pack)
{
RedoPacket redoitem = (RedoPacket)Pack;
#region Packet Session and User Check
if (m_checkPackets)
{
if (redoitem.AgentData.SessionID != SessionId ||
redoitem.AgentData.AgentID != AgentId)
return true;
}
#endregion
if (redoitem.ObjectData.Length > 0)
{
for (int i = 0; i < redoitem.ObjectData.Length; i++)
{
UUID objiD = redoitem.ObjectData[i].ObjectID;
AgentSit handlerOnRedo = OnRedo;
if (handlerOnRedo != null)
{
handlerOnRedo(this, objiD);
}
}
}
return true;
}
private bool HandleObjectDuplicateOnRay(IClientAPI sender, Packet Pack) private bool HandleObjectDuplicateOnRay(IClientAPI sender, Packet Pack)
{ {
ObjectDuplicateOnRayPacket dupeOnRay = (ObjectDuplicateOnRayPacket)Pack; ObjectDuplicateOnRayPacket dupeOnRay = (ObjectDuplicateOnRayPacket)Pack;
@ -8311,8 +8365,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
{ {
OnSetEstateFlagsRequest(convertParamStringToBool(messagePacket.ParamList[0].Parameter), convertParamStringToBool(messagePacket.ParamList[1].Parameter), OnSetEstateFlagsRequest(convertParamStringToBool(messagePacket.ParamList[0].Parameter), convertParamStringToBool(messagePacket.ParamList[1].Parameter),
convertParamStringToBool(messagePacket.ParamList[2].Parameter), !convertParamStringToBool(messagePacket.ParamList[3].Parameter), convertParamStringToBool(messagePacket.ParamList[2].Parameter), !convertParamStringToBool(messagePacket.ParamList[3].Parameter),
Convert.ToInt16(Convert.ToDecimal(Utils.BytesToString(messagePacket.ParamList[4].Parameter))), Convert.ToInt16(Convert.ToDecimal(Utils.BytesToString(messagePacket.ParamList[4].Parameter), Culture.NumberFormatInfo)),
(float)Convert.ToDecimal(Utils.BytesToString(messagePacket.ParamList[5].Parameter)), (float)Convert.ToDecimal(Utils.BytesToString(messagePacket.ParamList[5].Parameter), Culture.NumberFormatInfo),
Convert.ToInt16(Utils.BytesToString(messagePacket.ParamList[6].Parameter)), Convert.ToInt16(Utils.BytesToString(messagePacket.ParamList[6].Parameter)),
convertParamStringToBool(messagePacket.ParamList[7].Parameter), convertParamStringToBool(messagePacket.ParamList[8].Parameter)); convertParamStringToBool(messagePacket.ParamList[7].Parameter), convertParamStringToBool(messagePacket.ParamList[8].Parameter));
} }
@ -8360,8 +8414,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
if (splitField.Length == 3) if (splitField.Length == 3)
{ {
Int16 corner = Convert.ToInt16(splitField[0]); Int16 corner = Convert.ToInt16(splitField[0]);
float lowValue = (float)Convert.ToDecimal(splitField[1]); float lowValue = (float)Convert.ToDecimal(splitField[1], Culture.NumberFormatInfo);
float highValue = (float)Convert.ToDecimal(splitField[2]); float highValue = (float)Convert.ToDecimal(splitField[2], Culture.NumberFormatInfo);
OnSetEstateTerrainTextureHeights(this, corner, lowValue, highValue); OnSetEstateTerrainTextureHeights(this, corner, lowValue, highValue);
} }
@ -8384,19 +8438,19 @@ namespace OpenSim.Region.ClientStack.LindenUDP
{ {
string tmp = Utils.BytesToString(messagePacket.ParamList[0].Parameter); string tmp = Utils.BytesToString(messagePacket.ParamList[0].Parameter);
if (!tmp.Contains(".")) tmp += ".00"; if (!tmp.Contains(".")) tmp += ".00";
float WaterHeight = (float)Convert.ToDecimal(tmp); float WaterHeight = (float)Convert.ToDecimal(tmp, Culture.NumberFormatInfo);
tmp = Utils.BytesToString(messagePacket.ParamList[1].Parameter); tmp = Utils.BytesToString(messagePacket.ParamList[1].Parameter);
if (!tmp.Contains(".")) tmp += ".00"; if (!tmp.Contains(".")) tmp += ".00";
float TerrainRaiseLimit = (float)Convert.ToDecimal(tmp); float TerrainRaiseLimit = (float)Convert.ToDecimal(tmp, Culture.NumberFormatInfo);
tmp = Utils.BytesToString(messagePacket.ParamList[2].Parameter); tmp = Utils.BytesToString(messagePacket.ParamList[2].Parameter);
if (!tmp.Contains(".")) tmp += ".00"; if (!tmp.Contains(".")) tmp += ".00";
float TerrainLowerLimit = (float)Convert.ToDecimal(tmp); float TerrainLowerLimit = (float)Convert.ToDecimal(tmp, Culture.NumberFormatInfo);
bool UseEstateSun = convertParamStringToBool(messagePacket.ParamList[3].Parameter); bool UseEstateSun = convertParamStringToBool(messagePacket.ParamList[3].Parameter);
bool UseFixedSun = convertParamStringToBool(messagePacket.ParamList[4].Parameter); bool UseFixedSun = convertParamStringToBool(messagePacket.ParamList[4].Parameter);
float SunHour = (float)Convert.ToDecimal(Utils.BytesToString(messagePacket.ParamList[5].Parameter)); float SunHour = (float)Convert.ToDecimal(Utils.BytesToString(messagePacket.ParamList[5].Parameter), Culture.NumberFormatInfo);
bool UseGlobal = convertParamStringToBool(messagePacket.ParamList[6].Parameter); bool UseGlobal = convertParamStringToBool(messagePacket.ParamList[6].Parameter);
bool EstateFixedSun = convertParamStringToBool(messagePacket.ParamList[7].Parameter); bool EstateFixedSun = convertParamStringToBool(messagePacket.ParamList[7].Parameter);
float EstateSunHour = (float)Convert.ToDecimal(Utils.BytesToString(messagePacket.ParamList[8].Parameter)); float EstateSunHour = (float)Convert.ToDecimal(Utils.BytesToString(messagePacket.ParamList[8].Parameter), Culture.NumberFormatInfo);
OnSetRegionTerrainSettings(WaterHeight, TerrainRaiseLimit, TerrainLowerLimit, UseEstateSun, UseFixedSun, SunHour, UseGlobal, EstateFixedSun, EstateSunHour); OnSetRegionTerrainSettings(WaterHeight, TerrainRaiseLimit, TerrainLowerLimit, UseEstateSun, UseFixedSun, SunHour, UseGlobal, EstateFixedSun, EstateSunHour);
@ -13928,8 +13982,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
{ {
OnSetEstateFlagsRequest(convertParamStringToBool(messagePacket.ParamList[0].Parameter), convertParamStringToBool(messagePacket.ParamList[1].Parameter), OnSetEstateFlagsRequest(convertParamStringToBool(messagePacket.ParamList[0].Parameter), convertParamStringToBool(messagePacket.ParamList[1].Parameter),
convertParamStringToBool(messagePacket.ParamList[2].Parameter), !convertParamStringToBool(messagePacket.ParamList[3].Parameter), convertParamStringToBool(messagePacket.ParamList[2].Parameter), !convertParamStringToBool(messagePacket.ParamList[3].Parameter),
Convert.ToInt16(Convert.ToDecimal(Utils.BytesToString(messagePacket.ParamList[4].Parameter))), Convert.ToInt16(Convert.ToDecimal(Utils.BytesToString(messagePacket.ParamList[4].Parameter), Culture.NumberFormatInfo)),
(float)Convert.ToDecimal(Utils.BytesToString(messagePacket.ParamList[5].Parameter)), (float)Convert.ToDecimal(Utils.BytesToString(messagePacket.ParamList[5].Parameter), Culture.NumberFormatInfo),
Convert.ToInt16(Utils.BytesToString(messagePacket.ParamList[6].Parameter)), Convert.ToInt16(Utils.BytesToString(messagePacket.ParamList[6].Parameter)),
convertParamStringToBool(messagePacket.ParamList[7].Parameter), convertParamStringToBool(messagePacket.ParamList[8].Parameter)); convertParamStringToBool(messagePacket.ParamList[7].Parameter), convertParamStringToBool(messagePacket.ParamList[8].Parameter));
} }
@ -13977,8 +14031,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
if (splitField.Length == 3) if (splitField.Length == 3)
{ {
Int16 corner = Convert.ToInt16(splitField[0]); Int16 corner = Convert.ToInt16(splitField[0]);
float lowValue = (float)Convert.ToDecimal(splitField[1]); float lowValue = (float)Convert.ToDecimal(splitField[1], Culture.NumberFormatInfo);
float highValue = (float)Convert.ToDecimal(splitField[2]); float highValue = (float)Convert.ToDecimal(splitField[2], Culture.NumberFormatInfo);
OnSetEstateTerrainTextureHeights(this, corner, lowValue, highValue); OnSetEstateTerrainTextureHeights(this, corner, lowValue, highValue);
} }
@ -14001,19 +14055,19 @@ namespace OpenSim.Region.ClientStack.LindenUDP
{ {
string tmp = Utils.BytesToString(messagePacket.ParamList[0].Parameter); string tmp = Utils.BytesToString(messagePacket.ParamList[0].Parameter);
if (!tmp.Contains(".")) tmp += ".00"; if (!tmp.Contains(".")) tmp += ".00";
float WaterHeight = (float)Convert.ToDecimal(tmp); float WaterHeight = (float)Convert.ToDecimal(tmp, Culture.NumberFormatInfo);
tmp = Utils.BytesToString(messagePacket.ParamList[1].Parameter); tmp = Utils.BytesToString(messagePacket.ParamList[1].Parameter);
if (!tmp.Contains(".")) tmp += ".00"; if (!tmp.Contains(".")) tmp += ".00";
float TerrainRaiseLimit = (float)Convert.ToDecimal(tmp); float TerrainRaiseLimit = (float)Convert.ToDecimal(tmp, Culture.NumberFormatInfo);
tmp = Utils.BytesToString(messagePacket.ParamList[2].Parameter); tmp = Utils.BytesToString(messagePacket.ParamList[2].Parameter);
if (!tmp.Contains(".")) tmp += ".00"; if (!tmp.Contains(".")) tmp += ".00";
float TerrainLowerLimit = (float)Convert.ToDecimal(tmp); float TerrainLowerLimit = (float)Convert.ToDecimal(tmp, Culture.NumberFormatInfo);
bool UseEstateSun = convertParamStringToBool(messagePacket.ParamList[3].Parameter); bool UseEstateSun = convertParamStringToBool(messagePacket.ParamList[3].Parameter);
bool UseFixedSun = convertParamStringToBool(messagePacket.ParamList[4].Parameter); bool UseFixedSun = convertParamStringToBool(messagePacket.ParamList[4].Parameter);
float SunHour = (float)Convert.ToDecimal(Utils.BytesToString(messagePacket.ParamList[5].Parameter)); float SunHour = (float)Convert.ToDecimal(Utils.BytesToString(messagePacket.ParamList[5].Parameter), Culture.NumberFormatInfo);
bool UseGlobal = convertParamStringToBool(messagePacket.ParamList[6].Parameter); bool UseGlobal = convertParamStringToBool(messagePacket.ParamList[6].Parameter);
bool EstateFixedSun = convertParamStringToBool(messagePacket.ParamList[7].Parameter); bool EstateFixedSun = convertParamStringToBool(messagePacket.ParamList[7].Parameter);
float EstateSunHour = (float)Convert.ToDecimal(Utils.BytesToString(messagePacket.ParamList[8].Parameter)); float EstateSunHour = (float)Convert.ToDecimal(Utils.BytesToString(messagePacket.ParamList[8].Parameter), Culture.NumberFormatInfo);
OnSetRegionTerrainSettings(WaterHeight, TerrainRaiseLimit, TerrainLowerLimit, UseEstateSun, UseFixedSun, SunHour, UseGlobal, EstateFixedSun, EstateSunHour); OnSetRegionTerrainSettings(WaterHeight, TerrainRaiseLimit, TerrainLowerLimit, UseEstateSun, UseFixedSun, SunHour, UseGlobal, EstateFixedSun, EstateSunHour);

View File

@ -1,226 +0,0 @@
/*
* Copyright (c) Contributors, http://opensimulator.org/
* See CONTRIBUTORS.TXT for a full list of copyright holders.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the OpenSimulator Project nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
//using System.Reflection;
//using log4net;
namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
{
/*
public class AgentAssetTransactionsManager
{
//private static readonly ILog m_log
// = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
/// <summary>
/// Each agent has its own singleton collection of transactions
/// </summary>
private Dictionary<UUID, AgentAssetTransactions> AgentTransactions =
new Dictionary<UUID, AgentAssetTransactions>();
/// <summary>
/// Should we dump uploaded assets to the filesystem?
/// </summary>
private bool m_dumpAssetsToFile;
public Scene MyScene;
public AgentAssetTransactionsManager(Scene scene, bool dumpAssetsToFile)
{
MyScene = scene;
m_dumpAssetsToFile = dumpAssetsToFile;
}
/// <summary>
/// Get the collection of asset transactions for the given user. If one does not already exist, it
/// is created.
/// </summary>
/// <param name="userID"></param>
/// <returns></returns>
private AgentAssetTransactions GetUserTransactions(UUID userID)
{
lock (AgentTransactions)
{
if (!AgentTransactions.ContainsKey(userID))
{
AgentAssetTransactions transactions = null;
//= new AgentAssetTransactions(userID, this, m_dumpAssetsToFile);
AgentTransactions.Add(userID, transactions);
}
return AgentTransactions[userID];
}
}
/// <summary>
/// Remove the given agent asset transactions. This should be called when a client is departing
/// from a scene (and hence won't be making any more transactions here).
/// </summary>
/// <param name="userID"></param>
public void RemoveAgentAssetTransactions(UUID userID)
{
// m_log.DebugFormat("Removing agent asset transactions structure for agent {0}", userID);
lock (AgentTransactions)
{
AgentTransactions.Remove(userID);
}
}
/// <summary>
/// Create an inventory item from data that has been received through a transaction.
///
/// This is called when new clothing or body parts are created. It may also be called in other
/// situations.
/// </summary>
/// <param name="remoteClient"></param>
/// <param name="transactionID"></param>
/// <param name="folderID"></param>
/// <param name="callbackID"></param>
/// <param name="description"></param>
/// <param name="name"></param>
/// <param name="invType"></param>
/// <param name="type"></param>
/// <param name="wearableType"></param>
/// <param name="nextOwnerMask"></param>
public void HandleItemCreationFromTransaction(IClientAPI remoteClient, UUID transactionID, UUID folderID,
uint callbackID, string description, string name, sbyte invType,
sbyte type, byte wearableType, uint nextOwnerMask)
{
// m_log.DebugFormat(
// "[TRANSACTIONS MANAGER] Called HandleItemCreationFromTransaction with item {0}", name);
AgentAssetTransactions transactions = GetUserTransactions(remoteClient.AgentId);
transactions.RequestCreateInventoryItem(
remoteClient, transactionID, folderID, callbackID, description,
name, invType, type, wearableType, nextOwnerMask);
}
/// <summary>
/// Update an inventory item with data that has been received through a transaction.
///
/// This is called when clothing or body parts are updated (for instance, with new textures or
/// colours). It may also be called in other situations.
/// </summary>
/// <param name="remoteClient"></param>
/// <param name="transactionID"></param>
/// <param name="item"></param>
public void HandleItemUpdateFromTransaction(IClientAPI remoteClient, UUID transactionID,
InventoryItemBase item)
{
// m_log.DebugFormat(
// "[TRANSACTIONS MANAGER] Called HandleItemUpdateFromTransaction with item {0}",
// item.Name);
AgentAssetTransactions transactions = GetUserTransactions(remoteClient.AgentId);
transactions.RequestUpdateInventoryItem(remoteClient, transactionID, item);
}
/// <summary>
/// Update a task inventory item with data that has been received through a transaction.
///
/// This is currently called when, for instance, a notecard in a prim is saved. The data is sent
/// up through a single AssetUploadRequest. A subsequent UpdateTaskInventory then references the transaction
/// and comes through this method.
/// </summary>
/// <param name="remoteClient"></param>
/// <param name="transactionID"></param>
/// <param name="item"></param>
public void HandleTaskItemUpdateFromTransaction(
IClientAPI remoteClient, SceneObjectPart part, UUID transactionID, TaskInventoryItem item)
{
// m_log.DebugFormat(
// "[TRANSACTIONS MANAGER] Called HandleTaskItemUpdateFromTransaction with item {0}",
// item.Name);
AgentAssetTransactions transactions = GetUserTransactions(remoteClient.AgentId);
transactions.RequestUpdateTaskInventoryItem(remoteClient, part, transactionID, item);
}
/// <summary>
/// Request that a client (agent) begin an asset transfer.
/// </summary>
/// <param name="remoteClient"></param>
/// <param name="assetID"></param>
/// <param name="transaction"></param>
/// <param name="type"></param>
/// <param name="data"></param></param>
/// <param name="tempFile"></param>
public void HandleUDPUploadRequest(IClientAPI remoteClient, UUID assetID, UUID transaction, sbyte type,
byte[] data, bool storeLocal, bool tempFile)
{
//m_log.Debug("HandleUDPUploadRequest - assetID: " + assetID.ToString() + " transaction: " + transaction.ToString() + " type: " + type.ToString() + " storelocal: " + storeLocal + " tempFile: " + tempFile);
if (((AssetType)type == AssetType.Texture ||
(AssetType)type == AssetType.Sound ||
(AssetType)type == AssetType.TextureTGA ||
(AssetType)type == AssetType.Animation) &&
tempFile == false)
{
Scene scene = (Scene)remoteClient.Scene;
IMoneyModule mm = scene.RequestModuleInterface<IMoneyModule>();
if (mm != null)
{
if (!mm.UploadCovered(remoteClient))
{
remoteClient.SendAgentAlertMessage("Unable to upload asset. Insufficient funds.", false);
return;
}
}
}
//m_log.Debug("asset upload of " + assetID);
AgentAssetTransactions transactions = GetUserTransactions(remoteClient.AgentId);
AssetXferUploader uploader = transactions.RequestXferUploader(transaction);
if (uploader != null)
{
uploader.Initialise(remoteClient, assetID, transaction, type, data, storeLocal, tempFile);
}
}
/// <summary>
/// Handle asset transfer data packets received in response to the asset upload request in
/// HandleUDPUploadRequest()
/// </summary>
/// <param name="remoteClient"></param>
/// <param name="xferID"></param>
/// <param name="packetID"></param>
/// <param name="data"></param>
public void HandleXfer(IClientAPI remoteClient, ulong xferID, uint packetID, byte[] data)
{
//m_log.Debug("xferID: " + xferID + " packetID: " + packetID + " data!");
AgentAssetTransactions transactions = GetUserTransactions(remoteClient.AgentId);
transactions.HandleXfer(xferID, packetID, data);
}
}
*/
}

View File

@ -27,6 +27,8 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Reflection;
using log4net;
using Nini.Config; using Nini.Config;
using OpenMetaverse; using OpenMetaverse;
using OpenSim.Framework; using OpenSim.Framework;
@ -37,6 +39,8 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
{ {
public class AssetTransactionModule : IRegionModule, IAgentAssetTransactions public class AssetTransactionModule : IRegionModule, IAgentAssetTransactions
{ {
// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
private readonly Dictionary<UUID, Scene> RegisteredScenes = new Dictionary<UUID, Scene>(); private readonly Dictionary<UUID, Scene> RegisteredScenes = new Dictionary<UUID, Scene>();
private bool m_dumpAssetsToFile = false; private bool m_dumpAssetsToFile = false;
private Scene m_scene = null; private Scene m_scene = null;
@ -226,7 +230,8 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
public void HandleUDPUploadRequest(IClientAPI remoteClient, UUID assetID, UUID transaction, sbyte type, public void HandleUDPUploadRequest(IClientAPI remoteClient, UUID assetID, UUID transaction, sbyte type,
byte[] data, bool storeLocal, bool tempFile) byte[] data, bool storeLocal, bool tempFile)
{ {
//m_log.Debug("HandleUDPUploadRequest - assetID: " + assetID.ToString() + " transaction: " + transaction.ToString() + " type: " + type.ToString() + " storelocal: " + storeLocal + " tempFile: " + tempFile); // m_log.Debug("HandleUDPUploadRequest - assetID: " + assetID.ToString() + " transaction: " + transaction.ToString() + " type: " + type.ToString() + " storelocal: " + storeLocal + " tempFile: " + tempFile);
if (((AssetType)type == AssetType.Texture || if (((AssetType)type == AssetType.Texture ||
(AssetType)type == AssetType.Sound || (AssetType)type == AssetType.Sound ||
(AssetType)type == AssetType.TextureTGA || (AssetType)type == AssetType.TextureTGA ||
@ -246,7 +251,6 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
} }
} }
//m_log.Debug("asset upload of " + assetID);
AgentAssetTransactions transactions = GetUserTransactions(remoteClient.AgentId); AgentAssetTransactions transactions = GetUserTransactions(remoteClient.AgentId);
AssetXferUploader uploader = transactions.RequestXferUploader(transaction); AssetXferUploader uploader = transactions.RequestXferUploader(transaction);

View File

@ -154,7 +154,8 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
m_userTransactions.Manager.MyScene.AssetService.Store(m_asset); m_userTransactions.Manager.MyScene.AssetService.Store(m_asset);
} }
m_log.DebugFormat("[ASSET TRANSACTIONS]: Uploaded asset data for transaction {0}", TransactionID); m_log.DebugFormat(
"[ASSET TRANSACTIONS]: Uploaded asset {0} for transaction {1}", m_asset.FullID, TransactionID);
if (m_dumpAssetToFile) if (m_dumpAssetToFile)
{ {

View File

@ -91,6 +91,8 @@ namespace OpenSim.Region.CoreModules.Asset
/// </example> /// </example>
public class CenomeMemoryAssetCache : IImprovedAssetCache, ISharedRegionModule public class CenomeMemoryAssetCache : IImprovedAssetCache, ISharedRegionModule
{ {
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
/// <summary> /// <summary>
/// Cache's default maximal asset count. /// Cache's default maximal asset count.
/// </summary> /// </summary>
@ -116,11 +118,6 @@ namespace OpenSim.Region.CoreModules.Asset
/// </summary> /// </summary>
public static readonly TimeSpan DefaultExpirationTime = TimeSpan.FromMinutes(30.0); public static readonly TimeSpan DefaultExpirationTime = TimeSpan.FromMinutes(30.0);
/// <summary>
/// Log manager instance.
/// </summary>
private static readonly ILog Log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
/// <summary> /// <summary>
/// Cache object. /// Cache object.
/// </summary> /// </summary>
@ -170,7 +167,7 @@ namespace OpenSim.Region.CoreModules.Asset
{ {
if (maximalSize <= 0 || maximalCount <= 0) if (maximalSize <= 0 || maximalCount <= 0)
{ {
//Log.Debug("[ASSET CACHE]: Cenome asset cache is not enabled."); //m_log.Debug("[ASSET CACHE]: Cenome asset cache is not enabled.");
m_enabled = false; m_enabled = false;
return; return;
} }
@ -186,7 +183,7 @@ namespace OpenSim.Region.CoreModules.Asset
CnmSynchronizedCache<string, AssetBase>.Synchronized(new CnmMemoryCache<string, AssetBase>( CnmSynchronizedCache<string, AssetBase>.Synchronized(new CnmMemoryCache<string, AssetBase>(
maximalSize, maximalCount, expirationTime)); maximalSize, maximalCount, expirationTime));
m_enabled = true; m_enabled = true;
Log.DebugFormat( m_log.DebugFormat(
"[ASSET CACHE]: Cenome asset cache enabled (MaxSize = {0} bytes, MaxCount = {1}, ExpirationTime = {2})", "[ASSET CACHE]: Cenome asset cache enabled (MaxSize = {0} bytes, MaxCount = {1}, ExpirationTime = {2})",
maximalSize, maximalSize,
maximalCount, maximalCount,
@ -205,6 +202,8 @@ namespace OpenSim.Region.CoreModules.Asset
{ {
if (asset != null) if (asset != null)
{ {
// m_log.DebugFormat("[CENOME ASSET CACHE]: Caching asset {0}", asset.ID);
long size = asset.Data != null ? asset.Data.Length : 1; long size = asset.Data != null ? asset.Data.Length : 1;
m_cache.Set(asset.ID, asset, size); m_cache.Set(asset.ID, asset, size);
m_cachedCount++; m_cachedCount++;
@ -255,7 +254,7 @@ namespace OpenSim.Region.CoreModules.Asset
if (m_getCount == m_debugEpoch) if (m_getCount == m_debugEpoch)
{ {
Log.DebugFormat( m_log.DebugFormat(
"[ASSET CACHE]: Cached = {0}, Get = {1}, Hits = {2}%, Size = {3} bytes, Avg. A. Size = {4} bytes", "[ASSET CACHE]: Cached = {0}, Get = {1}, Hits = {2}%, Size = {3} bytes, Avg. A. Size = {4} bytes",
m_cachedCount, m_cachedCount,
m_getCount, m_getCount,
@ -267,6 +266,9 @@ namespace OpenSim.Region.CoreModules.Asset
m_cachedCount = 0; m_cachedCount = 0;
} }
// if (null == assetBase)
// m_log.DebugFormat("[CENOME ASSET CACHE]: Asset {0} not in cache", id);
return assetBase; return assetBase;
} }
@ -325,12 +327,11 @@ namespace OpenSim.Region.CoreModules.Asset
return; return;
string name = moduleConfig.GetString("AssetCaching"); string name = moduleConfig.GetString("AssetCaching");
//Log.DebugFormat("[XXX] name = {0} (this module's name: {1}", name, Name); //m_log.DebugFormat("[XXX] name = {0} (this module's name: {1}", name, Name);
if (name != Name) if (name != Name)
return; return;
// This module is used
long maxSize = DefaultMaxSize; long maxSize = DefaultMaxSize;
int maxCount = DefaultMaxCount; int maxCount = DefaultMaxCount;
TimeSpan expirationTime = DefaultExpirationTime; TimeSpan expirationTime = DefaultExpirationTime;

View File

@ -148,13 +148,19 @@ namespace OpenSim.Region.CoreModules.Avatar.Combat.CombatModule
private void AvatarEnteringParcel(ScenePresence avatar, int localLandID, UUID regionID) private void AvatarEnteringParcel(ScenePresence avatar, int localLandID, UUID regionID)
{ {
ILandObject obj = avatar.Scene.LandChannel.GetLandObject(avatar.AbsolutePosition.X, avatar.AbsolutePosition.Y); ILandObject obj = avatar.Scene.LandChannel.GetLandObject(avatar.AbsolutePosition.X, avatar.AbsolutePosition.Y);
if ((obj.LandData.Flags & (uint)ParcelFlags.AllowDamage) != 0) try
{ {
avatar.Invulnerable = false; if ((obj.LandData.Flags & (uint)ParcelFlags.AllowDamage) != 0)
{
avatar.Invulnerable = false;
}
else
{
avatar.Invulnerable = true;
}
} }
else catch (Exception ex)
{ {
avatar.Invulnerable = true;
} }
} }
} }

View File

@ -147,7 +147,7 @@ namespace OpenSim.Region.CoreModules.Framework.InterfaceCommander
m_args[i].ArgumentValue = Int32.Parse(arg.ToString()); m_args[i].ArgumentValue = Int32.Parse(arg.ToString());
break; break;
case "Double": case "Double":
m_args[i].ArgumentValue = Double.Parse(arg.ToString()); m_args[i].ArgumentValue = Double.Parse(arg.ToString(), OpenSim.Framework.Culture.NumberFormatInfo);
break; break;
case "Boolean": case "Boolean":
m_args[i].ArgumentValue = Boolean.Parse(arg.ToString()); m_args[i].ArgumentValue = Boolean.Parse(arg.ToString());

View File

@ -38,12 +38,9 @@ using OpenSim.Services.Interfaces;
namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Asset namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Asset
{ {
public class LocalAssetServicesConnector : public class LocalAssetServicesConnector : ISharedRegionModule, IAssetService
ISharedRegionModule, IAssetService
{ {
private static readonly ILog m_log = private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
LogManager.GetLogger(
MethodBase.GetCurrentMethod().DeclaringType);
private IImprovedAssetCache m_Cache = null; private IImprovedAssetCache m_Cache = null;
@ -72,7 +69,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Asset
IConfig assetConfig = source.Configs["AssetService"]; IConfig assetConfig = source.Configs["AssetService"];
if (assetConfig == null) if (assetConfig == null)
{ {
m_log.Error("[ASSET CONNECTOR]: AssetService missing from OpenSim.ini"); m_log.Error("[LOCAL ASSET SERVICES CONNECTOR]: AssetService missing from OpenSim.ini");
return; return;
} }
@ -81,22 +78,20 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Asset
if (serviceDll == String.Empty) if (serviceDll == String.Empty)
{ {
m_log.Error("[ASSET CONNECTOR]: No LocalServiceModule named in section AssetService"); m_log.Error("[LOCAL ASSET SERVICES CONNECTOR]: No LocalServiceModule named in section AssetService");
return; return;
} }
Object[] args = new Object[] { source }; Object[] args = new Object[] { source };
m_AssetService = m_AssetService = ServerUtils.LoadPlugin<IAssetService>(serviceDll, args);
ServerUtils.LoadPlugin<IAssetService>(serviceDll,
args);
if (m_AssetService == null) if (m_AssetService == null)
{ {
m_log.Error("[ASSET CONNECTOR]: Can't load asset service"); m_log.Error("[LOCAL ASSET SERVICES CONNECTOR]: Can't load asset service");
return; return;
} }
m_Enabled = true; m_Enabled = true;
m_log.Info("[ASSET CONNECTOR]: Local asset connector enabled"); m_log.Info("[LOCAL ASSET SERVICES CONNECTOR]: Local asset connector enabled");
} }
} }
} }
@ -134,11 +129,11 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Asset
m_Cache = null; m_Cache = null;
} }
m_log.InfoFormat("[ASSET CONNECTOR]: Enabled local assets for region {0}", scene.RegionInfo.RegionName); m_log.InfoFormat("[LOCAL ASSET SERVICES CONNECTOR]: Enabled local assets for region {0}", scene.RegionInfo.RegionName);
if (m_Cache != null) if (m_Cache != null)
{ {
m_log.InfoFormat("[ASSET CONNECTOR]: Enabled asset caching for region {0}", scene.RegionInfo.RegionName); m_log.InfoFormat("[LOCAL ASSET SERVICES CONNECTOR]: Enabled asset caching for region {0}", scene.RegionInfo.RegionName);
} }
else else
{ {
@ -151,6 +146,8 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Asset
public AssetBase Get(string id) public AssetBase Get(string id)
{ {
// m_log.DebugFormat("[LOCAL ASSET SERVICES CONNECTOR]: Synchronously requesting asset {0}", id);
AssetBase asset = null; AssetBase asset = null;
if (m_Cache != null) if (m_Cache != null)
asset = m_Cache.Get(id); asset = m_Cache.Get(id);
@ -160,7 +157,11 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Asset
asset = m_AssetService.Get(id); asset = m_AssetService.Get(id);
if ((m_Cache != null) && (asset != null)) if ((m_Cache != null) && (asset != null))
m_Cache.Cache(asset); m_Cache.Cache(asset);
// if (null == asset)
// m_log.WarnFormat("[LOCAL ASSET SERVICES CONNECTOR]: Could not synchronously find asset with id {0}", id);
} }
return asset; return asset;
} }
@ -204,15 +205,17 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Asset
public bool Get(string id, Object sender, AssetRetrieved handler) public bool Get(string id, Object sender, AssetRetrieved handler)
{ {
AssetBase asset = null; // m_log.DebugFormat("[LOCAL ASSET SERVICES CONNECTOR]: Asynchronously requesting asset {0}", id);
if (m_Cache != null) if (m_Cache != null)
m_Cache.Get(id);
if (asset != null)
{ {
Util.FireAndForget(delegate { handler(id, sender, asset); }); AssetBase asset = m_Cache.Get(id);
return true;
if (asset != null)
{
Util.FireAndForget(delegate { handler(id, sender, asset); });
return true;
}
} }
return m_AssetService.Get(id, sender, delegate (string assetID, Object s, AssetBase a) return m_AssetService.Get(id, sender, delegate (string assetID, Object s, AssetBase a)
@ -220,6 +223,9 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Asset
if ((a != null) && (m_Cache != null)) if ((a != null) && (m_Cache != null))
m_Cache.Cache(a); m_Cache.Cache(a);
// if (null == a)
// m_log.WarnFormat("[LOCAL ASSET SERVICES CONNECTOR]: Could not asynchronously find asset with id {0}", id);
Util.FireAndForget(delegate { handler(assetID, s, a); }); Util.FireAndForget(delegate { handler(assetID, s, a); });
}); });
} }

View File

@ -73,7 +73,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
IConfig inventoryConfig = source.Configs["InventoryService"]; IConfig inventoryConfig = source.Configs["InventoryService"];
if (inventoryConfig == null) if (inventoryConfig == null)
{ {
m_log.Error("[INVENTORY CONNECTOR]: InventoryService missing from OpenSim.ini"); m_log.Error("[LOCAL INVENTORY SERVICES CONNECTOR]: InventoryService missing from OpenSim.ini");
return; return;
} }
@ -81,18 +81,18 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
if (serviceDll == String.Empty) if (serviceDll == String.Empty)
{ {
m_log.Error("[INVENTORY CONNECTOR]: No LocalServiceModule named in section InventoryService"); m_log.Error("[LOCAL INVENTORY SERVICES CONNECTOR]: No LocalServiceModule named in section InventoryService");
return; return;
} }
Object[] args = new Object[] { source }; Object[] args = new Object[] { source };
m_log.DebugFormat("[INVENTORY CONNECTOR]: Service dll = {0}", serviceDll); m_log.DebugFormat("[LOCAL INVENTORY SERVICES CONNECTOR]: Service dll = {0}", serviceDll);
m_InventoryService = ServerUtils.LoadPlugin<IInventoryService>(serviceDll, args); m_InventoryService = ServerUtils.LoadPlugin<IInventoryService>(serviceDll, args);
if (m_InventoryService == null) if (m_InventoryService == null)
{ {
m_log.Error("[INVENTORY CONNECTOR]: Can't load inventory service"); m_log.Error("[LOCAL INVENTORY SERVICES CONNECTOR]: Can't load inventory service");
//return; //return;
throw new Exception("Unable to proceed. Please make sure your ini files in config-include are updated according to .example's"); throw new Exception("Unable to proceed. Please make sure your ini files in config-include are updated according to .example's");
} }
@ -111,7 +111,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
Init(source); Init(source);
m_Enabled = true; m_Enabled = true;
m_log.Info("[INVENTORY CONNECTOR]: Local inventory connector enabled"); m_log.Info("[LOCAL INVENTORY SERVICES CONNECTOR]: Local inventory connector enabled");
} }
} }
} }
@ -135,7 +135,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
} }
// m_log.DebugFormat( // m_log.DebugFormat(
// "[INVENTORY CONNECTOR]: Registering IInventoryService to scene {0}", scene.RegionInfo.RegionName); // "[LOCAL INVENTORY SERVICES CONNECTOR]: Registering IInventoryService to scene {0}", scene.RegionInfo.RegionName);
scene.RegisterModuleInterface<IInventoryService>(this); scene.RegisterModuleInterface<IInventoryService>(this);
m_cache.AddRegion(scene); m_cache.AddRegion(scene);
@ -155,7 +155,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
return; return;
m_log.InfoFormat( m_log.InfoFormat(
"[INVENTORY CONNECTOR]: Enabled local invnetory for region {0}", scene.RegionInfo.RegionName); "[LOCAL INVENTORY SERVICES CONNECTOR]: Enabled local inventory for region {0}", scene.RegionInfo.RegionName);
} }
#region IInventoryService #region IInventoryService
@ -210,7 +210,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
return folders; return folders;
} }
} }
m_log.WarnFormat("[INVENTORY CONNECTOR]: System folders for {0} not found", userID); m_log.WarnFormat("[LOCAL INVENTORY SERVICES CONNECTOR]: System folders for {0} not found", userID);
return new Dictionary<AssetType, InventoryFolderBase>(); return new Dictionary<AssetType, InventoryFolderBase>();
} }
@ -309,7 +309,14 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
public override InventoryItemBase GetItem(InventoryItemBase item) public override InventoryItemBase GetItem(InventoryItemBase item)
{ {
return m_InventoryService.GetItem(item); // m_log.DebugFormat("[LOCAL INVENTORY SERVICES CONNECTOR]: Requesting inventory item {0}", item.ID);
item = m_InventoryService.GetItem(item);
if (null == item)
m_log.ErrorFormat("[LOCAL INVENTORY SERVICES CONNECTOR]: Could not find item with id {0}");
return item;
} }
public override InventoryFolderBase GetFolder(InventoryFolderBase folder) public override InventoryFolderBase GetFolder(InventoryFolderBase folder)

View File

@ -955,8 +955,8 @@ namespace OpenSim.Region.CoreModules.World.Estate
if (y == -1 || m_scene.RegionInfo.RegionLocY == y) if (y == -1 || m_scene.RegionInfo.RegionLocY == y)
{ {
int corner = int.Parse(num); int corner = int.Parse(num);
float lowValue = float.Parse(min); float lowValue = float.Parse(min, Culture.NumberFormatInfo);
float highValue = float.Parse(max); float highValue = float.Parse(max, Culture.NumberFormatInfo);
m_log.Debug("[ESTATEMODULE] Setting terrain heights " + m_scene.RegionInfo.RegionName + m_log.Debug("[ESTATEMODULE] Setting terrain heights " + m_scene.RegionInfo.RegionName +
string.Format(" (C{0}, {1}-{2}", corner, lowValue, highValue)); string.Format(" (C{0}, {1}-{2}", corner, lowValue, highValue));

View File

@ -60,7 +60,7 @@ namespace OpenSim.Region.CoreModules.World.Sound
} }
public virtual void PlayAttachedSound( public virtual void PlayAttachedSound(
UUID soundID, UUID ownerID, UUID objectID, double gain, Vector3 position, byte flags) UUID soundID, UUID ownerID, UUID objectID, double gain, Vector3 position, byte flags, float radius)
{ {
foreach (ScenePresence p in m_scene.GetAvatars()) foreach (ScenePresence p in m_scene.GetAvatars())
{ {
@ -69,14 +69,17 @@ namespace OpenSim.Region.CoreModules.World.Sound
continue; continue;
// Scale by distance // Scale by distance
gain = (float)((double)gain*((100.0 - dis) / 100.0)); if (radius == 0)
gain = (float)((double)gain * ((100.0 - dis) / 100.0));
else
gain = (float)((double)gain * ((radius - dis) / radius));
p.ControllingClient.SendPlayAttachedSound(soundID, objectID, ownerID, (float)gain, flags); p.ControllingClient.SendPlayAttachedSound(soundID, objectID, ownerID, (float)gain, flags);
} }
} }
public virtual void TriggerSound( public virtual void TriggerSound(
UUID soundId, UUID ownerID, UUID objectID, UUID parentID, double gain, Vector3 position, UInt64 handle) UUID soundId, UUID ownerID, UUID objectID, UUID parentID, double gain, Vector3 position, UInt64 handle, float radius)
{ {
foreach (ScenePresence p in m_scene.GetAvatars()) foreach (ScenePresence p in m_scene.GetAvatars())
{ {
@ -85,7 +88,10 @@ namespace OpenSim.Region.CoreModules.World.Sound
continue; continue;
// Scale by distance // Scale by distance
gain = (float)((double)gain*((100.0 - dis) / 100.0)); if (radius == 0)
gain = (float)((double)gain * ((100.0 - dis) / 100.0));
else
gain = (float)((double)gain * ((radius - dis) / radius));
p.ControllingClient.SendTriggeredSound( p.ControllingClient.SendTriggeredSound(
soundId, ownerID, objectID, parentID, handle, position, (float)gain); soundId, ownerID, objectID, parentID, handle, position, (float)gain);

View File

@ -84,6 +84,7 @@ namespace OpenSim.Region.CoreModules.World.Terrain
private ITerrainChannel m_revert; private ITerrainChannel m_revert;
private Scene m_scene; private Scene m_scene;
private volatile bool m_tainted; private volatile bool m_tainted;
private readonly UndoStack<LandUndoState> m_undo = new UndoStack<LandUndoState>(5);
#region ICommandableModule Members #region ICommandableModule Members
@ -174,6 +175,11 @@ namespace OpenSim.Region.CoreModules.World.Terrain
#region ITerrainModule Members #region ITerrainModule Members
public void UndoTerrain(ITerrainChannel channel)
{
m_channel = channel;
}
/// <summary> /// <summary>
/// Loads a terrain file from disk and installs it in the scene. /// Loads a terrain file from disk and installs it in the scene.
/// </summary> /// </summary>
@ -574,6 +580,7 @@ namespace OpenSim.Region.CoreModules.World.Terrain
{ {
client.OnModifyTerrain += client_OnModifyTerrain; client.OnModifyTerrain += client_OnModifyTerrain;
client.OnBakeTerrain += client_OnBakeTerrain; client.OnBakeTerrain += client_OnBakeTerrain;
client.OnLandUndo += client_OnLandUndo;
} }
/// <summary> /// <summary>
@ -664,6 +671,19 @@ namespace OpenSim.Region.CoreModules.World.Terrain
return changesLimited; return changesLimited;
} }
private void client_OnLandUndo(IClientAPI client)
{
lock (m_undo)
{
if (m_undo.Count > 0)
{
LandUndoState goback = m_undo.Pop();
if (goback != null)
goback.PlaybackState();
}
}
}
/// <summary> /// <summary>
/// Sends a copy of the current terrain to the scenes clients /// Sends a copy of the current terrain to the scenes clients
/// </summary> /// </summary>
@ -718,6 +738,7 @@ namespace OpenSim.Region.CoreModules.World.Terrain
} }
if (allowed) if (allowed)
{ {
StoreUndoState();
m_painteffects[(StandardTerrainEffects) action].PaintEffect( m_painteffects[(StandardTerrainEffects) action].PaintEffect(
m_channel, allowMask, west, south, height, size, seconds); m_channel, allowMask, west, south, height, size, seconds);
@ -758,6 +779,7 @@ namespace OpenSim.Region.CoreModules.World.Terrain
if (allowed) if (allowed)
{ {
StoreUndoState();
m_floodeffects[(StandardTerrainEffects) action].FloodEffect( m_floodeffects[(StandardTerrainEffects) action].FloodEffect(
m_channel, fillArea, size); m_channel, fillArea, size);
@ -782,6 +804,25 @@ namespace OpenSim.Region.CoreModules.World.Terrain
} }
} }
private void StoreUndoState()
{
lock (m_undo)
{
if (m_undo.Count > 0)
{
LandUndoState last = m_undo.Peek();
if (last != null)
{
if (last.Compare(m_channel))
return;
}
}
LandUndoState nUndo = new LandUndoState(this, m_channel);
m_undo.Push(nUndo);
}
}
#region Console Commands #region Console Commands
private void InterfaceLoadFile(Object[] args) private void InterfaceLoadFile(Object[] args)

View File

@ -194,6 +194,8 @@ namespace OpenSim.Region.Examples.SimpleModule
public event ObjectBuy OnObjectBuy; public event ObjectBuy OnObjectBuy;
public event BuyObjectInventory OnBuyObjectInventory; public event BuyObjectInventory OnBuyObjectInventory;
public event AgentSit OnUndo; public event AgentSit OnUndo;
public event AgentSit OnRedo;
public event LandUndo OnLandUndo;
public event ForceReleaseControls OnForceReleaseControls; public event ForceReleaseControls OnForceReleaseControls;

View File

@ -32,9 +32,9 @@ namespace OpenSim.Region.Framework.Interfaces
{ {
public interface ISoundModule public interface ISoundModule
{ {
void PlayAttachedSound(UUID soundID, UUID ownerID, UUID objectID, double gain, Vector3 position, byte flags); void PlayAttachedSound(UUID soundID, UUID ownerID, UUID objectID, double gain, Vector3 position, byte flags, float radius);
void TriggerSound( void TriggerSound(
UUID soundId, UUID ownerID, UUID objectID, UUID parentID, double gain, Vector3 position, UInt64 handle); UUID soundId, UUID ownerID, UUID objectID, UUID parentID, double gain, Vector3 position, UInt64 handle, float radius);
} }
} }

View File

@ -62,5 +62,7 @@ namespace OpenSim.Region.Framework.Interfaces
void SaveToStream(string filename, Stream stream); void SaveToStream(string filename, Stream stream);
void InstallPlugin(string name, ITerrainEffect plug); void InstallPlugin(string name, ITerrainEffect plug);
void UndoTerrain(ITerrainChannel channel);
} }
} }

View File

@ -419,14 +419,11 @@ namespace OpenSim.Region.Framework.Scenes.Animation
if (m_scenePresence.IsChildAgent) if (m_scenePresence.IsChildAgent)
return; return;
UUID[] animIDs; m_scenePresence.Scene.ForEachScenePresence(
int[] sequenceNums; delegate(ScenePresence SP)
UUID[] objectIDs; {
SP.Animator.SendAnimPack();
m_animations.GetArrays(out animIDs, out sequenceNums, out objectIDs); });
m_scenePresence.ControllingClient.SendAnimations(
animIDs, sequenceNums, m_scenePresence.ControllingClient.AgentId, objectIDs);
} }
/// <summary> /// <summary>

View File

@ -528,6 +528,9 @@ namespace OpenSim.Region.Framework.Scenes
m_log.Error("[AGENT INVENTORY]: Failed to find item " + oldItemID.ToString()); m_log.Error("[AGENT INVENTORY]: Failed to find item " + oldItemID.ToString());
return; return;
} }
if ((item.CurrentPermissions & (uint)PermissionMask.Copy) == 0)
return;
} }
AssetBase asset = AssetService.Get(item.AssetID.ToString()); AssetBase asset = AssetService.Get(item.AssetID.ToString());

View File

@ -2054,9 +2054,39 @@ namespace OpenSim.Region.Framework.Scenes
if (grp.IsDeleted) if (grp.IsDeleted)
return; return;
if (grp.RootPart.DIE_AT_EDGE)
{
// We remove the object here
try
{
DeleteSceneObject(grp, false);
}
catch (Exception)
{
m_log.Warn("[DATABASE]: exception when trying to remove the prim that crossed the border.");
}
return;
}
if (grp.RootPart.RETURN_AT_EDGE)
{
// We remove the object here
try
{
List<SceneObjectGroup> objects = new List<SceneObjectGroup>();
objects.Add(grp);
SceneObjectGroup[] objectsArray = objects.ToArray();
returnObjects(objectsArray, UUID.Zero);
}
catch (Exception)
{
m_log.Warn("[DATABASE]: exception when trying to return the prim that crossed the border.");
}
return;
}
if (m_teleportModule != null) if (m_teleportModule != null)
m_teleportModule.Cross(grp, attemptedPosition, silent); m_teleportModule.Cross(grp, attemptedPosition, silent);
} }
public Border GetCrossedBorder(Vector3 position, Cardinals gridline) public Border GetCrossedBorder(Vector3 position, Cardinals gridline)
@ -2552,6 +2582,7 @@ namespace OpenSim.Region.Framework.Scenes
client.OnGrabUpdate += ProcessObjectGrabUpdate; client.OnGrabUpdate += ProcessObjectGrabUpdate;
client.OnDeGrabObject += ProcessObjectDeGrab; client.OnDeGrabObject += ProcessObjectDeGrab;
client.OnUndo += m_sceneGraph.HandleUndo; client.OnUndo += m_sceneGraph.HandleUndo;
client.OnRedo += m_sceneGraph.HandleRedo;
client.OnObjectDescription += m_sceneGraph.PrimDescription; client.OnObjectDescription += m_sceneGraph.PrimDescription;
client.OnObjectDrop += m_sceneGraph.DropObject; client.OnObjectDrop += m_sceneGraph.DropObject;
client.OnObjectSaleInfo += ObjectSaleInfo; client.OnObjectSaleInfo += ObjectSaleInfo;
@ -2705,6 +2736,7 @@ namespace OpenSim.Region.Framework.Scenes
client.OnGrabObject -= ProcessObjectGrab; client.OnGrabObject -= ProcessObjectGrab;
client.OnDeGrabObject -= ProcessObjectDeGrab; client.OnDeGrabObject -= ProcessObjectDeGrab;
client.OnUndo -= m_sceneGraph.HandleUndo; client.OnUndo -= m_sceneGraph.HandleUndo;
client.OnRedo -= m_sceneGraph.HandleRedo;
client.OnObjectDescription -= m_sceneGraph.PrimDescription; client.OnObjectDescription -= m_sceneGraph.PrimDescription;
client.OnObjectDrop -= m_sceneGraph.DropObject; client.OnObjectDrop -= m_sceneGraph.DropObject;
client.OnObjectSaleInfo -= ObjectSaleInfo; client.OnObjectSaleInfo -= ObjectSaleInfo;
@ -2953,7 +2985,6 @@ namespace OpenSim.Region.Framework.Scenes
m_log.DebugFormat("[APPEARANCE]: Appearance not found in {0}, returning default", RegionInfo.RegionName); m_log.DebugFormat("[APPEARANCE]: Appearance not found in {0}, returning default", RegionInfo.RegionName);
appearance = new AvatarAppearance(client.AgentId); appearance = new AvatarAppearance(client.AgentId);
} }
} }
/// <summary> /// <summary>

View File

@ -453,6 +453,15 @@ namespace OpenSim.Region.Framework.Scenes
part.Undo(); part.Undo();
} }
} }
protected internal void HandleRedo(IClientAPI remoteClient, UUID primId)
{
if (primId != UUID.Zero)
{
SceneObjectPart part = m_parentScene.GetSceneObjectPart(primId);
if (part != null)
part.Redo();
}
}
protected internal void HandleObjectGroupUpdate( protected internal void HandleObjectGroupUpdate(
IClientAPI remoteClient, UUID GroupID, uint objectLocalID, UUID Garbage) IClientAPI remoteClient, UUID GroupID, uint objectLocalID, UUID Garbage)

View File

@ -298,7 +298,16 @@ namespace OpenSim.Region.Framework.Scenes
{ {
m_scene.CrossPrimGroupIntoNewRegion(val, this, true); m_scene.CrossPrimGroupIntoNewRegion(val, this, true);
} }
if (RootPart.GetStatusSandbox())
{
if (Util.GetDistanceTo(RootPart.StatusSandboxPos, value) > 10)
{
RootPart.ScriptSetPhysicsStatus(false);
Scene.SimChat(Utils.StringToBytes("Hit Sandbox Limit"),
ChatTypeEnum.DebugChannel, 0x7FFFFFFF, RootPart.AbsolutePosition, Name, UUID, false);
return;
}
}
lock (m_parts) lock (m_parts)
{ {
foreach (SceneObjectPart part in m_parts.Values) foreach (SceneObjectPart part in m_parts.Values)
@ -398,6 +407,34 @@ namespace OpenSim.Region.Framework.Scenes
} }
} }
private SceneObjectPart m_PlaySoundMasterPrim = null;
public SceneObjectPart PlaySoundMasterPrim
{
get { return m_PlaySoundMasterPrim; }
set { m_PlaySoundMasterPrim = value; }
}
private List<SceneObjectPart> m_PlaySoundSlavePrims = new List<SceneObjectPart>();
public List<SceneObjectPart> PlaySoundSlavePrims
{
get { return m_LoopSoundSlavePrims; }
set { m_LoopSoundSlavePrims = value; }
}
private SceneObjectPart m_LoopSoundMasterPrim = null;
public SceneObjectPart LoopSoundMasterPrim
{
get { return m_LoopSoundMasterPrim; }
set { m_LoopSoundMasterPrim = value; }
}
private List<SceneObjectPart> m_LoopSoundSlavePrims = new List<SceneObjectPart>();
public List<SceneObjectPart> LoopSoundSlavePrims
{
get { return m_LoopSoundSlavePrims; }
set { m_LoopSoundSlavePrims = value; }
}
// The UUID for the Region this Object is in. // The UUID for the Region this Object is in.
public UUID RegionUUID public UUID RegionUUID
{ {
@ -1779,32 +1816,6 @@ namespace OpenSim.Region.Framework.Scenes
} }
} }
public void rotLookAt(Quaternion target, float strength, float damping)
{
SceneObjectPart rootpart = m_rootPart;
if (rootpart != null)
{
if (IsAttachment)
{
/*
ScenePresence avatar = m_scene.GetScenePresence(rootpart.AttachedAvatar);
if (avatar != null)
{
Rotate the Av?
} */
}
else
{
if (rootpart.PhysActor != null)
{
rootpart.PhysActor.APIDTarget = new Quaternion(target.X, target.Y, target.Z, target.W);
rootpart.PhysActor.APIDStrength = strength;
rootpart.PhysActor.APIDDamping = damping;
rootpart.PhysActor.APIDActive = true;
}
}
}
}
public void stopLookAt() public void stopLookAt()
{ {
SceneObjectPart rootpart = m_rootPart; SceneObjectPart rootpart = m_rootPart;
@ -1963,6 +1974,8 @@ namespace OpenSim.Region.Framework.Scenes
foreach (SceneObjectPart part in m_parts.Values) foreach (SceneObjectPart part in m_parts.Values)
{ {
if (!IsSelected)
part.UpdateLookAt();
part.SendScheduledUpdates(); part.SendScheduledUpdates();
} }
} }
@ -2452,11 +2465,14 @@ namespace OpenSim.Region.Framework.Scenes
{ {
if (m_rootPart.PhysActor.IsPhysical) if (m_rootPart.PhysActor.IsPhysical)
{ {
Vector3 llmoveforce = pos - AbsolutePosition; if (!m_rootPart.BlockGrab)
Vector3 grabforce = llmoveforce; {
grabforce = (grabforce / 10) * m_rootPart.PhysActor.Mass; Vector3 llmoveforce = pos - AbsolutePosition;
m_rootPart.PhysActor.AddForce(grabforce,true); Vector3 grabforce = llmoveforce;
m_scene.PhysicsScene.AddPhysicsActorTaint(m_rootPart.PhysActor); grabforce = (grabforce / 10) * m_rootPart.PhysActor.Mass;
m_rootPart.PhysActor.AddForce(grabforce, true);
m_scene.PhysicsScene.AddPhysicsActorTaint(m_rootPart.PhysActor);
}
} }
else else
{ {
@ -2812,6 +2828,7 @@ namespace OpenSim.Region.Framework.Scenes
SceneObjectPart part = GetChildPart(localID); SceneObjectPart part = GetChildPart(localID);
if (part != null) if (part != null)
{ {
part.IgnoreUndoUpdate = true;
if (scale.X > m_scene.m_maxNonphys) if (scale.X > m_scene.m_maxNonphys)
scale.X = m_scene.m_maxNonphys; scale.X = m_scene.m_maxNonphys;
if (scale.Y > m_scene.m_maxNonphys) if (scale.Y > m_scene.m_maxNonphys)
@ -2839,6 +2856,7 @@ namespace OpenSim.Region.Framework.Scenes
{ {
if (obPart.UUID != m_rootPart.UUID) if (obPart.UUID != m_rootPart.UUID)
{ {
obPart.IgnoreUndoUpdate = true;
Vector3 oldSize = new Vector3(obPart.Scale); Vector3 oldSize = new Vector3(obPart.Scale);
float f = 1.0f; float f = 1.0f;
@ -2898,6 +2916,8 @@ namespace OpenSim.Region.Framework.Scenes
z *= a; z *= a;
} }
} }
obPart.IgnoreUndoUpdate = false;
obPart.StoreUndoState();
} }
} }
} }
@ -2913,6 +2933,7 @@ namespace OpenSim.Region.Framework.Scenes
{ {
foreach (SceneObjectPart obPart in m_parts.Values) foreach (SceneObjectPart obPart in m_parts.Values)
{ {
obPart.IgnoreUndoUpdate = true;
if (obPart.UUID != m_rootPart.UUID) if (obPart.UUID != m_rootPart.UUID)
{ {
Vector3 currentpos = new Vector3(obPart.OffsetPosition); Vector3 currentpos = new Vector3(obPart.OffsetPosition);
@ -2926,6 +2947,8 @@ namespace OpenSim.Region.Framework.Scenes
obPart.Resize(newSize); obPart.Resize(newSize);
obPart.UpdateOffSet(currentpos); obPart.UpdateOffSet(currentpos);
} }
obPart.IgnoreUndoUpdate = false;
obPart.StoreUndoState();
} }
} }
@ -2935,6 +2958,8 @@ namespace OpenSim.Region.Framework.Scenes
m_scene.PhysicsScene.AddPhysicsActorTaint(part.PhysActor); m_scene.PhysicsScene.AddPhysicsActorTaint(part.PhysActor);
} }
part.IgnoreUndoUpdate = false;
part.StoreUndoState();
HasGroupChanged = true; HasGroupChanged = true;
ScheduleGroupForTerseUpdate(); ScheduleGroupForTerseUpdate();
} }
@ -2950,13 +2975,26 @@ namespace OpenSim.Region.Framework.Scenes
/// <param name="pos"></param> /// <param name="pos"></param>
public void UpdateGroupPosition(Vector3 pos) public void UpdateGroupPosition(Vector3 pos)
{ {
foreach (SceneObjectPart part in Children.Values)
{
part.StoreUndoState();
}
if (m_scene.EventManager.TriggerGroupMove(UUID, pos)) if (m_scene.EventManager.TriggerGroupMove(UUID, pos))
{ {
if (IsAttachment) if (IsAttachment)
{ {
m_rootPart.AttachedPos = pos; m_rootPart.AttachedPos = pos;
} }
if (RootPart.GetStatusSandbox())
{
if (Util.GetDistanceTo(RootPart.StatusSandboxPos, pos) > 10)
{
RootPart.ScriptSetPhysicsStatus(false);
pos = AbsolutePosition;
Scene.SimChat(Utils.StringToBytes("Hit Sandbox Limit"),
ChatTypeEnum.DebugChannel, 0x7FFFFFFF, RootPart.AbsolutePosition, Name, UUID, false);
}
}
AbsolutePosition = pos; AbsolutePosition = pos;
HasGroupChanged = true; HasGroupChanged = true;
@ -2975,7 +3013,10 @@ namespace OpenSim.Region.Framework.Scenes
public void UpdateSinglePosition(Vector3 pos, uint localID) public void UpdateSinglePosition(Vector3 pos, uint localID)
{ {
SceneObjectPart part = GetChildPart(localID); SceneObjectPart part = GetChildPart(localID);
foreach (SceneObjectPart parts in Children.Values)
{
parts.StoreUndoState();
}
if (part != null) if (part != null)
{ {
if (part.UUID == m_rootPart.UUID) if (part.UUID == m_rootPart.UUID)
@ -2997,6 +3038,10 @@ namespace OpenSim.Region.Framework.Scenes
/// <param name="pos"></param> /// <param name="pos"></param>
private void UpdateRootPosition(Vector3 pos) private void UpdateRootPosition(Vector3 pos)
{ {
foreach (SceneObjectPart part in Children.Values)
{
part.StoreUndoState();
}
Vector3 newPos = new Vector3(pos.X, pos.Y, pos.Z); Vector3 newPos = new Vector3(pos.X, pos.Y, pos.Z);
Vector3 oldPos = Vector3 oldPos =
new Vector3(AbsolutePosition.X + m_rootPart.OffsetPosition.X, new Vector3(AbsolutePosition.X + m_rootPart.OffsetPosition.X,
@ -3040,6 +3085,10 @@ namespace OpenSim.Region.Framework.Scenes
/// <param name="rot"></param> /// <param name="rot"></param>
public void UpdateGroupRotationR(Quaternion rot) public void UpdateGroupRotationR(Quaternion rot)
{ {
foreach (SceneObjectPart parts in Children.Values)
{
parts.StoreUndoState();
}
m_rootPart.UpdateRotation(rot); m_rootPart.UpdateRotation(rot);
PhysicsActor actor = m_rootPart.PhysActor; PhysicsActor actor = m_rootPart.PhysActor;
@ -3060,6 +3109,10 @@ namespace OpenSim.Region.Framework.Scenes
/// <param name="rot"></param> /// <param name="rot"></param>
public void UpdateGroupRotationPR(Vector3 pos, Quaternion rot) public void UpdateGroupRotationPR(Vector3 pos, Quaternion rot)
{ {
foreach (SceneObjectPart parts in Children.Values)
{
parts.StoreUndoState();
}
m_rootPart.UpdateRotation(rot); m_rootPart.UpdateRotation(rot);
PhysicsActor actor = m_rootPart.PhysActor; PhysicsActor actor = m_rootPart.PhysActor;
@ -3083,6 +3136,10 @@ namespace OpenSim.Region.Framework.Scenes
public void UpdateSingleRotation(Quaternion rot, uint localID) public void UpdateSingleRotation(Quaternion rot, uint localID)
{ {
SceneObjectPart part = GetChildPart(localID); SceneObjectPart part = GetChildPart(localID);
foreach (SceneObjectPart parts in Children.Values)
{
parts.StoreUndoState();
}
if (part != null) if (part != null)
{ {
if (part.UUID == m_rootPart.UUID) if (part.UUID == m_rootPart.UUID)
@ -3113,8 +3170,11 @@ namespace OpenSim.Region.Framework.Scenes
} }
else else
{ {
part.IgnoreUndoUpdate = true;
part.UpdateRotation(rot); part.UpdateRotation(rot);
part.OffsetPosition = pos; part.OffsetPosition = pos;
part.IgnoreUndoUpdate = false;
part.StoreUndoState();
} }
} }
} }
@ -3128,6 +3188,7 @@ namespace OpenSim.Region.Framework.Scenes
Quaternion axRot = rot; Quaternion axRot = rot;
Quaternion oldParentRot = m_rootPart.RotationOffset; Quaternion oldParentRot = m_rootPart.RotationOffset;
m_rootPart.StoreUndoState();
m_rootPart.UpdateRotation(rot); m_rootPart.UpdateRotation(rot);
if (m_rootPart.PhysActor != null) if (m_rootPart.PhysActor != null)
{ {
@ -3141,6 +3202,7 @@ namespace OpenSim.Region.Framework.Scenes
{ {
if (prim.UUID != m_rootPart.UUID) if (prim.UUID != m_rootPart.UUID)
{ {
prim.IgnoreUndoUpdate = true;
Vector3 axPos = prim.OffsetPosition; Vector3 axPos = prim.OffsetPosition;
axPos *= oldParentRot; axPos *= oldParentRot;
axPos *= Quaternion.Inverse(axRot); axPos *= Quaternion.Inverse(axRot);
@ -3153,7 +3215,14 @@ namespace OpenSim.Region.Framework.Scenes
} }
} }
} }
foreach (SceneObjectPart childpart in Children.Values)
{
if (childpart != m_rootPart)
{
childpart.IgnoreUndoUpdate = false;
childpart.StoreUndoState();
}
}
m_rootPart.ScheduleTerseUpdate(); m_rootPart.ScheduleTerseUpdate();
} }

View File

@ -133,6 +133,18 @@ namespace OpenSim.Region.Framework.Scenes
[XmlIgnore] [XmlIgnore]
public bool DIE_AT_EDGE; public bool DIE_AT_EDGE;
[XmlIgnore]
public bool RETURN_AT_EDGE;
[XmlIgnore]
public bool BlockGrab;
[XmlIgnore]
public bool StatusSandbox;
[XmlIgnore]
public Vector3 StatusSandboxPos;
// TODO: This needs to be persisted in next XML version update! // TODO: This needs to be persisted in next XML version update!
[XmlIgnore] [XmlIgnore]
public readonly int[] PayPrice = {-2,-2,-2,-2,-2}; public readonly int[] PayPrice = {-2,-2,-2,-2,-2};
@ -219,6 +231,15 @@ namespace OpenSim.Region.Framework.Scenes
[XmlIgnore] [XmlIgnore]
public Quaternion SpinOldOrientation = Quaternion.Identity; public Quaternion SpinOldOrientation = Quaternion.Identity;
[XmlIgnore]
public Quaternion m_APIDTarget = Quaternion.Identity;
[XmlIgnore]
public float m_APIDDamp = 0;
[XmlIgnore]
public float m_APIDStrength = 0;
/// <summary> /// <summary>
/// This part's inventory /// This part's inventory
/// </summary> /// </summary>
@ -232,6 +253,9 @@ namespace OpenSim.Region.Framework.Scenes
[XmlIgnore] [XmlIgnore]
public bool Undoing; public bool Undoing;
[XmlIgnore]
public bool IgnoreUndoUpdate = false;
[XmlIgnore] [XmlIgnore]
private PrimFlags LocalFlags; private PrimFlags LocalFlags;
[XmlIgnore] [XmlIgnore]
@ -253,6 +277,7 @@ namespace OpenSim.Region.Framework.Scenes
private string m_text = String.Empty; private string m_text = String.Empty;
private string m_touchName = String.Empty; private string m_touchName = String.Empty;
private readonly UndoStack<UndoState> m_undo = new UndoStack<UndoState>(5); private readonly UndoStack<UndoState> m_undo = new UndoStack<UndoState>(5);
private readonly UndoStack<UndoState> m_redo = new UndoStack<UndoState>(5);
private UUID _creatorID; private UUID _creatorID;
private bool m_passTouches; private bool m_passTouches;
@ -501,6 +526,27 @@ namespace OpenSim.Region.Framework.Scenes
} }
} }
[XmlIgnore]
public Quaternion APIDTarget
{
get { return m_APIDTarget; }
set { m_APIDTarget = value; }
}
[XmlIgnore]
public float APIDDamp
{
get { return m_APIDDamp; }
set { m_APIDDamp = value; }
}
[XmlIgnore]
public float APIDStrength
{
get { return m_APIDStrength; }
set { m_APIDStrength = value; }
}
public ulong RegionHandle public ulong RegionHandle
{ {
get { return m_regionHandle; } get { return m_regionHandle; }
@ -512,6 +558,33 @@ namespace OpenSim.Region.Framework.Scenes
get { return m_scriptAccessPin; } get { return m_scriptAccessPin; }
set { m_scriptAccessPin = (int)value; } set { m_scriptAccessPin = (int)value; }
} }
private SceneObjectPart m_PlaySoundMasterPrim = null;
public SceneObjectPart PlaySoundMasterPrim
{
get { return m_PlaySoundMasterPrim; }
set { m_PlaySoundMasterPrim = value; }
}
private List<SceneObjectPart> m_PlaySoundSlavePrims = new List<SceneObjectPart>();
public List<SceneObjectPart> PlaySoundSlavePrims
{
get { return m_LoopSoundSlavePrims; }
set { m_LoopSoundSlavePrims = value; }
}
private SceneObjectPart m_LoopSoundMasterPrim = null;
public SceneObjectPart LoopSoundMasterPrim
{
get { return m_LoopSoundMasterPrim; }
set { m_LoopSoundMasterPrim = value; }
}
private List<SceneObjectPart> m_LoopSoundSlavePrims = new List<SceneObjectPart>();
public List<SceneObjectPart> LoopSoundSlavePrims
{
get { return m_LoopSoundSlavePrims; }
set { m_LoopSoundSlavePrims = value; }
}
[XmlIgnore] [XmlIgnore]
public Byte[] TextureAnimation public Byte[] TextureAnimation
@ -573,8 +646,6 @@ namespace OpenSim.Region.Framework.Scenes
} }
set set
{ {
StoreUndoState();
m_groupPosition = value; m_groupPosition = value;
PhysicsActor actor = PhysActor; PhysicsActor actor = PhysActor;
@ -1401,6 +1472,10 @@ namespace OpenSim.Region.Framework.Scenes
{ {
m_undo.Clear(); m_undo.Clear();
} }
lock (m_redo)
{
m_redo.Clear();
}
StoreUndoState(); StoreUndoState();
} }
@ -1711,6 +1786,66 @@ namespace OpenSim.Region.Framework.Scenes
return m_parentGroup.RootPart.DIE_AT_EDGE; return m_parentGroup.RootPart.DIE_AT_EDGE;
} }
public bool GetReturnAtEdge()
{
if (m_parentGroup == null)
return false;
if (m_parentGroup.IsDeleted)
return false;
return m_parentGroup.RootPart.RETURN_AT_EDGE;
}
public void SetReturnAtEdge(bool p)
{
if (m_parentGroup == null)
return;
if (m_parentGroup.IsDeleted)
return;
m_parentGroup.RootPart.RETURN_AT_EDGE = p;
}
public bool GetBlockGrab()
{
if (m_parentGroup == null)
return false;
if (m_parentGroup.IsDeleted)
return false;
return m_parentGroup.RootPart.BlockGrab;
}
public void SetBlockGrab(bool p)
{
if (m_parentGroup == null)
return;
if (m_parentGroup.IsDeleted)
return;
m_parentGroup.RootPart.BlockGrab = p;
}
public void SetStatusSandbox(bool p)
{
if (m_parentGroup == null)
return;
if (m_parentGroup.IsDeleted)
return;
StatusSandboxPos = m_parentGroup.RootPart.AbsolutePosition;
m_parentGroup.RootPart.StatusSandbox = p;
}
public bool GetStatusSandbox()
{
if (m_parentGroup == null)
return false;
if (m_parentGroup.IsDeleted)
return false;
return m_parentGroup.RootPart.StatusSandbox;
}
public int GetAxisRotation(int axis) public int GetAxisRotation(int axis)
{ {
//Cannot use ScriptBaseClass constants as no referance to it currently. //Cannot use ScriptBaseClass constants as no referance to it currently.
@ -1917,7 +2052,7 @@ namespace OpenSim.Region.Framework.Scenes
// play the sound. // play the sound.
if (startedColliders.Count > 0 && CollisionSound != UUID.Zero && CollisionSoundVolume > 0.0f) if (startedColliders.Count > 0 && CollisionSound != UUID.Zero && CollisionSoundVolume > 0.0f)
{ {
SendSound(CollisionSound.ToString(), CollisionSoundVolume, true, (byte)0); SendSound(CollisionSound.ToString(), CollisionSoundVolume, true, (byte)0, 0, false, false);
} }
if ((m_parentGroup.RootPart.ScriptEvents & scriptEvents.collision_start) != 0) if ((m_parentGroup.RootPart.ScriptEvents & scriptEvents.collision_start) != 0)
@ -2491,9 +2626,8 @@ namespace OpenSim.Region.Framework.Scenes
List<ScenePresence> avatarts = m_parentGroup.Scene.GetAvatars(); List<ScenePresence> avatarts = m_parentGroup.Scene.GetAvatars();
foreach (ScenePresence p in avatarts) foreach (ScenePresence p in avatarts)
{ {
// TODO: some filtering by distance of avatar if (!(Util.GetDistanceTo(p.AbsolutePosition, AbsolutePosition) >= 100))
p.ControllingClient.SendPreLoadSound(objectID, objectID, soundID);
p.ControllingClient.SendPreLoadSound(objectID, objectID, soundID);
} }
} }
@ -2554,7 +2688,38 @@ namespace OpenSim.Region.Framework.Scenes
public void RotLookAt(Quaternion target, float strength, float damping) public void RotLookAt(Quaternion target, float strength, float damping)
{ {
m_parentGroup.rotLookAt(target, strength, damping); rotLookAt(target, strength, damping);
}
public void rotLookAt(Quaternion target, float strength, float damping)
{
if (IsAttachment)
{
/*
ScenePresence avatar = m_scene.GetScenePresence(rootpart.AttachedAvatar);
if (avatar != null)
{
Rotate the Av?
} */
}
else
{
APIDDamp = damping;
APIDStrength = strength;
APIDTarget = target;
}
}
public void startLookAt(Quaternion rot, float damp, float strength)
{
APIDDamp = damp;
APIDStrength = strength;
APIDTarget = rot;
}
public void stopLookAt()
{
APIDTarget = Quaternion.Identity;
} }
/// <summary> /// <summary>
@ -2814,7 +2979,7 @@ namespace OpenSim.Region.Framework.Scenes
/// <param name="volume"></param> /// <param name="volume"></param>
/// <param name="triggered"></param> /// <param name="triggered"></param>
/// <param name="flags"></param> /// <param name="flags"></param>
public void SendSound(string sound, double volume, bool triggered, byte flags) public void SendSound(string sound, double volume, bool triggered, byte flags, float radius, bool useMaster, bool isMaster)
{ {
if (volume > 1) if (volume > 1)
volume = 1; volume = 1;
@ -2850,10 +3015,51 @@ namespace OpenSim.Region.Framework.Scenes
ISoundModule soundModule = m_parentGroup.Scene.RequestModuleInterface<ISoundModule>(); ISoundModule soundModule = m_parentGroup.Scene.RequestModuleInterface<ISoundModule>();
if (soundModule != null) if (soundModule != null)
{ {
if (triggered) if (useMaster)
soundModule.TriggerSound(soundID, ownerID, objectID, parentID, volume, position, regionHandle); {
if (isMaster)
{
if (triggered)
soundModule.TriggerSound(soundID, ownerID, objectID, parentID, volume, position, regionHandle, radius);
else
soundModule.PlayAttachedSound(soundID, ownerID, objectID, volume, position, flags, radius);
ParentGroup.PlaySoundMasterPrim = this;
ownerID = this._ownerID;
objectID = this.UUID;
parentID = this.GetRootPartUUID();
position = this.AbsolutePosition; // region local
regionHandle = this.ParentGroup.Scene.RegionInfo.RegionHandle;
if (triggered)
soundModule.TriggerSound(soundID, ownerID, objectID, parentID, volume, position, regionHandle, radius);
else
soundModule.PlayAttachedSound(soundID, ownerID, objectID, volume, position, flags, radius);
foreach (SceneObjectPart prim in ParentGroup.PlaySoundSlavePrims)
{
ownerID = prim._ownerID;
objectID = prim.UUID;
parentID = prim.GetRootPartUUID();
position = prim.AbsolutePosition; // region local
regionHandle = prim.ParentGroup.Scene.RegionInfo.RegionHandle;
if (triggered)
soundModule.TriggerSound(soundID, ownerID, objectID, parentID, volume, position, regionHandle, radius);
else
soundModule.PlayAttachedSound(soundID, ownerID, objectID, volume, position, flags, radius);
}
ParentGroup.PlaySoundSlavePrims.Clear();
ParentGroup.PlaySoundMasterPrim = null;
}
else
{
ParentGroup.PlaySoundSlavePrims.Add(this);
}
}
else else
soundModule.PlayAttachedSound(soundID, ownerID, objectID, volume, position, flags); {
if (triggered)
soundModule.TriggerSound(soundID, ownerID, objectID, parentID, volume, position, regionHandle, radius);
else
soundModule.PlayAttachedSound(soundID, ownerID, objectID, volume, position, flags, radius);
}
} }
} }
@ -3156,6 +3362,14 @@ namespace OpenSim.Region.Framework.Scenes
hasProfileCut = hasDimple; // is it the same thing? hasProfileCut = hasDimple; // is it the same thing?
} }
public void SetVehicleFlags(int param, bool remove)
{
if (PhysActor != null)
{
PhysActor.VehicleFlags(param, remove);
}
}
public void SetGroup(UUID groupID, IClientAPI client) public void SetGroup(UUID groupID, IClientAPI client)
{ {
_groupID = groupID; _groupID = groupID;
@ -3260,27 +3474,30 @@ namespace OpenSim.Region.Framework.Scenes
{ {
if (!Undoing) if (!Undoing)
{ {
if (m_parentGroup != null) if (!IgnoreUndoUpdate)
{ {
lock (m_undo) if (m_parentGroup != null)
{ {
if (m_undo.Count > 0) lock (m_undo)
{ {
UndoState last = m_undo.Peek(); if (m_undo.Count > 0)
if (last != null)
{ {
if (last.Compare(this)) UndoState last = m_undo.Peek();
return; if (last != null)
{
if (last.Compare(this))
return;
}
} }
if (m_parentGroup.GetSceneMaxUndo() > 0)
{
UndoState nUndo = new UndoState(this);
m_undo.Push(nUndo);
}
} }
if (m_parentGroup.GetSceneMaxUndo() > 0)
{
UndoState nUndo = new UndoState(this);
m_undo.Push(nUndo);
}
} }
} }
} }
@ -3751,14 +3968,39 @@ namespace OpenSim.Region.Framework.Scenes
lock (m_undo) lock (m_undo)
{ {
if (m_undo.Count > 0) if (m_undo.Count > 0)
{
UndoState nUndo = null;
if (m_parentGroup.GetSceneMaxUndo() > 0)
{ {
UndoState goback = m_undo.Pop(); nUndo = new UndoState(this);
if (goback != null) }
goback.PlaybackState(this); UndoState goback = m_undo.Pop();
if (goback != null)
{
goback.PlaybackState(this);
if (nUndo != null)
m_redo.Push(nUndo);
}
} }
} }
} }
public void Redo()
{
lock (m_redo)
{
if (m_parentGroup.GetSceneMaxUndo() > 0)
{
UndoState nUndo = new UndoState(this);
m_undo.Push(nUndo);
}
UndoState gofwd = m_redo.Pop();
if (gofwd != null)
gofwd.PlayfwdState(this);
}
}
public void UpdateExtraParam(ushort type, bool inUse, byte[] data) public void UpdateExtraParam(ushort type, bool inUse, byte[] data)
{ {
m_shape.ReadInUpdateExtraParam(type, inUse, data); m_shape.ReadInUpdateExtraParam(type, inUse, data);
@ -3802,6 +4044,18 @@ namespace OpenSim.Region.Framework.Scenes
(pos.Z != OffsetPosition.Z)) (pos.Z != OffsetPosition.Z))
{ {
Vector3 newPos = new Vector3(pos.X, pos.Y, pos.Z); Vector3 newPos = new Vector3(pos.X, pos.Y, pos.Z);
if (ParentGroup.RootPart.GetStatusSandbox())
{
if (Util.GetDistanceTo(ParentGroup.RootPart.StatusSandboxPos, newPos) > 10)
{
ParentGroup.RootPart.ScriptSetPhysicsStatus(false);
newPos = OffsetPosition;
ParentGroup.Scene.SimChat(Utils.StringToBytes("Hit Sandbox Limit"),
ChatTypeEnum.DebugChannel, 0x7FFFFFFF, ParentGroup.RootPart.AbsolutePosition, Name, UUID, false);
}
}
OffsetPosition = newPos; OffsetPosition = newPos;
ScheduleTerseUpdate(); ScheduleTerseUpdate();
} }
@ -4094,7 +4348,6 @@ namespace OpenSim.Region.Framework.Scenes
(rot.Z != RotationOffset.Z) || (rot.Z != RotationOffset.Z) ||
(rot.W != RotationOffset.W)) (rot.W != RotationOffset.W))
{ {
//StoreUndoState();
RotationOffset = rot; RotationOffset = rot;
ParentGroup.HasGroupChanged = true; ParentGroup.HasGroupChanged = true;
ScheduleTerseUpdate(); ScheduleTerseUpdate();
@ -4396,5 +4649,36 @@ namespace OpenSim.Region.Framework.Scenes
Inventory.ApplyNextOwnerPermissions(); Inventory.ApplyNextOwnerPermissions();
} }
public void UpdateLookAt()
{
try
{
if (APIDTarget != Quaternion.Identity)
{
if (Single.IsNaN(APIDTarget.W) == true)
{
APIDTarget = Quaternion.Identity;
return;
}
Quaternion rot = RotationOffset;
Quaternion dir = (rot - APIDTarget);
float speed = ((APIDStrength / APIDDamp) * (float)(Math.PI / 180.0f));
if (dir.Z > speed)
{
rot.Z -= speed;
}
if (dir.Z < -speed)
{
rot.Z += speed;
}
rot.Normalize();
UpdateRotation(rot);
}
}
catch (Exception ex)
{
m_log.Error("[Physics] " + ex);
}
}
} }
} }

View File

@ -164,6 +164,8 @@ namespace OpenSim.Region.Framework.Scenes
private Quaternion m_bodyRot= Quaternion.Identity; private Quaternion m_bodyRot= Quaternion.Identity;
private Quaternion m_bodyRotPrevious = Quaternion.Identity;
private const int LAND_VELOCITYMAG_MAX = 12; private const int LAND_VELOCITYMAG_MAX = 12;
public bool IsRestrictedToRegion; public bool IsRestrictedToRegion;
@ -510,6 +512,12 @@ namespace OpenSim.Region.Framework.Scenes
set { m_bodyRot = value; } set { m_bodyRot = value; }
} }
public Quaternion PreviousRotation
{
get { return m_bodyRotPrevious; }
set { m_bodyRotPrevious = value; }
}
/// <summary> /// <summary>
/// If this is true, agent doesn't have a representation in this scene. /// If this is true, agent doesn't have a representation in this scene.
/// this is an agent 'looking into' this scene from a nearby scene(region) /// this is an agent 'looking into' this scene from a nearby scene(region)
@ -827,6 +835,31 @@ namespace OpenSim.Region.Framework.Scenes
{ {
Vector3 emergencyPos = new Vector3(((int)Constants.RegionSize * 0.5f), ((int)Constants.RegionSize * 0.5f), 128); Vector3 emergencyPos = new Vector3(((int)Constants.RegionSize * 0.5f), ((int)Constants.RegionSize * 0.5f), 128);
if (pos.X < 0)
{
emergencyPos.X = (int)Constants.RegionSize + pos.X;
if (!(pos.Y < 0))
emergencyPos.Y = pos.Y;
if (!(pos.Z < 0))
emergencyPos.X = pos.X;
}
if (pos.Y < 0)
{
emergencyPos.Y = (int)Constants.RegionSize + pos.Y;
if (!(pos.X < 0))
emergencyPos.X = pos.X;
if (!(pos.Z < 0))
emergencyPos.Z = pos.Z;
}
if (pos.Z < 0)
{
if (!(pos.X < 0))
emergencyPos.X = pos.X;
if (!(pos.Y < 0))
emergencyPos.Y = pos.Y;
//Leave as 128
}
m_log.WarnFormat( m_log.WarnFormat(
"[SCENE PRESENCE]: MakeRootAgent() was given an illegal position of {0} for avatar {1}, {2}. Substituting {3}", "[SCENE PRESENCE]: MakeRootAgent() was given an illegal position of {0} for avatar {1}, {2}. Substituting {3}",
pos, Name, UUID, emergencyPos); pos, Name, UUID, emergencyPos);
@ -1208,6 +1241,14 @@ namespace OpenSim.Region.Framework.Scenes
} }
else else
{ {
if (m_pos.X < 0)
m_pos.X = 128;
if (m_pos.Y < 0)
m_pos.Y = 128;
if (m_pos.X > Scene.WestBorders[0].BorderLine.X)
m_pos.X = 128;
if (m_pos.Y > Scene.NorthBorders[0].BorderLine.Y)
m_pos.Y = 128;
m_LastFinitePos = m_pos; m_LastFinitePos = m_pos;
} }
@ -2518,6 +2559,8 @@ namespace OpenSim.Region.Framework.Scenes
/// </summary> /// </summary>
public void SendWearables() public void SendWearables()
{ {
m_log.DebugFormat("[SCENE]: Received request for wearables of {0}", Name);
ControllingClient.SendWearables(m_appearance.Wearables, m_appearance.Serial++); ControllingClient.SendWearables(m_appearance.Wearables, m_appearance.Serial++);
} }
@ -2721,36 +2764,72 @@ namespace OpenSim.Region.Framework.Scenes
{ {
// Checks if where it's headed exists a region // Checks if where it's headed exists a region
bool needsTransit = false;
if (m_scene.TestBorderCross(pos2, Cardinals.W)) if (m_scene.TestBorderCross(pos2, Cardinals.W))
{ {
if (m_scene.TestBorderCross(pos2, Cardinals.S)) if (m_scene.TestBorderCross(pos2, Cardinals.S))
{
needsTransit = true;
neighbor = HaveNeighbor(Cardinals.SW, ref fix); neighbor = HaveNeighbor(Cardinals.SW, ref fix);
}
else if (m_scene.TestBorderCross(pos2, Cardinals.N)) else if (m_scene.TestBorderCross(pos2, Cardinals.N))
{
needsTransit = true;
neighbor = HaveNeighbor(Cardinals.NW, ref fix); neighbor = HaveNeighbor(Cardinals.NW, ref fix);
}
else else
{
needsTransit = true;
neighbor = HaveNeighbor(Cardinals.W, ref fix); neighbor = HaveNeighbor(Cardinals.W, ref fix);
}
} }
else if (m_scene.TestBorderCross(pos2, Cardinals.E)) else if (m_scene.TestBorderCross(pos2, Cardinals.E))
{ {
if (m_scene.TestBorderCross(pos2, Cardinals.S)) if (m_scene.TestBorderCross(pos2, Cardinals.S))
{
needsTransit = true;
neighbor = HaveNeighbor(Cardinals.SE, ref fix); neighbor = HaveNeighbor(Cardinals.SE, ref fix);
}
else if (m_scene.TestBorderCross(pos2, Cardinals.N)) else if (m_scene.TestBorderCross(pos2, Cardinals.N))
{
needsTransit = true;
neighbor = HaveNeighbor(Cardinals.NE, ref fix); neighbor = HaveNeighbor(Cardinals.NE, ref fix);
}
else else
{
needsTransit = true;
neighbor = HaveNeighbor(Cardinals.E, ref fix); neighbor = HaveNeighbor(Cardinals.E, ref fix);
}
} }
else if (m_scene.TestBorderCross(pos2, Cardinals.S)) else if (m_scene.TestBorderCross(pos2, Cardinals.S))
{
needsTransit = true;
neighbor = HaveNeighbor(Cardinals.S, ref fix); neighbor = HaveNeighbor(Cardinals.S, ref fix);
}
else if (m_scene.TestBorderCross(pos2, Cardinals.N)) else if (m_scene.TestBorderCross(pos2, Cardinals.N))
{
needsTransit = true;
neighbor = HaveNeighbor(Cardinals.N, ref fix); neighbor = HaveNeighbor(Cardinals.N, ref fix);
}
// Makes sure avatar does not end up outside region // Makes sure avatar does not end up outside region
if (neighbor < 0) if (neighbor <= 0)
AbsolutePosition = new Vector3( {
AbsolutePosition.X + 3*fix[0], if (!needsTransit)
AbsolutePosition.Y + 3*fix[1], {
AbsolutePosition.Z); Vector3 pos = AbsolutePosition;
if (AbsolutePosition.X < 0)
pos.X += Velocity.Y;
else if (AbsolutePosition.X > Constants.RegionSize)
pos.X -= Velocity.Y;
if (AbsolutePosition.Y < 0)
pos.Y += Velocity.Y;
else if (AbsolutePosition.Y > Constants.RegionSize)
pos.Y -= Velocity.Y;
AbsolutePosition = pos;
}
}
else if (neighbor > 0) else if (neighbor > 0)
CrossToNewRegion(); CrossToNewRegion();
} }

View File

@ -26,6 +26,7 @@
*/ */
using OpenMetaverse; using OpenMetaverse;
using OpenSim.Region.Framework.Interfaces;
namespace OpenSim.Region.Framework.Scenes namespace OpenSim.Region.Framework.Scenes
{ {
@ -35,29 +36,21 @@ namespace OpenSim.Region.Framework.Scenes
public Vector3 Scale = Vector3.Zero; public Vector3 Scale = Vector3.Zero;
public Quaternion Rotation = Quaternion.Identity; public Quaternion Rotation = Quaternion.Identity;
public UndoState(Vector3 pos, Quaternion rot, Vector3 scale)
{
Position = pos;
Rotation = rot;
Scale = scale;
}
public UndoState(SceneObjectPart part) public UndoState(SceneObjectPart part)
{ {
if (part != null) if (part != null)
{ {
if (part.ParentID == 0) if (part.ParentID == 0)
{ {
Position = part.AbsolutePosition; Position = part.ParentGroup.AbsolutePosition;
Rotation = part.RotationOffset; Rotation = part.RotationOffset;
Scale = part.Shape.Scale;
} }
else else
{ {
Position = part.OffsetPosition; Position = part.OffsetPosition;
Rotation = part.RotationOffset; Rotation = part.RotationOffset;
Scale = part.Shape.Scale; Scale = part.Shape.Scale;
} }
} }
} }
@ -68,7 +61,7 @@ namespace OpenSim.Region.Framework.Scenes
{ {
if (part.ParentID == 0) if (part.ParentID == 0)
{ {
if (Position == part.AbsolutePosition && Rotation == part.RotationOffset) if (Position == part.ParentGroup.AbsolutePosition && Rotation == part.ParentGroup.Rotation)
return true; return true;
else else
return false; return false;
@ -93,24 +86,78 @@ namespace OpenSim.Region.Framework.Scenes
if (part.ParentID == 0) if (part.ParentID == 0)
{ {
part.ParentGroup.AbsolutePosition = Position; if (Position != Vector3.Zero)
part.UpdateRotation(Rotation); part.ParentGroup.AbsolutePosition = Position;
part.RotationOffset = Rotation;
if (Scale != Vector3.Zero)
part.Resize(Scale);
part.ParentGroup.ScheduleGroupForTerseUpdate(); part.ParentGroup.ScheduleGroupForTerseUpdate();
} }
else else
{ {
part.OffsetPosition = Position; if (Position != Vector3.Zero)
part.OffsetPosition = Position;
part.UpdateRotation(Rotation); part.UpdateRotation(Rotation);
part.Resize(Scale); if (Scale != Vector3.Zero)
part.Resize(Scale); part.ScheduleTerseUpdate();
}
part.Undoing = false;
}
}
public void PlayfwdState(SceneObjectPart part)
{
if (part != null)
{
part.Undoing = true;
if (part.ParentID == 0)
{
if (Position != Vector3.Zero)
part.ParentGroup.AbsolutePosition = Position;
if (Rotation != Quaternion.Identity)
part.UpdateRotation(Rotation);
if (Scale != Vector3.Zero)
part.Resize(Scale);
part.ParentGroup.ScheduleGroupForTerseUpdate();
}
else
{
if (Position != Vector3.Zero)
part.OffsetPosition = Position;
if (Rotation != Quaternion.Identity)
part.UpdateRotation(Rotation);
if (Scale != Vector3.Zero)
part.Resize(Scale);
part.ScheduleTerseUpdate(); part.ScheduleTerseUpdate();
} }
part.Undoing = false; part.Undoing = false;
} }
} }
}
public class LandUndoState
{
public ITerrainModule m_terrainModule;
public ITerrainChannel m_terrainChannel;
public UndoState() public LandUndoState(ITerrainModule terrainModule, ITerrainChannel terrainChannel)
{ {
m_terrainModule = terrainModule;
m_terrainChannel = terrainChannel;
}
public bool Compare(ITerrainChannel terrainChannel)
{
if (m_terrainChannel != terrainChannel)
return false;
else
return false;
}
public void PlaybackState()
{
m_terrainModule.UndoTerrain(m_terrainChannel);
} }
} }
} }

View File

@ -780,6 +780,8 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server
public event UUIDNameRequest OnTeleportHomeRequest; public event UUIDNameRequest OnTeleportHomeRequest;
public event ScriptAnswer OnScriptAnswer; public event ScriptAnswer OnScriptAnswer;
public event AgentSit OnUndo; public event AgentSit OnUndo;
public event AgentSit OnRedo;
public event LandUndo OnLandUndo;
public event ForceReleaseControls OnForceReleaseControls; public event ForceReleaseControls OnForceReleaseControls;
public event GodLandStatRequest OnLandStatRequest; public event GodLandStatRequest OnLandStatRequest;
public event DetailedEstateDataRequest OnDetailedEstateDataRequest; public event DetailedEstateDataRequest OnDetailedEstateDataRequest;

View File

@ -767,7 +767,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
if (!CanEdit()) if (!CanEdit())
return; return;
GetSOP().SendSound(asset.ToString(), volume, true, 0); GetSOP().SendSound(asset.ToString(), volume, true, 0, 0, false, false);
} }
#endregion #endregion

View File

@ -231,7 +231,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
if (soundModule != null) if (soundModule != null)
{ {
soundModule.TriggerSound(audio, UUID.Zero, UUID.Zero, UUID.Zero, volume, position, soundModule.TriggerSound(audio, UUID.Zero, UUID.Zero, UUID.Zero, volume, position,
m_internalScene.RegionInfo.RegionHandle); m_internalScene.RegionInfo.RegionHandle, 0);
} }
} }
@ -241,7 +241,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
if (soundModule != null) if (soundModule != null)
{ {
soundModule.TriggerSound(audio, UUID.Zero, UUID.Zero, UUID.Zero, 1.0, position, soundModule.TriggerSound(audio, UUID.Zero, UUID.Zero, UUID.Zero, 1.0, position,
m_internalScene.RegionInfo.RegionHandle); m_internalScene.RegionInfo.RegionHandle, 0);
} }
} }

View File

@ -298,6 +298,8 @@ namespace OpenSim.Region.OptionalModules.World.NPC
public event ObjectBuy OnObjectBuy; public event ObjectBuy OnObjectBuy;
public event BuyObjectInventory OnBuyObjectInventory; public event BuyObjectInventory OnBuyObjectInventory;
public event AgentSit OnUndo; public event AgentSit OnUndo;
public event AgentSit OnRedo;
public event LandUndo OnLandUndo;
public event ForceReleaseControls OnForceReleaseControls; public event ForceReleaseControls OnForceReleaseControls;
public event GodLandStatRequest OnLandStatRequest; public event GodLandStatRequest OnLandStatRequest;

View File

@ -104,9 +104,9 @@ namespace OpenSim.Region.OptionalModules.World.TreePopulator
this.m_name = field[1].Trim(); this.m_name = field[1].Trim();
this.m_frozen = (copsedef[0] == 'F'); this.m_frozen = (copsedef[0] == 'F');
this.m_tree_quantity = int.Parse(field[2]); this.m_tree_quantity = int.Parse(field[2]);
this.m_treeline_high = float.Parse(field[3]); this.m_treeline_high = float.Parse(field[3], Culture.NumberFormatInfo);
this.m_treeline_low = float.Parse(field[4]); this.m_treeline_low = float.Parse(field[4], Culture.NumberFormatInfo);
this.m_range = double.Parse(field[5]); this.m_range = double.Parse(field[5], Culture.NumberFormatInfo);
this.m_tree_type = (Tree) Enum.Parse(typeof(Tree),field[6]); this.m_tree_type = (Tree) Enum.Parse(typeof(Tree),field[6]);
this.m_seed_point = Vector3.Parse(field[7]); this.m_seed_point = Vector3.Parse(field[7]);
this.m_initial_scale = Vector3.Parse(field[8]); this.m_initial_scale = Vector3.Parse(field[8]);

View File

@ -185,6 +185,11 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin
} }
public override void VehicleFlags(int param, bool remove)
{
}
public override void SetVolumeDetect(int param) public override void SetVolumeDetect(int param)
{ {

View File

@ -362,6 +362,11 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin
} }
public override void VehicleFlags(int param, bool remove)
{
}
public override void SetVolumeDetect(int param) public override void SetVolumeDetect(int param)
{ {

View File

@ -397,6 +397,11 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin
//TODO: //TODO:
} }
public override void VehicleFlags(int param, bool remove)
{
}
public override void SetVolumeDetect(int param) public override void SetVolumeDetect(int param)
{ {
//TODO: GhostObject //TODO: GhostObject

View File

@ -500,6 +500,18 @@ namespace OpenSim.Region.Physics.BulletXPlugin
public BulletXScene(String sceneIdentifier) public BulletXScene(String sceneIdentifier)
{ {
//identifier = sceneIdentifier; //identifier = sceneIdentifier;
cDispatcher = new CollisionDispatcherLocal(this);
Vector3 worldMinDim = new Vector3((float)minXY, (float)minXY, (float)minZ);
Vector3 worldMaxDim = new Vector3((float)maxXY, (float)maxXY, (float)maxZ);
opCache = new AxisSweep3(worldMinDim, worldMaxDim, maxHandles);
sicSolver = new SequentialImpulseConstraintSolver();
lock (BulletXLock)
{
ddWorld = new DiscreteDynamicsWorld(cDispatcher, opCache, sicSolver);
ddWorld.Gravity = new Vector3(0, 0, -gravity);
}
//this._heightmap = new float[65536];
} }
public static float Gravity public static float Gravity
@ -582,12 +594,12 @@ namespace OpenSim.Region.Physics.BulletXPlugin
pos.Y = position.Y; pos.Y = position.Y;
pos.Z = position.Z + 20; pos.Z = position.Z + 20;
BulletXCharacter newAv = null; BulletXCharacter newAv = null;
newAv.Flying = isFlying;
lock (BulletXLock) lock (BulletXLock)
{ {
newAv = new BulletXCharacter(avName, this, pos); newAv = new BulletXCharacter(avName, this, pos);
_characters.Add(newAv.RigidBody, newAv); _characters.Add(newAv.RigidBody, newAv);
} }
newAv.Flying = isFlying;
return newAv; return newAv;
} }
@ -985,6 +997,11 @@ namespace OpenSim.Region.Physics.BulletXPlugin
} }
public override void VehicleFlags(int param, bool remove)
{
}
public override void SetVolumeDetect(int param) public override void SetVolumeDetect(int param)
{ {

View File

@ -208,6 +208,7 @@ namespace OpenSim.Region.Physics.Manager
public abstract void VehicleFloatParam(int param, float value); public abstract void VehicleFloatParam(int param, float value);
public abstract void VehicleVectorParam(int param, Vector3 value); public abstract void VehicleVectorParam(int param, Vector3 value);
public abstract void VehicleRotationParam(int param, Quaternion rotation); public abstract void VehicleRotationParam(int param, Quaternion rotation);
public abstract void VehicleFlags(int param, bool remove);
public abstract void SetVolumeDetect(int param); // Allows the detection of collisions with inherently non-physical prims. see llVolumeDetect for more public abstract void SetVolumeDetect(int param); // Allows the detection of collisions with inherently non-physical prims. see llVolumeDetect for more
@ -352,6 +353,11 @@ namespace OpenSim.Region.Physics.Manager
} }
public override void VehicleFlags(int param, bool remove)
{
}
public override void SetVolumeDetect(int param) public override void SetVolumeDetect(int param)
{ {

View File

@ -91,7 +91,9 @@ namespace OpenSim.Region.Physics.Manager
BANKING_EFFICIENCY = 38, BANKING_EFFICIENCY = 38,
BANKING_MIX = 39, BANKING_MIX = 39,
BANKING_TIMESCALE = 40, BANKING_TIMESCALE = 40,
REFERENCE_FRAME = 44 REFERENCE_FRAME = 44,
BLOCK_EXIT = 45,
ROLL_FRAME = 46
} }
@ -107,7 +109,13 @@ namespace OpenSim.Region.Physics.Manager
LIMIT_MOTOR_UP = 64, LIMIT_MOTOR_UP = 64,
MOUSELOOK_STEER = 128, MOUSELOOK_STEER = 128,
MOUSELOOK_BANK = 256, MOUSELOOK_BANK = 256,
CAMERA_DECOUPLED = 512 CAMERA_DECOUPLED = 512,
NO_X = 1024,
NO_Y = 2048,
NO_Z = 4096,
LOCK_HOVER_HEIGHT = 8192,
NO_DEFLECTION = 16392,
LOCK_ROTATION = 32784
} }
} }

View File

@ -734,6 +734,11 @@ namespace OpenSim.Region.Physics.OdePlugin
} }
public override void VehicleFlags(int param, bool remove)
{
}
public override void SetVolumeDetect(int param) public override void SetVolumeDetect(int param)
{ {

View File

@ -82,7 +82,9 @@ namespace OpenSim.Region.Physics.OdePlugin
// HOVER_UP_ONLY // HOVER_UP_ONLY
// LIMIT_MOTOR_UP // LIMIT_MOTOR_UP
// LIMIT_ROLL_ONLY // LIMIT_ROLL_ONLY
private VehicleFlag m_Hoverflags = (VehicleFlag)0;
private Vector3 m_BlockingEndPoint = Vector3.Zero;
private Quaternion m_RollreferenceFrame = Quaternion.Identity;
// Linear properties // Linear properties
private Vector3 m_linearMotorDirection = Vector3.Zero; // velocity requested by LSL, decayed by time private Vector3 m_linearMotorDirection = Vector3.Zero; // velocity requested by LSL, decayed by time
private Vector3 m_linearMotorDirectionLASTSET = Vector3.Zero; // velocity requested by LSL private Vector3 m_linearMotorDirectionLASTSET = Vector3.Zero; // velocity requested by LSL
@ -91,6 +93,7 @@ namespace OpenSim.Region.Physics.OdePlugin
private float m_linearMotorDecayTimescale = 0; private float m_linearMotorDecayTimescale = 0;
private float m_linearMotorTimescale = 0; private float m_linearMotorTimescale = 0;
private Vector3 m_lastLinearVelocityVector = Vector3.Zero; private Vector3 m_lastLinearVelocityVector = Vector3.Zero;
private d.Vector3 m_lastPositionVector = new d.Vector3();
// private bool m_LinearMotorSetLastFrame = false; // private bool m_LinearMotorSetLastFrame = false;
// private Vector3 m_linearMotorOffset = Vector3.Zero; // private Vector3 m_linearMotorOffset = Vector3.Zero;
@ -255,6 +258,9 @@ namespace OpenSim.Region.Physics.OdePlugin
case Vehicle.LINEAR_MOTOR_OFFSET: case Vehicle.LINEAR_MOTOR_OFFSET:
// m_linearMotorOffset = new Vector3(pValue.X, pValue.Y, pValue.Z); // m_linearMotorOffset = new Vector3(pValue.X, pValue.Y, pValue.Z);
break; break;
case Vehicle.BLOCK_EXIT:
m_BlockingEndPoint = new Vector3(pValue.X, pValue.Y, pValue.Z);
break;
} }
}//end ProcessVectorVehicleParam }//end ProcessVectorVehicleParam
@ -265,15 +271,189 @@ namespace OpenSim.Region.Physics.OdePlugin
case Vehicle.REFERENCE_FRAME: case Vehicle.REFERENCE_FRAME:
// m_referenceFrame = pValue; // m_referenceFrame = pValue;
break; break;
case Vehicle.ROLL_FRAME:
m_RollreferenceFrame = pValue;
break;
} }
}//end ProcessRotationVehicleParam }//end ProcessRotationVehicleParam
internal void ProcessVehicleFlags(int pParam, bool remove)
{
if (remove)
{
if (pParam == -1)
{
m_flags = (VehicleFlag)0;
m_Hoverflags = (VehicleFlag)0;
return;
}
if ((pParam & (int)VehicleFlag.HOVER_GLOBAL_HEIGHT) == (int)VehicleFlag.HOVER_GLOBAL_HEIGHT)
{
if ((m_Hoverflags & VehicleFlag.HOVER_GLOBAL_HEIGHT) != (VehicleFlag)0)
m_Hoverflags &= ~(VehicleFlag.HOVER_GLOBAL_HEIGHT);
}
if ((pParam & (int)VehicleFlag.HOVER_TERRAIN_ONLY) == (int)VehicleFlag.HOVER_TERRAIN_ONLY)
{
if ((m_Hoverflags & VehicleFlag.HOVER_TERRAIN_ONLY) != (VehicleFlag)0)
m_Hoverflags &= ~(VehicleFlag.HOVER_TERRAIN_ONLY);
}
if ((pParam & (int)VehicleFlag.HOVER_UP_ONLY) == (int)VehicleFlag.HOVER_UP_ONLY)
{
if ((m_Hoverflags & VehicleFlag.HOVER_UP_ONLY) != (VehicleFlag)0)
m_Hoverflags &= ~(VehicleFlag.HOVER_UP_ONLY);
}
if ((pParam & (int)VehicleFlag.HOVER_WATER_ONLY) == (int)VehicleFlag.HOVER_WATER_ONLY)
{
if ((m_Hoverflags & VehicleFlag.HOVER_WATER_ONLY) != (VehicleFlag)0)
m_Hoverflags &= ~(VehicleFlag.HOVER_WATER_ONLY);
}
if ((pParam & (int)VehicleFlag.LIMIT_MOTOR_UP) == (int)VehicleFlag.LIMIT_MOTOR_UP)
{
if ((m_flags & VehicleFlag.LIMIT_MOTOR_UP) != (VehicleFlag)0)
m_flags &= ~(VehicleFlag.LIMIT_MOTOR_UP);
}
if ((pParam & (int)VehicleFlag.LIMIT_ROLL_ONLY) == (int)VehicleFlag.LIMIT_ROLL_ONLY)
{
if ((m_flags & VehicleFlag.LIMIT_ROLL_ONLY) != (VehicleFlag)0)
m_flags &= ~(VehicleFlag.LIMIT_ROLL_ONLY);
}
if ((pParam & (int)VehicleFlag.MOUSELOOK_BANK) == (int)VehicleFlag.MOUSELOOK_BANK)
{
if ((m_flags & VehicleFlag.MOUSELOOK_BANK) != (VehicleFlag)0)
m_flags &= ~(VehicleFlag.MOUSELOOK_BANK);
}
if ((pParam & (int)VehicleFlag.MOUSELOOK_STEER) == (int)VehicleFlag.MOUSELOOK_STEER)
{
if ((m_flags & VehicleFlag.MOUSELOOK_STEER) != (VehicleFlag)0)
m_flags &= ~(VehicleFlag.MOUSELOOK_STEER);
}
if ((pParam & (int)VehicleFlag.NO_DEFLECTION_UP) == (int)VehicleFlag.NO_DEFLECTION_UP)
{
if ((m_flags & VehicleFlag.NO_DEFLECTION_UP) != (VehicleFlag)0)
m_flags &= ~(VehicleFlag.NO_DEFLECTION_UP);
}
if ((pParam & (int)VehicleFlag.CAMERA_DECOUPLED) == (int)VehicleFlag.CAMERA_DECOUPLED)
{
if ((m_flags & VehicleFlag.CAMERA_DECOUPLED) != (VehicleFlag)0)
m_flags &= ~(VehicleFlag.CAMERA_DECOUPLED);
}
if ((pParam & (int)VehicleFlag.NO_X) == (int)VehicleFlag.NO_X)
{
if ((m_flags & VehicleFlag.NO_X) != (VehicleFlag)0)
m_flags &= ~(VehicleFlag.NO_X);
}
if ((pParam & (int)VehicleFlag.NO_Y) == (int)VehicleFlag.NO_Y)
{
if ((m_flags & VehicleFlag.NO_Y) != (VehicleFlag)0)
m_flags &= ~(VehicleFlag.NO_Y);
}
if ((pParam & (int)VehicleFlag.NO_Z) == (int)VehicleFlag.NO_Z)
{
if ((m_flags & VehicleFlag.NO_Z) != (VehicleFlag)0)
m_flags &= ~(VehicleFlag.NO_Z);
}
if ((pParam & (int)VehicleFlag.LOCK_HOVER_HEIGHT) == (int)VehicleFlag.LOCK_HOVER_HEIGHT)
{
if ((m_Hoverflags & VehicleFlag.LOCK_HOVER_HEIGHT) != (VehicleFlag)0)
m_Hoverflags &= ~(VehicleFlag.LOCK_HOVER_HEIGHT);
}
if ((pParam & (int)VehicleFlag.NO_DEFLECTION) == (int)VehicleFlag.NO_DEFLECTION)
{
if ((m_flags & VehicleFlag.NO_DEFLECTION) != (VehicleFlag)0)
m_flags &= ~(VehicleFlag.NO_DEFLECTION);
}
if ((pParam & (int)VehicleFlag.LOCK_ROTATION) == (int)VehicleFlag.LOCK_ROTATION)
{
if ((m_flags & VehicleFlag.LOCK_ROTATION) != (VehicleFlag)0)
m_flags &= ~(VehicleFlag.LOCK_ROTATION);
}
}
else
{
if ((pParam & (int)VehicleFlag.HOVER_GLOBAL_HEIGHT) == (int)VehicleFlag.HOVER_GLOBAL_HEIGHT)
{
m_Hoverflags |= (VehicleFlag.HOVER_GLOBAL_HEIGHT | m_flags);
}
if ((pParam & (int)VehicleFlag.HOVER_TERRAIN_ONLY) == (int)VehicleFlag.HOVER_TERRAIN_ONLY)
{
m_Hoverflags |= (VehicleFlag.HOVER_TERRAIN_ONLY | m_flags);
}
if ((pParam & (int)VehicleFlag.HOVER_UP_ONLY) == (int)VehicleFlag.HOVER_UP_ONLY)
{
m_Hoverflags |= (VehicleFlag.HOVER_UP_ONLY | m_flags);
}
if ((pParam & (int)VehicleFlag.HOVER_WATER_ONLY) == (int)VehicleFlag.HOVER_WATER_ONLY)
{
m_Hoverflags |= (VehicleFlag.HOVER_WATER_ONLY | m_flags);
}
if ((pParam & (int)VehicleFlag.LIMIT_MOTOR_UP) == (int)VehicleFlag.LIMIT_MOTOR_UP)
{
m_flags |= (VehicleFlag.LIMIT_MOTOR_UP | m_flags);
}
if ((pParam & (int)VehicleFlag.MOUSELOOK_BANK) == (int)VehicleFlag.MOUSELOOK_BANK)
{
m_flags |= (VehicleFlag.MOUSELOOK_BANK | m_flags);
}
if ((pParam & (int)VehicleFlag.MOUSELOOK_STEER) == (int)VehicleFlag.MOUSELOOK_STEER)
{
m_flags |= (VehicleFlag.MOUSELOOK_STEER | m_flags);
}
if ((pParam & (int)VehicleFlag.NO_DEFLECTION_UP) == (int)VehicleFlag.NO_DEFLECTION_UP)
{
m_flags |= (VehicleFlag.NO_DEFLECTION_UP | m_flags);
}
if ((pParam & (int)VehicleFlag.CAMERA_DECOUPLED) == (int)VehicleFlag.CAMERA_DECOUPLED)
{
m_flags |= (VehicleFlag.CAMERA_DECOUPLED | m_flags);
}
if ((pParam & (int)VehicleFlag.NO_X) == (int)VehicleFlag.NO_X)
{
m_flags |= (VehicleFlag.NO_X);
}
if ((pParam & (int)VehicleFlag.NO_Y) == (int)VehicleFlag.NO_Y)
{
m_flags |= (VehicleFlag.NO_Y);
}
if ((pParam & (int)VehicleFlag.NO_Z) == (int)VehicleFlag.NO_Z)
{
m_flags |= (VehicleFlag.NO_Z);
}
if ((pParam & (int)VehicleFlag.LOCK_HOVER_HEIGHT) == (int)VehicleFlag.LOCK_HOVER_HEIGHT)
{
m_Hoverflags |= (VehicleFlag.LOCK_HOVER_HEIGHT);
}
if ((pParam & (int)VehicleFlag.NO_DEFLECTION) == (int)VehicleFlag.NO_DEFLECTION)
{
m_flags |= (VehicleFlag.NO_DEFLECTION);
}
if ((pParam & (int)VehicleFlag.LOCK_ROTATION) == (int)VehicleFlag.LOCK_ROTATION)
{
m_flags |= (VehicleFlag.LOCK_ROTATION);
}
}
}//end ProcessVehicleFlags
internal void ProcessTypeChange(Vehicle pType) internal void ProcessTypeChange(Vehicle pType)
{ {
// Set Defaults For Type // Set Defaults For Type
m_type = pType; m_type = pType;
switch (pType) switch (pType)
{ {
case Vehicle.TYPE_NONE:
m_linearFrictionTimescale = new Vector3(0, 0, 0);
m_angularFrictionTimescale = new Vector3(0, 0, 0);
m_linearMotorDirection = Vector3.Zero;
m_linearMotorTimescale = 0;
m_linearMotorDecayTimescale = 0;
m_angularMotorDirection = Vector3.Zero;
m_angularMotorTimescale = 0;
m_angularMotorDecayTimescale = 0;
m_VhoverHeight = 0;
m_VhoverTimescale = 0;
m_VehicleBuoyancy = 0;
m_flags = (VehicleFlag)0;
break;
case Vehicle.TYPE_SLED: case Vehicle.TYPE_SLED:
m_linearFrictionTimescale = new Vector3(30, 1, 1000); m_linearFrictionTimescale = new Vector3(30, 1, 1000);
m_angularFrictionTimescale = new Vector3(1000, 1000, 1000); m_angularFrictionTimescale = new Vector3(1000, 1000, 1000);
@ -295,9 +475,9 @@ namespace OpenSim.Region.Physics.OdePlugin
// m_bankingMix = 1; // m_bankingMix = 1;
// m_bankingTimescale = 10; // m_bankingTimescale = 10;
// m_referenceFrame = Quaternion.Identity; // m_referenceFrame = Quaternion.Identity;
m_flags &= m_Hoverflags &=
~(VehicleFlag.HOVER_WATER_ONLY | VehicleFlag.HOVER_TERRAIN_ONLY | ~(VehicleFlag.HOVER_WATER_ONLY | VehicleFlag.HOVER_TERRAIN_ONLY |
VehicleFlag.HOVER_GLOBAL_HEIGHT | VehicleFlag.HOVER_UP_ONLY); VehicleFlag.HOVER_GLOBAL_HEIGHT | VehicleFlag.HOVER_UP_ONLY);
m_flags |= (VehicleFlag.NO_DEFLECTION_UP | VehicleFlag.LIMIT_ROLL_ONLY | VehicleFlag.LIMIT_MOTOR_UP); m_flags |= (VehicleFlag.NO_DEFLECTION_UP | VehicleFlag.LIMIT_ROLL_ONLY | VehicleFlag.LIMIT_MOTOR_UP);
break; break;
case Vehicle.TYPE_CAR: case Vehicle.TYPE_CAR:
@ -323,9 +503,10 @@ namespace OpenSim.Region.Physics.OdePlugin
// m_bankingMix = 1; // m_bankingMix = 1;
// m_bankingTimescale = 1; // m_bankingTimescale = 1;
// m_referenceFrame = Quaternion.Identity; // m_referenceFrame = Quaternion.Identity;
m_flags &= ~(VehicleFlag.HOVER_WATER_ONLY | VehicleFlag.HOVER_TERRAIN_ONLY | VehicleFlag.HOVER_GLOBAL_HEIGHT); m_Hoverflags &= ~(VehicleFlag.HOVER_WATER_ONLY | VehicleFlag.HOVER_TERRAIN_ONLY | VehicleFlag.HOVER_GLOBAL_HEIGHT);
m_flags |= (VehicleFlag.NO_DEFLECTION_UP | VehicleFlag.LIMIT_ROLL_ONLY | VehicleFlag.HOVER_UP_ONLY | m_flags |= (VehicleFlag.NO_DEFLECTION_UP | VehicleFlag.LIMIT_ROLL_ONLY |
VehicleFlag.LIMIT_MOTOR_UP); VehicleFlag.LIMIT_MOTOR_UP);
m_Hoverflags |= (VehicleFlag.HOVER_UP_ONLY);
break; break;
case Vehicle.TYPE_BOAT: case Vehicle.TYPE_BOAT:
m_linearFrictionTimescale = new Vector3(10, 3, 2); m_linearFrictionTimescale = new Vector3(10, 3, 2);
@ -350,10 +531,12 @@ namespace OpenSim.Region.Physics.OdePlugin
// m_bankingMix = 0.8f; // m_bankingMix = 0.8f;
// m_bankingTimescale = 1; // m_bankingTimescale = 1;
// m_referenceFrame = Quaternion.Identity; // m_referenceFrame = Quaternion.Identity;
m_flags &= ~(VehicleFlag.HOVER_TERRAIN_ONLY | VehicleFlag.LIMIT_ROLL_ONLY | m_Hoverflags &= ~(VehicleFlag.HOVER_TERRAIN_ONLY |
VehicleFlag.HOVER_GLOBAL_HEIGHT | VehicleFlag.HOVER_UP_ONLY); VehicleFlag.HOVER_GLOBAL_HEIGHT | VehicleFlag.HOVER_UP_ONLY);
m_flags |= (VehicleFlag.NO_DEFLECTION_UP | VehicleFlag.HOVER_WATER_ONLY | m_flags &= ~(VehicleFlag.LIMIT_ROLL_ONLY);
m_flags |= (VehicleFlag.NO_DEFLECTION_UP |
VehicleFlag.LIMIT_MOTOR_UP); VehicleFlag.LIMIT_MOTOR_UP);
m_Hoverflags |= (VehicleFlag.HOVER_WATER_ONLY);
break; break;
case Vehicle.TYPE_AIRPLANE: case Vehicle.TYPE_AIRPLANE:
m_linearFrictionTimescale = new Vector3(200, 10, 5); m_linearFrictionTimescale = new Vector3(200, 10, 5);
@ -378,8 +561,9 @@ namespace OpenSim.Region.Physics.OdePlugin
// m_bankingMix = 0.7f; // m_bankingMix = 0.7f;
// m_bankingTimescale = 2; // m_bankingTimescale = 2;
// m_referenceFrame = Quaternion.Identity; // m_referenceFrame = Quaternion.Identity;
m_flags &= ~(VehicleFlag.NO_DEFLECTION_UP | VehicleFlag.HOVER_WATER_ONLY | VehicleFlag.HOVER_TERRAIN_ONLY | m_Hoverflags &= ~(VehicleFlag.HOVER_WATER_ONLY | VehicleFlag.HOVER_TERRAIN_ONLY |
VehicleFlag.HOVER_GLOBAL_HEIGHT | VehicleFlag.HOVER_UP_ONLY | VehicleFlag.LIMIT_MOTOR_UP); VehicleFlag.HOVER_GLOBAL_HEIGHT | VehicleFlag.HOVER_UP_ONLY);
m_flags &= ~(VehicleFlag.NO_DEFLECTION_UP | VehicleFlag.LIMIT_MOTOR_UP);
m_flags |= (VehicleFlag.LIMIT_ROLL_ONLY); m_flags |= (VehicleFlag.LIMIT_ROLL_ONLY);
break; break;
case Vehicle.TYPE_BALLOON: case Vehicle.TYPE_BALLOON:
@ -405,9 +589,11 @@ namespace OpenSim.Region.Physics.OdePlugin
// m_bankingMix = 0.7f; // m_bankingMix = 0.7f;
// m_bankingTimescale = 5; // m_bankingTimescale = 5;
// m_referenceFrame = Quaternion.Identity; // m_referenceFrame = Quaternion.Identity;
m_flags &= ~(VehicleFlag.NO_DEFLECTION_UP | VehicleFlag.HOVER_WATER_ONLY | VehicleFlag.HOVER_TERRAIN_ONLY | m_Hoverflags &= ~(VehicleFlag.HOVER_WATER_ONLY | VehicleFlag.HOVER_TERRAIN_ONLY |
VehicleFlag.HOVER_UP_ONLY | VehicleFlag.LIMIT_MOTOR_UP); VehicleFlag.HOVER_UP_ONLY);
m_flags |= (VehicleFlag.LIMIT_ROLL_ONLY | VehicleFlag.HOVER_GLOBAL_HEIGHT); m_flags &= ~(VehicleFlag.NO_DEFLECTION_UP | VehicleFlag.LIMIT_MOTOR_UP);
m_flags |= (VehicleFlag.LIMIT_ROLL_ONLY);
m_Hoverflags |= (VehicleFlag.HOVER_GLOBAL_HEIGHT);
break; break;
} }
@ -431,6 +617,7 @@ namespace OpenSim.Region.Physics.OdePlugin
MoveLinear(pTimestep, pParentScene); MoveLinear(pTimestep, pParentScene);
MoveAngular(pTimestep); MoveAngular(pTimestep);
LimitRotation(pTimestep);
}// end Step }// end Step
private void MoveLinear(float pTimestep, OdeScene _pParentScene) private void MoveLinear(float pTimestep, OdeScene _pParentScene)
@ -477,61 +664,152 @@ namespace OpenSim.Region.Physics.OdePlugin
// .Z velocity and gravity. Therefore only 0g will used script-requested // .Z velocity and gravity. Therefore only 0g will used script-requested
// .Z velocity. >0g (m_VehicleBuoyancy < 1) will used modified gravity only. // .Z velocity. >0g (m_VehicleBuoyancy < 1) will used modified gravity only.
Vector3 grav = Vector3.Zero; Vector3 grav = Vector3.Zero;
if (m_VehicleBuoyancy < 1.0f) // There is some gravity, make a gravity force vector
// that is applied after object velocity.
d.Mass objMass;
d.BodyGetMass(Body, out objMass);
// m_VehicleBuoyancy: -1=2g; 0=1g; 1=0g;
grav.Z = _pParentScene.gravityz * objMass.mass * (1f - m_VehicleBuoyancy);
// Preserve the current Z velocity
d.Vector3 vel_now = d.BodyGetLinearVel(Body);
m_dir.Z = vel_now.Z; // Preserve the accumulated falling velocity
d.Vector3 pos = d.BodyGetPosition(Body);
Vector3 accel = new Vector3(-(m_dir.X - m_lastLinearVelocityVector.X / 0.1f), -(m_dir.Y - m_lastLinearVelocityVector.Y / 0.1f), m_dir.Z - m_lastLinearVelocityVector.Z / 0.1f);
Vector3 posChange = new Vector3();
posChange.X = pos.X - m_lastPositionVector.X;
posChange.Y = pos.Y - m_lastPositionVector.Y;
posChange.Z = pos.Z - m_lastPositionVector.Z;
double Zchange = Math.Abs(posChange.Z);
if (m_BlockingEndPoint != Vector3.Zero)
{ {
// There is some gravity, make a gravity force vector if (pos.X >= (m_BlockingEndPoint.X - (float)1))
// that is applied after object velocity. {
d.Mass objMass; pos.X -= posChange.X + 1;
d.BodyGetMass(Body, out objMass); d.BodySetPosition(Body, pos.X, pos.Y, pos.Z);
// m_VehicleBuoyancy: -1=2g; 0=1g; 1=0g; }
grav.Z = _pParentScene.gravityz * objMass.mass * (1f - m_VehicleBuoyancy); if (pos.Y >= (m_BlockingEndPoint.Y - (float)1))
// Preserve the current Z velocity {
d.Vector3 vel_now = d.BodyGetLinearVel(Body); pos.Y -= posChange.Y + 1;
m_dir.Z = vel_now.Z; // Preserve the accumulated falling velocity d.BodySetPosition(Body, pos.X, pos.Y, pos.Z);
} // else its 1.0, no gravity. }
if (pos.Z >= (m_BlockingEndPoint.Z - (float)1))
{
pos.Z -= posChange.Z + 1;
d.BodySetPosition(Body, pos.X, pos.Y, pos.Z);
}
if (pos.X <= 0)
{
pos.X += posChange.X + 1;
d.BodySetPosition(Body, pos.X, pos.Y, pos.Z);
}
if (pos.Y <= 0)
{
pos.Y += posChange.Y + 1;
d.BodySetPosition(Body, pos.X, pos.Y, pos.Z);
}
}
if (pos.Z < _pParentScene.GetTerrainHeightAtXY(pos.X, pos.Y))
{
pos.Z = _pParentScene.GetTerrainHeightAtXY(pos.X, pos.Y) + 2;
d.BodySetPosition(Body, pos.X, pos.Y, pos.Z);
}
// Check if hovering // Check if hovering
if ((m_flags & (VehicleFlag.HOVER_WATER_ONLY | VehicleFlag.HOVER_TERRAIN_ONLY | VehicleFlag.HOVER_GLOBAL_HEIGHT)) != 0) if ((m_Hoverflags & (VehicleFlag.HOVER_WATER_ONLY | VehicleFlag.HOVER_TERRAIN_ONLY | VehicleFlag.HOVER_GLOBAL_HEIGHT)) != 0)
{ {
// We should hover, get the target height // We should hover, get the target height
d.Vector3 pos = d.BodyGetPosition(Body); if ((m_Hoverflags & VehicleFlag.HOVER_WATER_ONLY) != 0)
if ((m_flags & VehicleFlag.HOVER_WATER_ONLY) == VehicleFlag.HOVER_WATER_ONLY)
{ {
m_VhoverTargetHeight = _pParentScene.GetWaterLevel() + m_VhoverHeight; m_VhoverTargetHeight = _pParentScene.GetWaterLevel() + m_VhoverHeight;
} }
else if ((m_flags & VehicleFlag.HOVER_TERRAIN_ONLY) == VehicleFlag.HOVER_TERRAIN_ONLY) if ((m_Hoverflags & VehicleFlag.HOVER_TERRAIN_ONLY) != 0)
{ {
m_VhoverTargetHeight = _pParentScene.GetTerrainHeightAtXY(pos.X, pos.Y) + m_VhoverHeight; m_VhoverTargetHeight = _pParentScene.GetTerrainHeightAtXY(pos.X, pos.Y) + m_VhoverHeight;
} }
else if ((m_flags & VehicleFlag.HOVER_GLOBAL_HEIGHT) == VehicleFlag.HOVER_GLOBAL_HEIGHT) if ((m_Hoverflags & VehicleFlag.HOVER_GLOBAL_HEIGHT) != 0)
{ {
m_VhoverTargetHeight = m_VhoverHeight; m_VhoverTargetHeight = m_VhoverHeight;
} }
if ((m_flags & VehicleFlag.HOVER_UP_ONLY) == VehicleFlag.HOVER_UP_ONLY) if ((m_Hoverflags & VehicleFlag.HOVER_UP_ONLY) != 0)
{ {
// If body is aready heigher, use its height as target height // If body is aready heigher, use its height as target height
if (pos.Z > m_VhoverTargetHeight) m_VhoverTargetHeight = pos.Z; if (pos.Z > m_VhoverTargetHeight) m_VhoverTargetHeight = pos.Z;
} }
if ((m_Hoverflags & VehicleFlag.LOCK_HOVER_HEIGHT) != 0)
{
if ((pos.Z - m_VhoverTargetHeight) > .2 || (pos.Z - m_VhoverTargetHeight) < -.2)
{
d.BodySetPosition(Body, pos.X, pos.Y, m_VhoverTargetHeight);
}
}
else
{
float herr0 = pos.Z - m_VhoverTargetHeight;
// Replace Vertical speed with correction figure if significant
if (Math.Abs(herr0) > 0.01f)
{
m_dir.Z = -((herr0 * pTimestep * 50.0f) / m_VhoverTimescale);
//KF: m_VhoverEfficiency is not yet implemented
}
else
{
m_dir.Z = 0f;
}
}
// m_VhoverEfficiency = 0f; // 0=boucy, 1=Crit.damped // m_VhoverEfficiency = 0f; // 0=boucy, 1=Crit.damped
// m_VhoverTimescale = 0f; // time to acheive height // m_VhoverTimescale = 0f; // time to acheive height
// pTimestep is time since last frame,in secs // pTimestep is time since last frame,in secs
float herr0 = pos.Z - m_VhoverTargetHeight;
// Replace Vertical speed with correction figure if significant
if (Math.Abs(herr0) > 0.01f)
{
d.Mass objMass;
d.BodyGetMass(Body, out objMass);
m_dir.Z = - ((herr0 * pTimestep * 50.0f) / m_VhoverTimescale);
//KF: m_VhoverEfficiency is not yet implemented
}
else
{
m_dir.Z = 0f;
}
} }
if ((m_flags & (VehicleFlag.LIMIT_MOTOR_UP)) != 0)
{
//Start Experimental Values
if (Zchange > .3)
{
grav.Z = (float)(grav.Z * 3);
}
if (Zchange > .15)
{
grav.Z = (float)(grav.Z * 2);
}
if (Zchange > .75)
{
grav.Z = (float)(grav.Z * 1.5);
}
if (Zchange > .05)
{
grav.Z = (float)(grav.Z * 1.25);
}
if (Zchange > .025)
{
grav.Z = (float)(grav.Z * 1.125);
}
float terraintemp = _pParentScene.GetTerrainHeightAtXY(pos.X, pos.Y);
float postemp = (pos.Z - terraintemp);
if (postemp > 2.5f)
{
grav.Z = (float)(grav.Z * 1.037125);
}
//End Experimental Values
}
if ((m_flags & (VehicleFlag.NO_X)) != 0)
{
m_dir.X = 0;
}
if ((m_flags & (VehicleFlag.NO_Y)) != 0)
{
m_dir.Y = 0;
}
if ((m_flags & (VehicleFlag.NO_Z)) != 0)
{
m_dir.Z = 0;
}
m_lastPositionVector = d.BodyGetPosition(Body);
// Apply velocity // Apply velocity
d.BodySetLinearVel(Body, m_dir.X, m_dir.Y, m_dir.Z); d.BodySetLinearVel(Body, m_dir.X, m_dir.Y, m_dir.Z);
// apply gravity force // apply gravity force
@ -630,6 +908,12 @@ namespace OpenSim.Region.Physics.OdePlugin
// Sum velocities // Sum velocities
m_lastAngularVelocity = m_angularMotorVelocity + vertattr; // + bank + deflection m_lastAngularVelocity = m_angularMotorVelocity + vertattr; // + bank + deflection
if ((m_flags & (VehicleFlag.NO_DEFLECTION_UP)) != 0)
{
m_lastAngularVelocity.X = 0;
m_lastAngularVelocity.Y = 0;
}
if (!m_lastAngularVelocity.ApproxEquals(Vector3.Zero, 0.01f)) if (!m_lastAngularVelocity.ApproxEquals(Vector3.Zero, 0.01f))
{ {
if (!d.BodyIsEnabled (Body)) d.BodyEnable (Body); if (!d.BodyIsEnabled (Body)) d.BodyEnable (Body);
@ -647,5 +931,44 @@ namespace OpenSim.Region.Physics.OdePlugin
d.BodySetAngularVel (Body, m_lastAngularVelocity.X, m_lastAngularVelocity.Y, m_lastAngularVelocity.Z); d.BodySetAngularVel (Body, m_lastAngularVelocity.X, m_lastAngularVelocity.Y, m_lastAngularVelocity.Z);
} //end MoveAngular } //end MoveAngular
internal void LimitRotation(float timestep)
{
d.Quaternion rot = d.BodyGetQuaternion(Body);
Quaternion rotq = new Quaternion(rot.X, rot.Y, rot.Z, rot.W); // rotq = rotation of object
d.Quaternion m_rot = new d.Quaternion();
bool changed = false;
m_rot.X = rotq.X;
m_rot.Y = rotq.Y;
m_rot.Z = rotq.Z;
m_rot.W = rotq.W;
if (m_RollreferenceFrame != Quaternion.Identity)
{
if (rotq.X >= m_RollreferenceFrame.X)
{
m_rot.X = rotq.X - (m_RollreferenceFrame.X / 2);
}
if (rotq.Y >= m_RollreferenceFrame.Y)
{
m_rot.Y = rotq.Y - (m_RollreferenceFrame.Y / 2);
}
if (rotq.X <= -m_RollreferenceFrame.X)
{
m_rot.X = rotq.X + (m_RollreferenceFrame.X / 2);
}
if (rotq.Y <= -m_RollreferenceFrame.Y)
{
m_rot.Y = rotq.Y + (m_RollreferenceFrame.Y / 2);
}
changed = true;
}
if ((m_flags & VehicleFlag.LOCK_ROTATION) != 0)
{
m_rot.X = 0;
m_rot.Y = 0;
changed = true;
}
if (changed)
d.BodySetQuaternion(Body, ref m_rot);
}
} }
} }

View File

@ -2355,6 +2355,11 @@ Console.WriteLine(" JointCreateFixed");
m_vehicle.ProcessRotationVehicleParam((Vehicle) param, rotation); m_vehicle.ProcessRotationVehicleParam((Vehicle) param, rotation);
} }
public override void VehicleFlags(int param, bool remove)
{
m_vehicle.ProcessVehicleFlags(param, remove);
}
public override void SetVolumeDetect(int param) public override void SetVolumeDetect(int param)
{ {
lock (_parent_scene.OdeLock) lock (_parent_scene.OdeLock)

View File

@ -182,6 +182,8 @@ namespace OpenSim.Region.Physics.POSPlugin
} }
public override void VehicleFlags(int param, bool remove) { }
public override void SetVolumeDetect(int param) public override void SetVolumeDetect(int param)
{ {

View File

@ -139,6 +139,8 @@ namespace OpenSim.Region.Physics.POSPlugin
} }
public override void VehicleFlags(int param, bool remove) { }
public override void SetVolumeDetect(int param) public override void SetVolumeDetect(int param)
{ {

View File

@ -371,6 +371,8 @@ namespace OpenSim.Region.Physics.PhysXPlugin
} }
public override void VehicleFlags(int param, bool remove) { }
public override void SetVolumeDetect(int param) public override void SetVolumeDetect(int param)
{ {
@ -775,6 +777,8 @@ namespace OpenSim.Region.Physics.PhysXPlugin
} }
public override void VehicleFlags(int param, bool remove) { }
public override void SetVolumeDetect(int param) public override void SetVolumeDetect(int param)
{ {

View File

@ -1182,7 +1182,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
if ((status & ScriptBaseClass.STATUS_BLOCK_GRAB) == ScriptBaseClass.STATUS_BLOCK_GRAB) if ((status & ScriptBaseClass.STATUS_BLOCK_GRAB) == ScriptBaseClass.STATUS_BLOCK_GRAB)
{ {
NotImplemented("llSetStatus - STATUS_BLOCK_GRAB"); if (value != 0)
m_host.SetBlockGrab(true);
else
m_host.SetBlockGrab(false);
} }
if ((status & ScriptBaseClass.STATUS_DIE_AT_EDGE) == ScriptBaseClass.STATUS_DIE_AT_EDGE) if ((status & ScriptBaseClass.STATUS_DIE_AT_EDGE) == ScriptBaseClass.STATUS_DIE_AT_EDGE)
@ -1195,12 +1198,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
if ((status & ScriptBaseClass.STATUS_RETURN_AT_EDGE) == ScriptBaseClass.STATUS_RETURN_AT_EDGE) if ((status & ScriptBaseClass.STATUS_RETURN_AT_EDGE) == ScriptBaseClass.STATUS_RETURN_AT_EDGE)
{ {
NotImplemented("llSetStatus - STATUS_RETURN_AT_EDGE"); if (value != 0)
m_host.SetReturnAtEdge(true);
else
m_host.SetReturnAtEdge(false);
} }
if ((status & ScriptBaseClass.STATUS_SANDBOX) == ScriptBaseClass.STATUS_SANDBOX) if ((status & ScriptBaseClass.STATUS_SANDBOX) == ScriptBaseClass.STATUS_SANDBOX)
{ {
NotImplemented("llSetStatus - STATUS_SANDBOX"); if (value != 0)
m_host.SetStatusSandbox(true);
else
m_host.SetStatusSandbox(false);
} }
if (statusrotationaxis != 0) if (statusrotationaxis != 0)
@ -1237,8 +1246,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
return 0; return 0;
case ScriptBaseClass.STATUS_BLOCK_GRAB: case ScriptBaseClass.STATUS_BLOCK_GRAB:
NotImplemented("llGetStatus - STATUS_BLOCK_GRAB"); if (m_host.GetBlockGrab())
return 0; return 1;
else
return 0;
case ScriptBaseClass.STATUS_DIE_AT_EDGE: case ScriptBaseClass.STATUS_DIE_AT_EDGE:
if (m_host.GetDieAtEdge()) if (m_host.GetDieAtEdge())
@ -1247,24 +1258,34 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
return 0; return 0;
case ScriptBaseClass.STATUS_RETURN_AT_EDGE: case ScriptBaseClass.STATUS_RETURN_AT_EDGE:
NotImplemented("llGetStatus - STATUS_RETURN_AT_EDGE"); if (m_host.GetReturnAtEdge())
return 0; return 1;
else
return 0;
case ScriptBaseClass.STATUS_ROTATE_X: case ScriptBaseClass.STATUS_ROTATE_X:
NotImplemented("llGetStatus - STATUS_ROTATE_X"); if (m_host.GetAxisRotation(2) == 2)
return 0; return 1;
else
return 0;
case ScriptBaseClass.STATUS_ROTATE_Y: case ScriptBaseClass.STATUS_ROTATE_Y:
NotImplemented("llGetStatus - STATUS_ROTATE_Y"); if (m_host.GetAxisRotation(4) == 4)
return 0; return 1;
else
return 0;
case ScriptBaseClass.STATUS_ROTATE_Z: case ScriptBaseClass.STATUS_ROTATE_Z:
NotImplemented("llGetStatus - STATUS_ROTATE_Z"); if (m_host.GetAxisRotation(8) == 8)
return 0; return 1;
else
return 0;
case ScriptBaseClass.STATUS_SANDBOX: case ScriptBaseClass.STATUS_SANDBOX:
NotImplemented("llGetStatus - STATUS_SANDBOX"); if (m_host.GetStatusSandbox())
return 0; return 1;
else
return 0;
} }
return 0; return 0;
} }
@ -2202,7 +2223,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
// send the sound, once, to all clients in range // send the sound, once, to all clients in range
m_host.SendSound(KeyOrName(sound).ToString(), volume, false, 0); m_host.SendSound(KeyOrName(sound).ToString(), volume, false, 0, 0, false, false);
} }
// Xantor 20080528 we should do this differently. // Xantor 20080528 we should do this differently.
@ -2232,42 +2253,98 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
public void llLoopSoundMaster(string sound, double volume) public void llLoopSoundMaster(string sound, double volume)
{ {
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
NotImplemented("llLoopSoundMaster"); m_host.ParentGroup.LoopSoundMasterPrim = m_host;
lock (m_host.ParentGroup.LoopSoundSlavePrims)
{
foreach (SceneObjectPart prim in m_host.ParentGroup.LoopSoundSlavePrims)
{
if (prim.Sound != UUID.Zero)
llStopSound();
prim.Sound = KeyOrName(sound);
prim.SoundGain = volume;
prim.SoundFlags = 1; // looping
prim.SoundRadius = 20; // Magic number, 20 seems reasonable. Make configurable?
prim.ScheduleFullUpdate();
prim.SendFullUpdateToAllClients();
}
}
if (m_host.Sound != UUID.Zero)
llStopSound();
m_host.Sound = KeyOrName(sound);
m_host.SoundGain = volume;
m_host.SoundFlags = 1; // looping
m_host.SoundRadius = 20; // Magic number, 20 seems reasonable. Make configurable?
m_host.ScheduleFullUpdate();
m_host.SendFullUpdateToAllClients();
} }
public void llLoopSoundSlave(string sound, double volume) public void llLoopSoundSlave(string sound, double volume)
{ {
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
NotImplemented("llLoopSoundSlave"); lock (m_host.ParentGroup.LoopSoundSlavePrims)
{
m_host.ParentGroup.LoopSoundSlavePrims.Add(m_host);
}
} }
public void llPlaySoundSlave(string sound, double volume) public void llPlaySoundSlave(string sound, double volume)
{ {
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
NotImplemented("llPlaySoundSlave");
// send the sound, once, to all clients in range
m_host.SendSound(KeyOrName(sound).ToString(), volume, false, 0, 0, true, false);
} }
public void llTriggerSound(string sound, double volume) public void llTriggerSound(string sound, double volume)
{ {
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
// send the sound, once, to all clients in range // send the sound, once, to all clients in range
m_host.SendSound(KeyOrName(sound).ToString(), volume, true, 0); m_host.SendSound(KeyOrName(sound).ToString(), volume, true, 0, 0, false, false);
} }
// Xantor 20080528: Clear prim data of sound instead // Xantor 20080528: Clear prim data of sound instead
public void llStopSound() public void llStopSound()
{ {
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
if (m_host.ParentGroup.LoopSoundSlavePrims.Contains(m_host))
m_host.Sound = UUID.Zero; {
m_host.SoundGain = 0; if (m_host.ParentGroup.LoopSoundMasterPrim == m_host)
m_host.SoundFlags = 0; {
m_host.SoundRadius = 0; foreach (SceneObjectPart part in m_host.ParentGroup.LoopSoundSlavePrims)
{
m_host.ScheduleFullUpdate(); part.Sound = UUID.Zero;
m_host.SendFullUpdateToAllClients(); part.SoundGain = 0;
part.SoundFlags = 0;
// m_host.SendSound(UUID.Zero.ToString(), 1.0, false, 2); part.SoundRadius = 0;
part.ScheduleFullUpdate();
part.SendFullUpdateToAllClients();
}
m_host.ParentGroup.LoopSoundMasterPrim = null;
m_host.ParentGroup.LoopSoundSlavePrims.Clear();
}
else
{
m_host.Sound = UUID.Zero;
m_host.SoundGain = 0;
m_host.SoundFlags = 0;
m_host.SoundRadius = 0;
m_host.ScheduleFullUpdate();
m_host.SendFullUpdateToAllClients();
}
}
else
{
m_host.Sound = UUID.Zero;
m_host.SoundGain = 0;
m_host.SoundFlags = 0;
m_host.SoundRadius = 0;
m_host.ScheduleFullUpdate();
m_host.SendFullUpdateToAllClients();
}
} }
public void llPreloadSound(string sound) public void llPreloadSound(string sound)
@ -2661,8 +2738,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
public void llLookAt(LSL_Vector target, double strength, double damping) public void llLookAt(LSL_Vector target, double strength, double damping)
{ {
// partial implementation, rotates objects correctly but does not apply strength or damping attributes
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
// Determine where we are looking from // Determine where we are looking from
LSL_Vector from = llGetPos(); LSL_Vector from = llGetPos();
@ -2682,9 +2757,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
// the angles of rotation in radians into rotation value // the angles of rotation in radians into rotation value
LSL_Types.Quaternion rot = llEuler2Rot(angle); LSL_Types.Quaternion rot = llEuler2Rot(angle);
Quaternion rotation = new Quaternion((float)rot.x, (float)rot.y, (float)rot.z, (float)rot.s);
m_host.startLookAt(rotation, (float)damping, (float)strength);
// Orient the object to the angle calculated // Orient the object to the angle calculated
llSetRot(rot); //llSetRot(rot);
} }
public void llStopLookAt() public void llStopLookAt()
@ -3046,8 +3122,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
public void llRotLookAt(LSL_Rotation target, double strength, double damping) public void llRotLookAt(LSL_Rotation target, double strength, double damping)
{ {
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
// NotImplemented("llRotLookAt"); Quaternion rot = new Quaternion((float)target.x, (float)target.y, (float)target.z, (float)target.s);
m_host.RotLookAt(Rot2Quaternion(target), (float)strength, (float)damping); m_host.RotLookAt(rot, (float)strength, (float)damping);
} }
public LSL_Integer llStringLength(string str) public LSL_Integer llStringLength(string str)
@ -3145,13 +3221,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
public void llPointAt(LSL_Vector pos) public void llPointAt(LSL_Vector pos)
{ {
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
NotImplemented("llPointAt"); ScenePresence Owner = World.GetScenePresence(m_host.UUID);
LSL_Rotation rot = llEuler2Rot(pos);
Owner.PreviousRotation = Owner.Rotation;
Owner.Rotation = (new Quaternion((float)rot.x,(float)rot.y,(float)rot.z,(float)rot.s));
} }
public void llStopPointAt() public void llStopPointAt()
{ {
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
NotImplemented("llStopPointAt"); ScenePresence Owner = m_host.ParentGroup.Scene.GetScenePresence(m_host.OwnerID);
Owner.Rotation = Owner.PreviousRotation;
} }
public void llTargetOmega(LSL_Vector axis, double spinrate, double gain) public void llTargetOmega(LSL_Vector axis, double spinrate, double gain)
@ -3946,8 +4026,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
public void llCollisionSound(string impact_sound, double impact_volume) public void llCollisionSound(string impact_sound, double impact_volume)
{ {
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
//NotImplemented("llCollisionSound");
// TODO: Parameter check logic required. // TODO: Parameter check logic required.
UUID soundId = UUID.Zero; UUID soundId = UUID.Zero;
if (!UUID.TryParse(impact_sound, out soundId)) if (!UUID.TryParse(impact_sound, out soundId))
@ -4535,8 +4613,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
public LSL_Vector llGetCenterOfMass() public LSL_Vector llGetCenterOfMass()
{ {
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
NotImplemented("llGetCenterOfMass"); Vector3 center = m_host.GetGeometricCenter();
return new LSL_Vector(); return new LSL_Vector(center.X,center.Y,center.Z);
} }
public LSL_List llListSort(LSL_List src, int stride, int ascending) public LSL_List llListSort(LSL_List src, int stride, int ascending)
@ -5269,8 +5347,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
flags |= ScriptBaseClass.AGENT_SITTING; flags |= ScriptBaseClass.AGENT_SITTING;
} }
//NotImplemented("llGetAgentInfo");
return flags; return flags;
} }
@ -5353,7 +5429,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
LSL_Vector bottom_south_west) LSL_Vector bottom_south_west)
{ {
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
NotImplemented("llTriggerSoundLimited"); float radius1 = (float)llVecDist(llGetPos(), top_north_east);
float radius2 = (float)llVecDist(llGetPos(), bottom_south_west);
float radius = Math.Abs(radius1 - radius2);
m_host.SendSound(KeyOrName(sound).ToString(), volume, true, 0, radius, false, false);
} }
public void llEjectFromLand(string pest) public void llEjectFromLand(string pest)
@ -5892,7 +5971,26 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
public void llGroundRepel(double height, int water, double tau) public void llGroundRepel(double height, int water, double tau)
{ {
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
NotImplemented("llGroundRepel"); if (m_host.PhysActor != null)
{
float ground = (float)llGround(new LSL_Types.Vector3(0, 0, 0));
float waterLevel = (float)llWater(new LSL_Types.Vector3(0, 0, 0));
PIDHoverType hoverType = PIDHoverType.Ground;
if (water != 0)
{
hoverType = PIDHoverType.GroundAndWater;
if (ground < waterLevel)
height += waterLevel;
else
height += ground;
}
else
{
height += ground;
}
m_host.SetHoverHeight((float)height, hoverType, (float)tau);
}
} }
protected UUID GetTaskInventoryItem(string name) protected UUID GetTaskInventoryItem(string name)
@ -6021,13 +6119,25 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
public void llSetVehicleFlags(int flags) public void llSetVehicleFlags(int flags)
{ {
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
NotImplemented("llSetVehicleFlags"); if (m_host.ParentGroup != null)
{
if (!m_host.ParentGroup.IsDeleted)
{
m_host.ParentGroup.RootPart.SetVehicleFlags(flags, false);
}
}
} }
public void llRemoveVehicleFlags(int flags) public void llRemoveVehicleFlags(int flags)
{ {
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
NotImplemented("llRemoveVehicleFlags"); if (m_host.ParentGroup != null)
{
if (!m_host.ParentGroup.IsDeleted)
{
m_host.ParentGroup.RootPart.SetVehicleFlags(flags, true);
}
}
} }
public void llSitTarget(LSL_Vector offset, LSL_Rotation rot) public void llSitTarget(LSL_Vector offset, LSL_Rotation rot)
@ -7049,7 +7159,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
public void llRemoteDataSetRegion() public void llRemoteDataSetRegion()
{ {
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
NotImplemented("llRemoteDataSetRegion"); Deprecated("llRemoteDataSetRegion");
} }
public LSL_Float llLog10(double val) public LSL_Float llLog10(double val)
@ -8081,7 +8191,39 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
public void llSetInventoryPermMask(string item, int mask, int value) public void llSetInventoryPermMask(string item, int mask, int value)
{ {
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
NotImplemented("llSetInventoryPermMask"); if (m_ScriptEngine.Config.GetBoolean("AllowGodFunctions", false))
{
if (World.Permissions.CanRunConsoleCommand(m_host.OwnerID))
{
lock (m_host.TaskInventory)
{
foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
{
if (inv.Value.Name == item)
{
switch (mask)
{
case 0:
inv.Value.BasePermissions = (uint)value;
break;
case 1:
inv.Value.CurrentPermissions = (uint)value;
break;
case 2:
inv.Value.GroupPermissions = (uint)value;
break;
case 3:
inv.Value.EveryonePermissions = (uint)value;
break;
case 4:
inv.Value.NextPermissions = (uint)value;
break;
}
}
}
}
}
}
} }
public LSL_String llGetInventoryCreator(string item) public LSL_String llGetInventoryCreator(string item)
@ -8515,6 +8657,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
// we send to all // we send to all
landData.MediaID = new UUID(texture); landData.MediaID = new UUID(texture);
landData.MediaAutoScale = autoAlign ? (byte)1 : (byte)0; landData.MediaAutoScale = autoAlign ? (byte)1 : (byte)0;
landData.MediaSize[0] = width;
landData.MediaSize[1] = height;
landData.MediaType = mediaType;
// do that one last, it will cause a ParcelPropertiesUpdate // do that one last, it will cause a ParcelPropertiesUpdate
landObject.SetMediaUrl(url); landObject.SetMediaUrl(url);
@ -8574,11 +8719,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
LSL_List list = new LSL_List(); LSL_List list = new LSL_List();
//TO DO: make the implementation for the missing commands //TO DO: make the implementation for the missing commands
//PARCEL_MEDIA_COMMAND_TEXTURE key uuid Use this to get or set the parcel's media texture.
//PARCEL_MEDIA_COMMAND_URL string url Used to get or set the parcel's media url.
//PARCEL_MEDIA_COMMAND_TYPE string mime_type Use this to get or set the parcel media MIME type (e.g. "text/html"). (1.19.1 RC0 or later)
//PARCEL_MEDIA_COMMAND_SIZE integer x, integer y Use this to get or set the parcel media pixel resolution. (1.19.1 RC0 or later)
//PARCEL_MEDIA_COMMAND_DESC string desc Use this to get or set the parcel media description. (1.19.1 RC0 or later)
//PARCEL_MEDIA_COMMAND_LOOP_SET float loop Use this to get or set the parcel's media loop duration. (1.19.1 RC0 or later) //PARCEL_MEDIA_COMMAND_LOOP_SET float loop Use this to get or set the parcel's media loop duration. (1.19.1 RC0 or later)
for (int i = 0; i < aList.Data.Length; i++) for (int i = 0; i < aList.Data.Length; i++)
{ {
@ -8596,6 +8736,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
case ParcelMediaCommandEnum.Texture: case ParcelMediaCommandEnum.Texture:
list.Add(new LSL_String(World.GetLandData(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y).MediaID.ToString())); list.Add(new LSL_String(World.GetLandData(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y).MediaID.ToString()));
break; break;
case ParcelMediaCommandEnum.Type:
list.Add(new LSL_String(World.GetLandData(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y).MediaType));
break;
case ParcelMediaCommandEnum.Size:
list.Add(new LSL_String(World.GetLandData(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y).MediaSize[0]));
list.Add(new LSL_String(World.GetLandData(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y).MediaSize[1]));
break;
default: default:
ParcelMediaCommandEnum mediaCommandEnum = ParcelMediaCommandEnum.Url; ParcelMediaCommandEnum mediaCommandEnum = ParcelMediaCommandEnum.Url;
NotImplemented("llParcelMediaQuery parameter do not supported yet: " + Enum.Parse(mediaCommandEnum.GetType() , aList.Data[i].ToString()).ToString()); NotImplemented("llParcelMediaQuery parameter do not supported yet: " + Enum.Parse(mediaCommandEnum.GetType() , aList.Data[i].ToString()).ToString());

View File

@ -160,6 +160,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
public const int VEHICLE_BANKING_MIX = 39; public const int VEHICLE_BANKING_MIX = 39;
public const int VEHICLE_BANKING_TIMESCALE = 40; public const int VEHICLE_BANKING_TIMESCALE = 40;
public const int VEHICLE_REFERENCE_FRAME = 44; public const int VEHICLE_REFERENCE_FRAME = 44;
public const int VEHICLE_RANGE_BLOCK = 45;
public const int VEHICLE_ROLL_FRAME = 46;
public const int VEHICLE_FLAG_NO_DEFLECTION_UP = 1; public const int VEHICLE_FLAG_NO_DEFLECTION_UP = 1;
public const int VEHICLE_FLAG_LIMIT_ROLL_ONLY = 2; public const int VEHICLE_FLAG_LIMIT_ROLL_ONLY = 2;
public const int VEHICLE_FLAG_HOVER_WATER_ONLY = 4; public const int VEHICLE_FLAG_HOVER_WATER_ONLY = 4;
@ -170,6 +172,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
public const int VEHICLE_FLAG_MOUSELOOK_STEER = 128; public const int VEHICLE_FLAG_MOUSELOOK_STEER = 128;
public const int VEHICLE_FLAG_MOUSELOOK_BANK = 256; public const int VEHICLE_FLAG_MOUSELOOK_BANK = 256;
public const int VEHICLE_FLAG_CAMERA_DECOUPLED = 512; public const int VEHICLE_FLAG_CAMERA_DECOUPLED = 512;
public const int VEHICLE_FLAG_NO_X = 1024;
public const int VEHICLE_FLAG_NO_Y = 2048;
public const int VEHICLE_FLAG_NO_Z = 4096;
public const int VEHICLE_FLAG_LOCK_HOVER_HEIGHT = 8192;
public const int VEHICLE_FLAG_NO_DEFLECTION = 16392;
public const int VEHICLE_FLAG_LOCK_ROTATION = 32784;
public const int INVENTORY_ALL = -1; public const int INVENTORY_ALL = -1;
public const int INVENTORY_NONE = -1; public const int INVENTORY_NONE = -1;

View File

@ -389,7 +389,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
break; break;
case "MinEventDelay": case "MinEventDelay":
double minEventDelay = 0.0; double minEventDelay = 0.0;
double.TryParse(part.InnerText, out minEventDelay); double.TryParse(part.InnerText, NumberStyles.Float, Culture.NumberFormatInfo, out minEventDelay);
instance.MinEventDelay = minEventDelay; instance.MinEventDelay = minEventDelay;
break; break;
} }

View File

@ -72,9 +72,9 @@ namespace OpenSim.Region.ScriptEngine.Shared
return; return;
} }
bool res; bool res;
res = Double.TryParse(tmps[0], out x); res = Double.TryParse(tmps[0], NumberStyles.Float, Culture.NumberFormatInfo, out x);
res = res & Double.TryParse(tmps[1], out y); res = res & Double.TryParse(tmps[1], NumberStyles.Float, Culture.NumberFormatInfo, out y);
res = res & Double.TryParse(tmps[2], out z); res = res & Double.TryParse(tmps[2], NumberStyles.Float, Culture.NumberFormatInfo, out z);
} }
#endregion #endregion
@ -309,10 +309,10 @@ namespace OpenSim.Region.ScriptEngine.Shared
return; return;
} }
bool res; bool res;
res = Double.TryParse(tmps[0], NumberStyles.Float, Culture.FormatProvider, out x); res = Double.TryParse(tmps[0], NumberStyles.Float, Culture.NumberFormatInfo, out x);
res = res & Double.TryParse(tmps[1], NumberStyles.Float, Culture.FormatProvider, out y); res = res & Double.TryParse(tmps[1], NumberStyles.Float, Culture.NumberFormatInfo, out y);
res = res & Double.TryParse(tmps[2], NumberStyles.Float, Culture.FormatProvider, out z); res = res & Double.TryParse(tmps[2], NumberStyles.Float, Culture.NumberFormatInfo, out z);
res = res & Double.TryParse(tmps[3], NumberStyles.Float, Culture.FormatProvider, out s); res = res & Double.TryParse(tmps[3], NumberStyles.Float, Culture.NumberFormatInfo, out s);
if (x == 0 && y == 0 && z == 0 && s == 0) if (x == 0 && y == 0 && z == 0 && s == 0)
s = 1; s = 1;
} }
@ -1015,7 +1015,7 @@ namespace OpenSim.Region.ScriptEngine.Shared
double entry; double entry;
for (int i = 0; i < Data.Length; i++) for (int i = 0; i < Data.Length; i++)
{ {
if (double.TryParse(Data[i].ToString(), out entry)) if (double.TryParse(Data[i].ToString(), NumberStyles.Float, Culture.NumberFormatInfo, out entry))
{ {
if (entry < minimum) minimum = entry; if (entry < minimum) minimum = entry;
} }
@ -1029,7 +1029,7 @@ namespace OpenSim.Region.ScriptEngine.Shared
double entry; double entry;
for (int i = 0; i < Data.Length; i++) for (int i = 0; i < Data.Length; i++)
{ {
if (double.TryParse(Data[i].ToString(), out entry)) if (double.TryParse(Data[i].ToString(), NumberStyles.Float, Culture.NumberFormatInfo, out entry))
{ {
if (entry > maximum) maximum = entry; if (entry > maximum) maximum = entry;
} }
@ -1048,7 +1048,7 @@ namespace OpenSim.Region.ScriptEngine.Shared
double entry; double entry;
for (int i = 0; i < Data.Length; i++) for (int i = 0; i < Data.Length; i++)
{ {
if (double.TryParse(Data[i].ToString(), out entry)) if (double.TryParse(Data[i].ToString(), NumberStyles.Float, Culture.NumberFormatInfo, out entry))
{ {
count++; count++;
} }
@ -1062,7 +1062,7 @@ namespace OpenSim.Region.ScriptEngine.Shared
double entry; double entry;
for (int i = 0; i < src.Data.Length - 1; i++) for (int i = 0; i < src.Data.Length - 1; i++)
{ {
if (double.TryParse(src.Data[i].ToString(), out entry)) if (double.TryParse(src.Data[i].ToString(), NumberStyles.Float, Culture.NumberFormatInfo, out entry))
{ {
ret.Add(entry); ret.Add(entry);
} }
@ -1076,7 +1076,7 @@ namespace OpenSim.Region.ScriptEngine.Shared
double entry; double entry;
for (int i = 0; i < Data.Length; i++) for (int i = 0; i < Data.Length; i++)
{ {
if (double.TryParse(Data[i].ToString(), out entry)) if (double.TryParse(Data[i].ToString(), NumberStyles.Float, Culture.NumberFormatInfo, out entry))
{ {
sum = sum + entry; sum = sum + entry;
} }
@ -1090,7 +1090,7 @@ namespace OpenSim.Region.ScriptEngine.Shared
double entry; double entry;
for (int i = 0; i < Data.Length; i++) for (int i = 0; i < Data.Length; i++)
{ {
if (double.TryParse(Data[i].ToString(), out entry)) if (double.TryParse(Data[i].ToString(), NumberStyles.Float, Culture.NumberFormatInfo, out entry))
{ {
sum = sum + Math.Pow(entry, 2); sum = sum + Math.Pow(entry, 2);
} }
@ -1213,11 +1213,11 @@ namespace OpenSim.Region.ScriptEngine.Shared
{ {
double a; double a;
double b; double b;
if (!double.TryParse(x.ToString(), out a)) if (!double.TryParse(x.ToString(), NumberStyles.Float, Culture.NumberFormatInfo, out a))
{ {
a = 0.0; a = 0.0;
} }
if (!double.TryParse(y.ToString(), out b)) if (!double.TryParse(y.ToString(), NumberStyles.Float, Culture.NumberFormatInfo, out b))
{ {
b = 0.0; b = 0.0;
} }
@ -1857,7 +1857,7 @@ namespace OpenSim.Region.ScriptEngine.Shared
else else
if (v.EndsWith(".")) if (v.EndsWith("."))
v = v + "0"; v = v + "0";
this.value = double.Parse(v, System.Globalization.NumberStyles.Float, Culture.FormatProvider); this.value = double.Parse(v, System.Globalization.NumberStyles.Float, Culture.NumberFormatInfo);
} }
#endregion #endregion

View File

@ -76,17 +76,19 @@ namespace OpenSim.Services.AssetService
}); });
} }
m_log.Info("[ASSET CONNECTOR]: Local asset service enabled"); m_log.Info("[ASSET SERVICE]: Local asset service enabled");
} }
} }
public AssetBase Get(string id) public AssetBase Get(string id)
{ {
//m_log.DebugFormat("[ASSET SERVICE]: Get asset {0}", id);
UUID assetID; UUID assetID;
if (!UUID.TryParse(id, out assetID)) if (!UUID.TryParse(id, out assetID))
{
m_log.WarnFormat("[ASSET SERVICE]: Could not parse requested sset id {0}", id);
return null; return null;
}
return m_Database.GetAsset(assetID); return m_Database.GetAsset(assetID);
} }

View File

@ -206,6 +206,8 @@ namespace OpenSim.Tests.Common.Mock
public event ObjectBuy OnObjectBuy; public event ObjectBuy OnObjectBuy;
public event BuyObjectInventory OnBuyObjectInventory; public event BuyObjectInventory OnBuyObjectInventory;
public event AgentSit OnUndo; public event AgentSit OnUndo;
public event AgentSit OnRedo;
public event LandUndo OnLandUndo;
public event ForceReleaseControls OnForceReleaseControls; public event ForceReleaseControls OnForceReleaseControls;