Merge branch 'master' into httptests
commit
ec8393571f
|
@ -31,6 +31,7 @@
|
|||
*/*/*/*/*/bin
|
||||
*/*/*/*/*/*/bin
|
||||
*/*/*/*/*/*/*/bin
|
||||
.vs/
|
||||
addon-modules/
|
||||
bin/Debug/*.dll
|
||||
bin/*.dll.mdb
|
||||
|
@ -93,7 +94,6 @@ TAGS
|
|||
Makefile.local
|
||||
bin/.version
|
||||
compile.bat
|
||||
addon-modules
|
||||
OpenSim/Data/Tests/test-results/
|
||||
OpenSim/Framework/Serialization/Tests/test-results/
|
||||
OpenSim/Framework/Servers/Tests/test-results/
|
||||
|
|
7241
OpenSim.FxCop
7241
OpenSim.FxCop
File diff suppressed because it is too large
Load Diff
|
@ -286,7 +286,7 @@ namespace OpenSim.Groups
|
|||
string requestingAgentID = request["RequestingAgentID"].ToString();
|
||||
|
||||
if (!m_GroupsService.RemoveAgentFromGroup(requestingAgentID, agentID, groupID))
|
||||
NullResult(result, string.Format("Insufficient permissions.", agentID));
|
||||
NullResult(result, string.Format("Insufficient permissions. {0}", agentID));
|
||||
else
|
||||
result["RESULT"] = "true";
|
||||
}
|
||||
|
|
|
@ -193,7 +193,9 @@ namespace OpenSim.Data.MySQL
|
|||
{
|
||||
using (MySqlCommand cmd = new MySqlCommand())
|
||||
{
|
||||
cmd.CommandText = String.Format("select * from inventoryitems where avatarId = ?uuid and assetType = ?type and flags & 1", m_Realm);
|
||||
// cmd.CommandText = String.Format("select * from inventoryitems where avatarId = ?uuid and assetType = ?type and flags & 1", m_Realm);
|
||||
|
||||
cmd.CommandText = String.Format("select * from inventoryitems where avatarId = ?uuid and assetType = ?type and flags & 1");
|
||||
|
||||
cmd.Parameters.AddWithValue("?uuid", principalID.ToString());
|
||||
cmd.Parameters.AddWithValue("?type", (int)AssetType.Gesture);
|
||||
|
@ -212,7 +214,10 @@ namespace OpenSim.Data.MySQL
|
|||
{
|
||||
cmd.Connection = dbcon;
|
||||
|
||||
cmd.CommandText = String.Format("select bit_or(inventoryCurrentPermissions) as inventoryCurrentPermissions from inventoryitems where avatarID = ?PrincipalID and assetID = ?AssetID group by assetID", m_Realm);
|
||||
// cmd.CommandText = String.Format("select bit_or(inventoryCurrentPermissions) as inventoryCurrentPermissions from inventoryitems where avatarID = ?PrincipalID and assetID = ?AssetID group by assetID", m_Realm);
|
||||
|
||||
cmd.CommandText = String.Format("select bit_or(inventoryCurrentPermissions) as inventoryCurrentPermissions from inventoryitems where avatarID = ?PrincipalID and assetID = ?AssetID group by assetID");
|
||||
|
||||
cmd.Parameters.AddWithValue("?PrincipalID", principalID.ToString());
|
||||
cmd.Parameters.AddWithValue("?AssetID", assetID.ToString());
|
||||
|
||||
|
|
|
@ -174,7 +174,9 @@ namespace OpenSim.Data.PGSQL
|
|||
{
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand())
|
||||
{
|
||||
cmd.CommandText = String.Format(@"select * from inventoryitems where ""avatarID"" = :uuid and ""assetType"" = :type and ""flags"" = 1", m_Realm);
|
||||
// cmd.CommandText = String.Format(@"select * from inventoryitems where ""avatarID"" = :uuid and ""assetType"" = :type and ""flags"" = 1", m_Realm);
|
||||
|
||||
cmd.CommandText = String.Format(@"select * from inventoryitems where ""avatarID"" = :uuid and ""assetType"" = :type and ""flags"" = 1");
|
||||
|
||||
UUID princID = UUID.Zero;
|
||||
UUID.TryParse(principalID, out princID);
|
||||
|
@ -194,11 +196,18 @@ namespace OpenSim.Data.PGSQL
|
|||
{
|
||||
using (NpgsqlCommand cmd = new NpgsqlCommand())
|
||||
{
|
||||
/*
|
||||
cmd.CommandText = String.Format(@"select bit_or(""inventoryCurrentPermissions"") as ""inventoryCurrentPermissions""
|
||||
from inventoryitems
|
||||
where ""avatarID"" = :PrincipalID
|
||||
and ""assetID"" = :AssetID
|
||||
group by ""assetID"" ", m_Realm);
|
||||
*/
|
||||
cmd.CommandText = String.Format(@"select bit_or(""inventoryCurrentPermissions"") as ""inventoryCurrentPermissions""
|
||||
from inventoryitems
|
||||
where ""avatarID"" = :PrincipalID
|
||||
and ""assetID"" = :AssetID
|
||||
group by ""assetID"" ");
|
||||
|
||||
cmd.Parameters.Add(m_database.CreateParameter("PrincipalID", principalID));
|
||||
cmd.Parameters.Add(m_database.CreateParameter("AssetID", assetID));
|
||||
|
|
|
@ -81,6 +81,7 @@ namespace OpenSim.Framework
|
|||
|
||||
public Vector3 ClientAgentPosition;
|
||||
public bool UseClientAgentPosition;
|
||||
public bool NeedsCameraCollision;
|
||||
|
||||
public AgentUpdateArgs()
|
||||
{
|
||||
|
|
|
@ -120,14 +120,13 @@ namespace OpenSim.Region.ClientStack.Linden
|
|||
|
||||
public virtual void RegisterCaps(UUID agentID, Caps caps)
|
||||
{
|
||||
UUID capID = UUID.Random();
|
||||
|
||||
if (m_URL == "localhost")
|
||||
{
|
||||
m_log.DebugFormat("[GET_DISPLAY_NAMES]: /CAPS/agents/{0} in region {1}", capID, m_scene.RegionInfo.RegionName);
|
||||
string capUrl = "/CAPS/" + UUID.Random() + "/";
|
||||
// m_log.DebugFormat("[GET_DISPLAY_NAMES]: {0} in region {1}", capUrl, m_scene.RegionInfo.RegionName);
|
||||
caps.RegisterHandler(
|
||||
"GetDisplayNames",
|
||||
new GetDisplayNamesHandler("/CAPS/agents" + capID + "/", m_UserManager, "GetDisplayNames", agentID.ToString()));
|
||||
new GetDisplayNamesHandler(capUrl, m_UserManager, "GetDisplayNames", agentID.ToString()));
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
@ -2856,6 +2856,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
|||
|
||||
public void SendSelectedPartsProprieties(List<ISceneEntity> parts)
|
||||
{
|
||||
/* not in use
|
||||
// udp part
|
||||
ObjectPropertiesPacket packet =
|
||||
(ObjectPropertiesPacket)PacketPool.Instance.GetPacket(PacketType.ObjectProperties);
|
||||
|
@ -2893,6 +2894,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
|||
llsdBody.Add("ObjectData", array);
|
||||
|
||||
eq.Enqueue(BuildEvent("ObjectPhysicsProperties", llsdBody),AgentId);
|
||||
*/
|
||||
}
|
||||
|
||||
|
||||
|
@ -4840,6 +4842,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
|||
OpenSim.Framework.Lazy<List<ObjectPropertyUpdate>> propertyUpdates =
|
||||
new OpenSim.Framework.Lazy<List<ObjectPropertyUpdate>>();
|
||||
|
||||
List<SceneObjectPart> needPhysics = new List<SceneObjectPart>();
|
||||
|
||||
EntityUpdate iupdate;
|
||||
Int32 timeinqueue; // this is just debugging code & can be dropped later
|
||||
|
||||
|
@ -4867,6 +4871,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
|||
if (update.Entity is SceneObjectPart)
|
||||
{
|
||||
SceneObjectPart sop = (SceneObjectPart)update.Entity;
|
||||
needPhysics.Add(sop);
|
||||
ObjectPropertiesPacket.ObjectDataBlock objPropDB = CreateObjectPropertiesBlock(sop);
|
||||
objectPropertiesBlocks.Value.Add(objPropDB);
|
||||
propertyUpdates.Value.Add(update);
|
||||
|
@ -4932,7 +4937,31 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
|||
// fpcnt++;
|
||||
// fbcnt++;
|
||||
}
|
||||
}
|
||||
|
||||
if(needPhysics.Count > 0)
|
||||
{
|
||||
IEventQueue eq = Scene.RequestModuleInterface<IEventQueue>();
|
||||
if(eq != null)
|
||||
{
|
||||
OSDArray array = new OSDArray();
|
||||
foreach(SceneObjectPart sop in needPhysics)
|
||||
{
|
||||
OSDMap physinfo = new OSDMap(6);
|
||||
physinfo["LocalID"] = sop.LocalId;
|
||||
physinfo["Density"] = sop.Density;
|
||||
physinfo["Friction"] = sop.Friction;
|
||||
physinfo["GravityMultiplier"] = sop.GravityModifier;
|
||||
physinfo["Restitution"] = sop.Restitution;
|
||||
physinfo["PhysicsShapeType"] = (int)sop.PhysicsShapeType;
|
||||
array.Add(physinfo);
|
||||
}
|
||||
|
||||
OSDMap llsdBody = new OSDMap(1);
|
||||
llsdBody.Add("ObjectData", array);
|
||||
|
||||
eq.Enqueue(BuildEvent("ObjectPhysicsProperties", llsdBody),AgentId);
|
||||
}
|
||||
}
|
||||
|
||||
// m_log.WarnFormat("[PACKETCOUNTS] queued {0} property packets with {1} blocks",ppcnt,pbcnt);
|
||||
|
@ -6245,6 +6274,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
|||
m_thisAgentUpdateArgs.HeadRotation = x.HeadRotation;
|
||||
m_thisAgentUpdateArgs.State = x.State;
|
||||
|
||||
m_thisAgentUpdateArgs.NeedsCameraCollision = !camera;
|
||||
|
||||
UpdateAgent handlerAgentUpdate = OnAgentUpdate;
|
||||
UpdateAgent handlerPreAgentUpdate = OnPreAgentUpdate;
|
||||
|
||||
|
@ -6264,6 +6295,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
|||
m_thisAgentUpdateArgs.CameraLeftAxis = x.CameraLeftAxis;
|
||||
m_thisAgentUpdateArgs.CameraUpAxis = x.CameraUpAxis;
|
||||
|
||||
m_thisAgentUpdateArgs.NeedsCameraCollision = true;
|
||||
|
||||
UpdateAgent handlerAgentCameraUpdate = OnAgentCameraUpdate;
|
||||
|
||||
if (handlerAgentCameraUpdate != null)
|
||||
|
|
|
@ -161,6 +161,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
|||
/// <summary>Total byte count of unacked packets sent to this client</summary>
|
||||
public int UnackedBytes;
|
||||
|
||||
private int m_packetsUnAckReported;
|
||||
/// <summary>Total number of received packets that we have reported to the OnPacketStats event(s)</summary>
|
||||
private int m_packetsReceivedReported;
|
||||
/// <summary>Total number of sent packets that we have reported to the OnPacketStats event(s)</summary>
|
||||
|
@ -389,11 +390,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
|||
{
|
||||
int newPacketsReceived = PacketsReceived - m_packetsReceivedReported;
|
||||
int newPacketsSent = PacketsSent - m_packetsSentReported;
|
||||
|
||||
int newPacketUnAck = UnackedBytes - m_packetsUnAckReported;
|
||||
callback(newPacketsReceived, newPacketsSent, UnackedBytes);
|
||||
|
||||
m_packetsReceivedReported += newPacketsReceived;
|
||||
m_packetsSentReported += newPacketsSent;
|
||||
m_packetsUnAckReported += newPacketUnAck;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -323,7 +323,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
|||
protected int m_elapsedMSSinceLastStatReport = 0;
|
||||
|
||||
/// <summary>Environment.TickCount of the last time the outgoing packet handler executed</summary>
|
||||
protected int m_tickLastOutgoingPacketHandler;
|
||||
protected double m_tickLastOutgoingPacketHandler;
|
||||
|
||||
/// <summary>Keeps track of the number of elapsed milliseconds since the last time the outgoing packet handler looped</summary>
|
||||
protected int m_elapsedMSOutgoingPacketHandler;
|
||||
|
@ -356,20 +356,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
protected ExpiringCache<IPEndPoint, Queue<UDPPacketBuffer>> m_pendingCache = new ExpiringCache<IPEndPoint, Queue<UDPPacketBuffer>>();
|
||||
|
||||
/// <summary>
|
||||
/// Event used to signal when queued packets are available for sending.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// This allows the outbound loop to only operate when there is data to send rather than continuously polling.
|
||||
/// Some data is sent immediately and not queued. That data would not trigger this event.
|
||||
/// WRONG use. May be usefull in future revision
|
||||
/// </remarks>
|
||||
// protected AutoResetEvent m_dataPresentEvent = new AutoResetEvent(false);
|
||||
|
||||
protected Pool<IncomingPacket> m_incomingPacketPool;
|
||||
|
||||
/// <summary>
|
||||
|
@ -456,10 +444,22 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
|||
int now = start;
|
||||
while (now == start)
|
||||
now = Environment.TickCount;
|
||||
TickCountResolution += (float)(now - start) * 0.1f;
|
||||
TickCountResolution += (float)(now - start);
|
||||
}
|
||||
TickCountResolution = (float)Math.Ceiling(TickCountResolution);
|
||||
m_log.Info("[LLUDPSERVER]: Average Environment.TickCount resolution: " + TickCountResolution + "ms");
|
||||
m_log.Info("[LLUDPSERVER]: Average Environment.TickCount resolution: " + TickCountResolution * 0.1f + "ms");
|
||||
|
||||
TickCountResolution = 0f;
|
||||
for (int i = 0; i < 100; i++)
|
||||
{
|
||||
double start = Util.GetTimeStampMS();
|
||||
double now = start;
|
||||
while (now == start)
|
||||
now = Util.GetTimeStampMS();
|
||||
TickCountResolution += (float)((now - start));
|
||||
}
|
||||
|
||||
TickCountResolution = (float)Math.Round(TickCountResolution * 0.01f,6,MidpointRounding.AwayFromZero);
|
||||
m_log.Info("[LLUDPSERVER]: Average Util.GetTimeStampMS resolution: " + TickCountResolution + "ms");
|
||||
|
||||
#endregion Environment.TickCount Measurement
|
||||
|
||||
|
@ -467,8 +467,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
|||
int sceneThrottleBps = 0;
|
||||
bool usePools = false;
|
||||
|
||||
|
||||
|
||||
IConfig config = configSource.Configs["ClientStack.LindenUDP"];
|
||||
if (config != null)
|
||||
{
|
||||
|
@ -927,10 +925,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
|||
}
|
||||
|
||||
PacketPool.Instance.ReturnPacket(packet);
|
||||
|
||||
/// WRONG use. May be usefull in future revision
|
||||
// if (packetQueued)
|
||||
// m_dataPresentEvent.Set();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -2079,14 +2073,14 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
|||
m_sendPing = false;
|
||||
|
||||
// Update elapsed time
|
||||
int thisTick = Environment.TickCount & Int32.MaxValue;
|
||||
if (m_tickLastOutgoingPacketHandler > thisTick)
|
||||
m_elapsedMSOutgoingPacketHandler += ((Int32.MaxValue - m_tickLastOutgoingPacketHandler) + thisTick);
|
||||
else
|
||||
m_elapsedMSOutgoingPacketHandler += (thisTick - m_tickLastOutgoingPacketHandler);
|
||||
|
||||
double thisTick = Util.GetTimeStampMS();
|
||||
int deltaMS = (int)(thisTick - m_tickLastOutgoingPacketHandler);
|
||||
m_tickLastOutgoingPacketHandler = thisTick;
|
||||
|
||||
// update some 1ms resolution chained timers
|
||||
|
||||
m_elapsedMSOutgoingPacketHandler += deltaMS;
|
||||
|
||||
// Check for pending outgoing resends every 100ms
|
||||
if (m_elapsedMSOutgoingPacketHandler >= 100)
|
||||
{
|
||||
|
@ -2109,15 +2103,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
|||
m_sendPing = true;
|
||||
m_elapsed500MSOutgoingPacketHandler = 0;
|
||||
}
|
||||
|
||||
#endregion Update Timers
|
||||
|
||||
// Use this for emergency monitoring -- bug hunting
|
||||
//if (m_scene.EmergencyMonitoring)
|
||||
// clientPacketHandler = MonitoredClientOutgoingPacketHandler;
|
||||
//else
|
||||
// clientPacketHandler = ClientOutgoingPacketHandler;
|
||||
|
||||
// Handle outgoing packets, resends, acknowledgements, and pings for each
|
||||
// client. m_packetSent will be set to true if a packet is sent
|
||||
Scene.ForEachClient(clientPacketHandler);
|
||||
|
@ -2129,7 +2116,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
|||
|
||||
if(Scene.GetNumberOfClients() == 0)
|
||||
{
|
||||
Thread.Sleep(250); // be friendly to PIs, but how long ??
|
||||
Thread.Sleep(100);
|
||||
}
|
||||
else if (!m_packetSent)
|
||||
// Thread.Sleep((int)TickCountResolution); outch this is bad on linux
|
||||
|
@ -2204,99 +2191,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
|||
/// </summary>
|
||||
public long IncomingPacketsProcessed { get; protected set; }
|
||||
|
||||
protected void MonitoredClientOutgoingPacketHandler(IClientAPI client)
|
||||
{
|
||||
nticks++;
|
||||
watch1.Start();
|
||||
m_currentOutgoingClient = client;
|
||||
|
||||
try
|
||||
{
|
||||
if (client is LLClientView)
|
||||
{
|
||||
LLClientView llClient = (LLClientView)client;
|
||||
LLUDPClient udpClient = llClient.UDPClient;
|
||||
|
||||
if (udpClient.IsConnected)
|
||||
{
|
||||
if (m_resendUnacked)
|
||||
{
|
||||
nticksUnack++;
|
||||
watch2.Start();
|
||||
|
||||
HandleUnacked(llClient);
|
||||
|
||||
watch2.Stop();
|
||||
avgResendUnackedTicks = (nticksUnack - 1)/(float)nticksUnack * avgResendUnackedTicks + (watch2.ElapsedTicks / (float)nticksUnack);
|
||||
watch2.Reset();
|
||||
}
|
||||
|
||||
if (m_sendAcks)
|
||||
{
|
||||
nticksAck++;
|
||||
watch2.Start();
|
||||
|
||||
SendAcks(udpClient);
|
||||
|
||||
watch2.Stop();
|
||||
avgSendAcksTicks = (nticksAck - 1) / (float)nticksAck * avgSendAcksTicks + (watch2.ElapsedTicks / (float)nticksAck);
|
||||
watch2.Reset();
|
||||
}
|
||||
|
||||
if (m_sendPing)
|
||||
{
|
||||
nticksPing++;
|
||||
watch2.Start();
|
||||
|
||||
SendPing(udpClient);
|
||||
|
||||
watch2.Stop();
|
||||
avgSendPingTicks = (nticksPing - 1) / (float)nticksPing * avgSendPingTicks + (watch2.ElapsedTicks / (float)nticksPing);
|
||||
watch2.Reset();
|
||||
}
|
||||
|
||||
watch2.Start();
|
||||
// Dequeue any outgoing packets that are within the throttle limits
|
||||
if (udpClient.DequeueOutgoing())
|
||||
{
|
||||
m_packetSent = true;
|
||||
npacksSent++;
|
||||
}
|
||||
else
|
||||
{
|
||||
npackNotSent++;
|
||||
}
|
||||
|
||||
watch2.Stop();
|
||||
avgDequeueTicks = (nticks - 1) / (float)nticks * avgDequeueTicks + (watch2.ElapsedTicks / (float)nticks);
|
||||
watch2.Reset();
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
m_log.WarnFormat("[LLUDPSERVER]: Client is not connected");
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
m_log.Error("[LLUDPSERVER]: OutgoingPacketHandler iteration for " + client.Name +
|
||||
" threw an exception: " + ex.Message, ex);
|
||||
}
|
||||
watch1.Stop();
|
||||
avgProcessingTicks = (nticks - 1) / (float)nticks * avgProcessingTicks + (watch1.ElapsedTicks / (float)nticks);
|
||||
watch1.Reset();
|
||||
|
||||
// reuse this -- it's every ~100ms
|
||||
if (Scene.EmergencyMonitoring && nticks % 100 == 0)
|
||||
{
|
||||
m_log.InfoFormat("[LLUDPSERVER]: avg processing ticks: {0} avg unacked: {1} avg acks: {2} avg ping: {3} avg dequeue: {4} (TickCountRes: {5} sent: {6} notsent: {7})",
|
||||
avgProcessingTicks, avgResendUnackedTicks, avgSendAcksTicks, avgSendPingTicks, avgDequeueTicks, TickCountResolution, npacksSent, npackNotSent);
|
||||
npackNotSent = npacksSent = 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
protected void ProcessInPacket(IncomingPacket incomingPacket)
|
||||
|
|
|
@ -92,8 +92,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
|||
Asset = throttleConfig.GetInt("asset_default", 10500);
|
||||
|
||||
Total = Resend + Land + Wind + Cloud + Task + Texture + Asset;
|
||||
// 3000000 bps default max
|
||||
ClientMaxRate = throttleConfig.GetInt("client_throttle_max_bps", 375000);
|
||||
// 5120000 bps default max
|
||||
ClientMaxRate = throttleConfig.GetInt("client_throttle_max_bps", 640000);
|
||||
if (ClientMaxRate > 1000000)
|
||||
ClientMaxRate = 1000000; // no more than 8Mbps
|
||||
|
||||
|
|
|
@ -62,8 +62,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
|||
/// </summary>
|
||||
protected const float m_minimumDripRate = 1500;
|
||||
|
||||
/// <summary>Time of the last drip, in system ticks</summary>
|
||||
protected Int32 m_lastDrip;
|
||||
/// <summary>Time of the last drip</summary>
|
||||
protected double m_lastDrip;
|
||||
|
||||
/// <summary>
|
||||
/// The number of bytes that can be sent at this moment. This is the
|
||||
|
@ -193,9 +193,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
|||
Parent = parent;
|
||||
RequestedDripRate = dripRate;
|
||||
RequestedBurst = MaxBurst;
|
||||
// TotalDripRequest = dripRate; // this will be overwritten when a child node registers
|
||||
// MaxBurst = (Int64)((double)dripRate * m_quantumsPerBurst);
|
||||
m_lastDrip = Util.EnvironmentTickCount() + 100000;
|
||||
m_lastDrip = Util.GetTimeStampMS() + 50.0;
|
||||
}
|
||||
|
||||
#endregion Constructor
|
||||
|
@ -210,7 +208,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
|||
protected float DripRateModifier()
|
||||
{
|
||||
float driprate = DripRate;
|
||||
return driprate >= TotalDripRequest ? 1.0f : driprate / TotalDripRequest;
|
||||
return driprate >= TotalDripRequest ? 1.0f : (driprate / TotalDripRequest);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -313,14 +311,14 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
|||
return;
|
||||
}
|
||||
|
||||
Int32 now = Util.EnvironmentTickCount();
|
||||
Int32 deltaMS = now - m_lastDrip;
|
||||
double now = Util.GetTimeStampMS();
|
||||
double deltaMS = now - m_lastDrip;
|
||||
m_lastDrip = now;
|
||||
|
||||
if (deltaMS <= 0)
|
||||
return;
|
||||
|
||||
m_tokenCount += deltaMS * DripRate * m_timeScale;
|
||||
m_tokenCount += (float)deltaMS * DripRate * m_timeScale;
|
||||
|
||||
float burst = Burst;
|
||||
if (m_tokenCount > burst)
|
||||
|
|
|
@ -45,10 +45,6 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
|
|||
private static readonly ILog m_log = LogManager.GetLogger(
|
||||
MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
protected Timer m_logTimer = new Timer(10000);
|
||||
protected List<GridInstantMessage> m_logData = new List<GridInstantMessage>();
|
||||
protected string m_restUrl;
|
||||
|
||||
/// <value>
|
||||
/// Is this module enabled?
|
||||
/// </value>
|
||||
|
@ -68,12 +64,9 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
|
|||
"InstantMessageModule", "InstantMessageModule") !=
|
||||
"InstantMessageModule")
|
||||
return;
|
||||
m_restUrl = config.Configs["Messaging"].GetString("LogURL", String.Empty);
|
||||
}
|
||||
|
||||
m_enabled = true;
|
||||
m_logTimer.AutoReset = false;
|
||||
m_logTimer.Elapsed += LogTimerElapsed;
|
||||
}
|
||||
|
||||
public virtual void AddRegion(Scene scene)
|
||||
|
@ -153,20 +146,17 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
|
|||
}
|
||||
|
||||
#endregion
|
||||
|
||||
/*
|
||||
public virtual void OnViewerInstantMessage(IClientAPI client, GridInstantMessage im)
|
||||
{
|
||||
im.fromAgentName = client.FirstName + " " + client.LastName;
|
||||
OnInstantMessage(client, im);
|
||||
}
|
||||
|
||||
*/
|
||||
public virtual void OnInstantMessage(IClientAPI client, GridInstantMessage im)
|
||||
{
|
||||
byte dialog = im.dialog;
|
||||
|
||||
if (client != null && dialog == (byte)InstantMessageDialog.MessageFromAgent)
|
||||
LogInstantMesssage(im);
|
||||
|
||||
if (dialog != (byte)InstantMessageDialog.MessageFromAgent
|
||||
&& dialog != (byte)InstantMessageDialog.StartTyping
|
||||
&& dialog != (byte)InstantMessageDialog.StopTyping
|
||||
|
@ -243,35 +233,5 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
|
|||
//
|
||||
OnInstantMessage(null, msg);
|
||||
}
|
||||
|
||||
protected virtual void LogInstantMesssage(GridInstantMessage im)
|
||||
{
|
||||
if (m_logData.Count < 20)
|
||||
{
|
||||
// Restart the log write timer
|
||||
m_logTimer.Stop();
|
||||
}
|
||||
if (!m_logTimer.Enabled)
|
||||
m_logTimer.Start();
|
||||
|
||||
lock (m_logData)
|
||||
{
|
||||
m_logData.Add(im);
|
||||
}
|
||||
}
|
||||
|
||||
protected virtual void LogTimerElapsed(object source, ElapsedEventArgs e)
|
||||
{
|
||||
lock (m_logData)
|
||||
{
|
||||
if (m_restUrl != String.Empty && m_logData.Count > 0)
|
||||
{
|
||||
bool success = SynchronousRestObjectRequester.MakeRequest<List<GridInstantMessage>, bool>("POST", m_restUrl + "/LogMessages/", m_logData);
|
||||
if (!success)
|
||||
m_log.ErrorFormat("[INSTANT MESSAGE]: Failed to save log data");
|
||||
}
|
||||
m_logData.Clear();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -154,13 +154,11 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts
|
|||
{
|
||||
bool inCache = false;
|
||||
UserAccount account;
|
||||
lock(m_Cache)
|
||||
account = m_Cache.Get(userID, out inCache);
|
||||
if (inCache)
|
||||
return account;
|
||||
|
||||
account = UserAccountService.GetUserAccount(scopeID, userID);
|
||||
lock(m_Cache)
|
||||
m_Cache.Cache(userID, account);
|
||||
|
||||
return account;
|
||||
|
@ -170,14 +168,12 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts
|
|||
{
|
||||
bool inCache = false;
|
||||
UserAccount account;
|
||||
lock(m_Cache)
|
||||
account = m_Cache.Get(firstName + " " + lastName, out inCache);
|
||||
if (inCache)
|
||||
return account;
|
||||
|
||||
account = UserAccountService.GetUserAccount(scopeID, firstName, lastName);
|
||||
if (account != null)
|
||||
lock(m_Cache)
|
||||
m_Cache.Cache(account.PrincipalID, account);
|
||||
|
||||
return account;
|
||||
|
@ -201,7 +197,6 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts
|
|||
{
|
||||
if(UUID.TryParse(id, out uuid))
|
||||
{
|
||||
lock(m_Cache)
|
||||
account = m_Cache.Get(uuid, out inCache);
|
||||
if (inCache)
|
||||
ret.Add(account);
|
||||
|
@ -216,14 +211,15 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts
|
|||
List<UserAccount> ext = UserAccountService.GetUserAccounts(scopeID, missing);
|
||||
if(ext != null && ext.Count > 0)
|
||||
{
|
||||
ret.AddRange(ext);
|
||||
foreach(UserAccount acc in ext)
|
||||
{
|
||||
if(acc != null)
|
||||
lock(m_Cache)
|
||||
{
|
||||
ret.Add(acc);
|
||||
m_Cache.Cache(acc.PrincipalID, acc);
|
||||
}
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
@ -128,7 +128,6 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts
|
|||
// flags, title, etc. And country, don't forget country!
|
||||
private void OnNewClient(IClientAPI client)
|
||||
{
|
||||
lock(m_Cache)
|
||||
m_Cache.Remove(client.Name);
|
||||
}
|
||||
|
||||
|
@ -138,14 +137,11 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts
|
|||
{
|
||||
bool inCache = false;
|
||||
UserAccount account;
|
||||
lock(m_Cache)
|
||||
account = m_Cache.Get(userID, out inCache);
|
||||
if (inCache)
|
||||
return account;
|
||||
|
||||
account = base.GetUserAccount(scopeID, userID);
|
||||
lock(m_Cache)
|
||||
if(account != null)
|
||||
m_Cache.Cache(userID, account);
|
||||
|
||||
return account;
|
||||
|
@ -155,14 +151,12 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts
|
|||
{
|
||||
bool inCache = false;
|
||||
UserAccount account;
|
||||
lock(m_Cache)
|
||||
account = m_Cache.Get(firstName + " " + lastName, out inCache);
|
||||
if (inCache)
|
||||
return account;
|
||||
|
||||
account = base.GetUserAccount(scopeID, firstName, lastName);
|
||||
if (account != null)
|
||||
lock(m_Cache)
|
||||
m_Cache.Cache(account.PrincipalID, account);
|
||||
|
||||
return account;
|
||||
|
@ -181,7 +175,6 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts
|
|||
{
|
||||
if(UUID.TryParse(id, out uuid))
|
||||
{
|
||||
lock(m_Cache)
|
||||
account = m_Cache.Get(uuid, out inCache);
|
||||
if (inCache)
|
||||
accs.Add(account);
|
||||
|
@ -195,16 +188,16 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts
|
|||
List<UserAccount> ext = base.GetUserAccounts(scopeID, missing);
|
||||
if(ext != null && ext.Count >0 )
|
||||
{
|
||||
accs.AddRange(ext);
|
||||
foreach(UserAccount acc in ext)
|
||||
{
|
||||
if(acc != null)
|
||||
lock(m_Cache)
|
||||
{
|
||||
accs.Add(acc);
|
||||
m_Cache.Cache(acc.PrincipalID, acc);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
return accs;
|
||||
}
|
||||
|
||||
|
|
|
@ -36,7 +36,8 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts
|
|||
{
|
||||
public class UserAccountCache : IUserAccountCacheModule
|
||||
{
|
||||
private const double CACHE_EXPIRATION_SECONDS = 120000.0; // 33 hours!
|
||||
private const double CACHE_EXPIRATION_SECONDS = 3600.0; // 1 hour!
|
||||
private const double CACHE_NULL_EXPIRATION_SECONDS = 600; // 10minutes
|
||||
|
||||
// private static readonly ILog m_log =
|
||||
// LogManager.GetLogger(
|
||||
|
@ -44,6 +45,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts
|
|||
|
||||
private ExpiringCache<UUID, UserAccount> m_UUIDCache;
|
||||
private ExpiringCache<string, UUID> m_NameCache;
|
||||
private object accessLock = new object();
|
||||
|
||||
public UserAccountCache()
|
||||
{
|
||||
|
@ -54,15 +56,23 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts
|
|||
public void Cache(UUID userID, UserAccount account)
|
||||
{
|
||||
// Cache even null accounts
|
||||
lock(accessLock)
|
||||
{
|
||||
if (account == null)
|
||||
m_UUIDCache.AddOrUpdate(userID, null, CACHE_NULL_EXPIRATION_SECONDS);
|
||||
else
|
||||
{
|
||||
m_UUIDCache.AddOrUpdate(userID, account, CACHE_EXPIRATION_SECONDS);
|
||||
if (account != null)
|
||||
m_NameCache.AddOrUpdate(account.Name, account.PrincipalID, CACHE_EXPIRATION_SECONDS);
|
||||
}
|
||||
|
||||
//m_log.DebugFormat("[USER CACHE]: cached user {0}", userID);
|
||||
}
|
||||
}
|
||||
|
||||
public void Invalidate(UUID userID)
|
||||
{
|
||||
lock(accessLock)
|
||||
m_UUIDCache.Remove(userID);
|
||||
}
|
||||
|
||||
|
@ -70,35 +80,43 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts
|
|||
{
|
||||
UserAccount account = null;
|
||||
inCache = false;
|
||||
lock(accessLock)
|
||||
{
|
||||
if (m_UUIDCache.TryGetValue(userID, out account))
|
||||
{
|
||||
//m_log.DebugFormat("[USER CACHE]: Account {0} {1} found in cache", account.FirstName, account.LastName);
|
||||
inCache = true;
|
||||
return account;
|
||||
}
|
||||
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public UserAccount Get(string name, out bool inCache)
|
||||
{
|
||||
inCache = false;
|
||||
lock(accessLock)
|
||||
{
|
||||
if (!m_NameCache.Contains(name))
|
||||
return null;
|
||||
|
||||
UserAccount account = null;
|
||||
UUID uuid = UUID.Zero;
|
||||
if (m_NameCache.TryGetValue(name, out uuid))
|
||||
{
|
||||
if (m_UUIDCache.TryGetValue(uuid, out account))
|
||||
{
|
||||
inCache = true;
|
||||
return account;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public void Remove(string name)
|
||||
{
|
||||
lock(accessLock)
|
||||
{
|
||||
if (!m_NameCache.Contains(name))
|
||||
return;
|
||||
|
@ -111,4 +129,5 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -920,7 +920,7 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands
|
|||
return false;
|
||||
}
|
||||
|
||||
string rawConsoleEndVector = rawComponents.Skip(2).Take(1).Single();
|
||||
string rawConsoleEndVector = rawComponents.Skip(1).Take(1).Single();
|
||||
|
||||
if (!ConsoleUtil.TryParseConsoleMaxVector(rawConsoleEndVector, out endVector))
|
||||
{
|
||||
|
|
|
@ -166,8 +166,6 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
/// <param name="remoteClient"></param>
|
||||
public void SelectPrim(List<uint> primIDs, IClientAPI remoteClient)
|
||||
{
|
||||
List<ISceneEntity> needUpdates = new List<ISceneEntity>();
|
||||
|
||||
foreach(uint primLocalID in primIDs)
|
||||
{
|
||||
SceneObjectPart part = GetSceneObjectPart(primLocalID);
|
||||
|
@ -179,8 +177,6 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
if (sog == null)
|
||||
continue;
|
||||
|
||||
needUpdates.Add((ISceneEntity)part);
|
||||
|
||||
// waste of time because properties do not send prim flags as they should
|
||||
// if a friend got or lost edit rights after login, a full update is needed
|
||||
if(sog.OwnerID != remoteClient.AgentId)
|
||||
|
@ -193,10 +189,9 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
part.IsSelected = true;
|
||||
EventManager.TriggerParcelPrimCountTainted();
|
||||
}
|
||||
}
|
||||
|
||||
if(needUpdates.Count > 0)
|
||||
remoteClient.SendSelectedPartsProprieties(needUpdates);
|
||||
part.SendPropertiesToClient(remoteClient);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -248,37 +243,6 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
SceneObjectPart part = GetSceneObjectPart(primLocalID);
|
||||
if (part == null)
|
||||
return;
|
||||
/*
|
||||
// A deselect packet contains all the local prims being deselected. However, since selection is still
|
||||
// group based we only want the root prim to trigger a full update - otherwise on objects with many prims
|
||||
// we end up sending many duplicate ObjectUpdates
|
||||
if (part.ParentGroup.RootPart.LocalId != part.LocalId)
|
||||
return;
|
||||
|
||||
// This is wrong, wrong, wrong. Selection should not be
|
||||
// handled by group, but by prim. Legacy cruft.
|
||||
// TODO: Make selection flagging per prim!
|
||||
//
|
||||
if (Permissions.CanEditObject(part.ParentGroup.UUID, remoteClient.AgentId)
|
||||
|| Permissions.CanMoveObject(part.ParentGroup.UUID, remoteClient.AgentId))
|
||||
part.ParentGroup.IsSelected = false;
|
||||
|
||||
part.ParentGroup.ScheduleGroupForFullUpdate();
|
||||
|
||||
// If it's not an attachment, and we are allowed to move it,
|
||||
// then we might have done so. If we moved across a parcel
|
||||
// boundary, we will need to recount prims on the parcels.
|
||||
// For attachments, that makes no sense.
|
||||
//
|
||||
if (!part.ParentGroup.IsAttachment)
|
||||
{
|
||||
if (Permissions.CanEditObject(
|
||||
part.UUID, remoteClient.AgentId)
|
||||
|| Permissions.CanMoveObject(
|
||||
part.UUID, remoteClient.AgentId))
|
||||
EventManager.TriggerParcelPrimCountTainted();
|
||||
}
|
||||
*/
|
||||
|
||||
bool oldgprSelect = part.ParentGroup.IsSelected;
|
||||
|
||||
|
@ -614,7 +578,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
{
|
||||
m_log.Error(
|
||||
string.Format(
|
||||
"[AGENT INVENTORY]: Error in SendInventoryAsync() for {0} with folder ID {1}. Exception ", e));
|
||||
"[AGENT INVENTORY]: Error in SendInventoryAsync() for {0} with folder ID {1}. Exception ", e, folderID));
|
||||
}
|
||||
Thread.Sleep(20);
|
||||
}
|
||||
|
|
|
@ -67,8 +67,6 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
|
||||
#region Fields
|
||||
|
||||
public bool EmergencyMonitoring = false;
|
||||
|
||||
/// <summary>
|
||||
/// Show debug information about animations.
|
||||
/// </summary>
|
||||
|
@ -4606,7 +4604,8 @@ Label_GroupsDone:
|
|||
}
|
||||
|
||||
// TODO: This check should probably be in QueryAccess().
|
||||
ILandObject nearestParcel = GetNearestAllowedParcel(cAgentData.AgentID, RegionInfo.RegionSizeX / 2, RegionInfo.RegionSizeY / 2);
|
||||
ILandObject nearestParcel = GetNearestAllowedParcel(cAgentData.AgentID,
|
||||
(float)RegionInfo.RegionSizeX * 0.5f, (float)RegionInfo.RegionSizeY * 0.5f);
|
||||
if (nearestParcel == null)
|
||||
{
|
||||
m_log.InfoFormat(
|
||||
|
|
|
@ -287,7 +287,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
m_log.Error(string.Format("[SCENE]: SceneBase.cs: Close() - Failed with exception ", e));
|
||||
m_log.Error(string.Format("[SCENE]: SceneBase.cs: Close() - Failed with exception {0}", e));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -246,11 +246,11 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
// try to work around that scale down X and Y acording to region size, so reducing the resolution
|
||||
//
|
||||
// viewers need to scale up
|
||||
float scaleX = m_parentScene.RegionInfo.RegionSizeX / Constants.RegionSize;
|
||||
float scaleX = (float)m_parentScene.RegionInfo.RegionSizeX / (float)Constants.RegionSize;
|
||||
if (scaleX == 0)
|
||||
scaleX = 1.0f;
|
||||
scaleX = 1.0f / scaleX;
|
||||
float scaleY = m_parentScene.RegionInfo.RegionSizeY / Constants.RegionSize;
|
||||
float scaleY = (float)m_parentScene.RegionInfo.RegionSizeY / (float)Constants.RegionSize;
|
||||
if (scaleY == 0)
|
||||
scaleY = 1.0f;
|
||||
scaleY = 1.0f / scaleY;
|
||||
|
|
|
@ -781,6 +781,34 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
}
|
||||
}
|
||||
|
||||
// requested Velocity for physics engines avatar motors
|
||||
// only makes sense if there is a physical rep
|
||||
public Vector3 TargetVelocity
|
||||
{
|
||||
get
|
||||
{
|
||||
if (PhysicsActor != null)
|
||||
return PhysicsActor.TargetVelocity;
|
||||
else
|
||||
return Vector3.Zero;
|
||||
}
|
||||
|
||||
set
|
||||
{
|
||||
if (PhysicsActor != null)
|
||||
{
|
||||
try
|
||||
{
|
||||
PhysicsActor.TargetVelocity = value;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
m_log.Error("[SCENE PRESENCE]: TARGETVELOCITY " + e.Message);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private Quaternion m_bodyRot = Quaternion.Identity;
|
||||
|
||||
/// <summary>
|
||||
|
@ -2269,6 +2297,46 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
/// <param name="distance"></param>
|
||||
///
|
||||
|
||||
private void checkCameraCollision()
|
||||
{
|
||||
if(!m_scene.PhysicsScene.SupportsRayCast())
|
||||
return;
|
||||
|
||||
++m_movementUpdateCount;
|
||||
if (m_movementUpdateCount < 1)
|
||||
m_movementUpdateCount = 1;
|
||||
|
||||
if (m_doingCamRayCast || m_movementUpdateCount % NumMovementsBetweenRayCast != 0)
|
||||
return;
|
||||
|
||||
if (m_followCamAuto && !m_mouseLook)
|
||||
{
|
||||
Vector3 posAdjusted = AbsolutePosition;
|
||||
// posAdjusted.Z += 0.5f * Appearance.AvatarSize.Z - 0.5f;
|
||||
// not good for tiny or huge avatars
|
||||
posAdjusted.Z += 1.0f; // viewer current camera focus point
|
||||
Vector3 tocam = CameraPosition - posAdjusted;
|
||||
|
||||
float distTocamlen = tocam.LengthSquared();
|
||||
if (distTocamlen > 0.08f && distTocamlen < 400)
|
||||
{
|
||||
distTocamlen = (float)Math.Sqrt(distTocamlen);
|
||||
tocam *= (1.0f / distTocamlen);
|
||||
|
||||
m_doingCamRayCast = true;
|
||||
m_scene.PhysicsScene.RaycastWorld(posAdjusted, tocam, distTocamlen + 1.0f, RayCastCameraCallback);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (CameraConstraintActive)
|
||||
{
|
||||
Vector4 plane = new Vector4(0.9f, 0.0f, 0.361f, -10000f); // not right...
|
||||
UpdateCameraCollisionPlane(plane);
|
||||
CameraConstraintActive = false;
|
||||
}
|
||||
}
|
||||
|
||||
private void UpdateCameraCollisionPlane(Vector4 plane)
|
||||
{
|
||||
if (m_lastCameraCollisionPlane != plane)
|
||||
|
@ -2280,17 +2348,14 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
|
||||
public void RayCastCameraCallback(bool hitYN, Vector3 collisionPoint, uint localid, float distance, Vector3 pNormal)
|
||||
{
|
||||
const float POSITION_TOLERANCE = 0.02f;
|
||||
const float ROTATION_TOLERANCE = 0.02f;
|
||||
// const float POSITION_TOLERANCE = 0.02f;
|
||||
// const float ROTATION_TOLERANCE = 0.02f;
|
||||
|
||||
m_doingCamRayCast = false;
|
||||
if (hitYN && localid != LocalId)
|
||||
{
|
||||
SceneObjectGroup group = m_scene.GetGroupByPrim(localid);
|
||||
bool IsPrim = group != null;
|
||||
if (IsPrim)
|
||||
if (localid != 0)
|
||||
{
|
||||
SceneObjectPart part = group.GetPart(localid);
|
||||
SceneObjectPart part = m_scene.GetSceneObjectPart(localid);
|
||||
if (part != null && !part.VolumeDetectActive)
|
||||
{
|
||||
CameraConstraintActive = true;
|
||||
|
@ -2323,13 +2388,16 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
UpdateCameraCollisionPlane(plane);
|
||||
}
|
||||
}
|
||||
else if (!m_pos.ApproxEquals(m_lastPosition, POSITION_TOLERANCE) ||
|
||||
!Rotation.ApproxEquals(m_lastRotation, ROTATION_TOLERANCE))
|
||||
// else if (!m_pos.ApproxEquals(m_lastPosition, POSITION_TOLERANCE) ||
|
||||
// !Rotation.ApproxEquals(m_lastRotation, ROTATION_TOLERANCE))
|
||||
else if(CameraConstraintActive)
|
||||
{
|
||||
Vector4 plane = new Vector4(0.9f, 0.0f, 0.361f, -9000f); // not right...
|
||||
UpdateCameraCollisionPlane(plane);
|
||||
CameraConstraintActive = false;
|
||||
}
|
||||
|
||||
m_doingCamRayCast = false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -2414,38 +2482,8 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
|
||||
// Raycast from the avatar's head to the camera to see if there's anything blocking the view
|
||||
// this exclude checks may not be complete
|
||||
|
||||
if (m_movementUpdateCount % NumMovementsBetweenRayCast == 0 && m_scene.PhysicsScene.SupportsRayCast())
|
||||
{
|
||||
if (!m_doingCamRayCast && !m_mouseLook && ParentID == 0)
|
||||
{
|
||||
Vector3 posAdjusted = AbsolutePosition;
|
||||
// posAdjusted.Z += 0.5f * Appearance.AvatarSize.Z - 0.5f;
|
||||
posAdjusted.Z += 1.0f; // viewer current camera focus point
|
||||
Vector3 tocam = CameraPosition - posAdjusted;
|
||||
tocam.X = (float)Math.Round(tocam.X, 1);
|
||||
tocam.Y = (float)Math.Round(tocam.Y, 1);
|
||||
tocam.Z = (float)Math.Round(tocam.Z, 1);
|
||||
|
||||
float distTocamlen = tocam.Length();
|
||||
if (distTocamlen > 0.3f)
|
||||
{
|
||||
tocam *= (1.0f / distTocamlen);
|
||||
posAdjusted.X = (float)Math.Round(posAdjusted.X, 1);
|
||||
posAdjusted.Y = (float)Math.Round(posAdjusted.Y, 1);
|
||||
posAdjusted.Z = (float)Math.Round(posAdjusted.Z, 1);
|
||||
|
||||
m_doingCamRayCast = true;
|
||||
m_scene.PhysicsScene.RaycastWorld(posAdjusted, tocam, distTocamlen + 1.0f, RayCastCameraCallback);
|
||||
}
|
||||
}
|
||||
else if (CameraConstraintActive && (m_mouseLook || ParentID != 0))
|
||||
{
|
||||
Vector4 plane = new Vector4(0.9f, 0.0f, 0.361f, -10000f); // not right...
|
||||
UpdateCameraCollisionPlane(plane);
|
||||
CameraConstraintActive = false;
|
||||
}
|
||||
}
|
||||
if(agentData.NeedsCameraCollision && ParentID == 0) // condition parentID may be wrong
|
||||
checkCameraCollision();
|
||||
|
||||
uint flagsForScripts = (uint)flags;
|
||||
flags = RemoveIgnoredControls(flags, IgnoredControls);
|
||||
|
@ -2714,14 +2752,10 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
// Scene.RegionInfo.RegionName, remoteClient.Name, (AgentManager.ControlFlags)agentData.ControlFlags);
|
||||
|
||||
if (IsChildAgent)
|
||||
{
|
||||
// // m_log.Debug("DEBUG: HandleAgentUpdate: child agent");
|
||||
return;
|
||||
}
|
||||
|
||||
++m_movementUpdateCount;
|
||||
if (m_movementUpdateCount < 1)
|
||||
m_movementUpdateCount = 1;
|
||||
if(IsInTransit)
|
||||
return;
|
||||
|
||||
// AgentManager.ControlFlags flags = (AgentManager.ControlFlags)agentData.ControlFlags;
|
||||
|
||||
|
@ -2731,7 +2765,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
// Use these three vectors to figure out what the agent is looking at
|
||||
// Convert it to a Matrix and/or Quaternion
|
||||
|
||||
// this my need lock
|
||||
// this may need lock
|
||||
CameraAtAxis = agentData.CameraAtAxis;
|
||||
CameraLeftAxis = agentData.CameraLeftAxis;
|
||||
CameraUpAxis = agentData.CameraUpAxis;
|
||||
|
@ -2745,23 +2779,27 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
|
||||
DrawDistance = agentData.Far;
|
||||
|
||||
|
||||
// Check if Client has camera in 'follow cam' or 'build' mode.
|
||||
Vector3 camdif = (Vector3.One * Rotation - Vector3.One * CameraRotation);
|
||||
|
||||
m_followCamAuto = ((CameraUpAxis.Z > 0.959f && CameraUpAxis.Z < 0.98f)
|
||||
&& (Math.Abs(camdif.X) < 0.4f && Math.Abs(camdif.Y) < 0.4f)) ? true : false;
|
||||
|
||||
|
||||
//m_log.DebugFormat("[FollowCam]: {0}", m_followCamAuto);
|
||||
// Raycast from the avatar's head to the camera to see if there's anything blocking the view
|
||||
if ((m_movementUpdateCount % NumMovementsBetweenRayCast) == 0 && m_scene.PhysicsScene.SupportsRayCast())
|
||||
// Vector3 camdif = (Vector3.One * Rotation - Vector3.One * CameraRotation);
|
||||
m_followCamAuto = false;
|
||||
if(!m_mouseLook)
|
||||
{
|
||||
if (m_followCamAuto)
|
||||
if((CameraUpAxis.Z > 0.959f && CameraUpAxis.Z < 0.98f))
|
||||
{
|
||||
Vector3 posAdjusted = m_pos + HEAD_ADJUSTMENT;
|
||||
m_scene.PhysicsScene.RaycastWorld(m_pos, Vector3.Normalize(CameraPosition - posAdjusted), Vector3.Distance(CameraPosition, posAdjusted) + 0.3f, RayCastCameraCallback);
|
||||
Vector3 camdif = new Vector3(1f, 0f, 0f) * Rotation;
|
||||
float ftmp = camdif.X - CameraAtAxis.X;
|
||||
if(Math.Abs(ftmp) < 0.1f)
|
||||
{
|
||||
ftmp = camdif.Y - CameraAtAxis.Y;
|
||||
if(Math.Abs(ftmp) < 0.1f)
|
||||
m_followCamAuto = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(agentData.NeedsCameraCollision)
|
||||
checkCameraCollision();
|
||||
|
||||
TriggerScenePresenceUpdated();
|
||||
}
|
||||
|
@ -3649,7 +3687,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
m_forceToApplyValid = true;
|
||||
}
|
||||
*/
|
||||
Velocity = direc;
|
||||
TargetVelocity = direc;
|
||||
Animator.UpdateMovementAnimations();
|
||||
}
|
||||
|
||||
|
|
|
@ -125,13 +125,6 @@ namespace OpenSim.Region.OptionalModules.UDP.Linden
|
|||
+ " With the 'full' option child agents are also shown.",
|
||||
(mod, cmd) => MainConsole.Instance.Output(GetThrottlesReport(cmd)));
|
||||
|
||||
scene.AddCommand(
|
||||
"Comms", this, "emergency-monitoring",
|
||||
"emergency-monitoring",
|
||||
"Go on/off emergency monitoring mode",
|
||||
"Go on/off emergency monitoring mode",
|
||||
HandleEmergencyMonitoring);
|
||||
|
||||
scene.AddCommand(
|
||||
"Comms", this, "show client stats",
|
||||
"show client stats [first_name last_name]",
|
||||
|
@ -197,24 +190,6 @@ namespace OpenSim.Region.OptionalModules.UDP.Linden
|
|||
return report.ToString();
|
||||
}
|
||||
|
||||
protected void HandleEmergencyMonitoring(string module, string[] cmd)
|
||||
{
|
||||
bool mode = true;
|
||||
if (cmd.Length == 1 || (cmd.Length > 1 && cmd[1] == "on"))
|
||||
{
|
||||
mode = true;
|
||||
MainConsole.Instance.Output("Emergency Monitoring ON");
|
||||
}
|
||||
else
|
||||
{
|
||||
mode = false;
|
||||
MainConsole.Instance.Output("Emergency Monitoring OFF");
|
||||
}
|
||||
|
||||
foreach (Scene s in m_scenes.Values)
|
||||
s.EmergencyMonitoring = mode;
|
||||
}
|
||||
|
||||
protected string GetColumnEntry(string entry, int maxLength, int columnPadding)
|
||||
{
|
||||
return string.Format(
|
||||
|
|
|
@ -108,10 +108,6 @@ public class BSActorAvatarMove : BSActor
|
|||
{
|
||||
if (m_velocityMotor != null)
|
||||
{
|
||||
// if (targ == OMV.Vector3.Zero)
|
||||
// Util.PrintCallStack();
|
||||
//
|
||||
// Console.WriteLine("SetVelocityAndTarget, {0} {1}", vel, targ);
|
||||
m_velocityMotor.Reset();
|
||||
m_velocityMotor.SetTarget(targ);
|
||||
m_velocityMotor.SetCurrent(vel);
|
||||
|
@ -128,7 +124,7 @@ public class BSActorAvatarMove : BSActor
|
|||
m_waitingForLowVelocityForStationary = true;
|
||||
}
|
||||
|
||||
// If a movement motor has not been created, create one and start the hovering.
|
||||
// If a movement motor has not been created, create one and start the movement
|
||||
private void ActivateAvatarMove()
|
||||
{
|
||||
if (m_velocityMotor == null)
|
||||
|
@ -161,7 +157,7 @@ public class BSActorAvatarMove : BSActor
|
|||
}
|
||||
}
|
||||
|
||||
// Called just before the simulation step. Update the vertical position for hoverness.
|
||||
// Called just before the simulation step.
|
||||
private void Mover(float timeStep)
|
||||
{
|
||||
// Don't do movement while the object is selected.
|
||||
|
|
|
@ -449,6 +449,7 @@ public sealed class BSCharacter : BSPhysObject
|
|||
public override OMV.Vector3 GeometricCenter { get { return OMV.Vector3.Zero; } }
|
||||
public override OMV.Vector3 CenterOfMass { get { return OMV.Vector3.Zero; } }
|
||||
|
||||
// PhysicsActor.TargetVelocity
|
||||
// Sets the target in the motor. This starts the changing of the avatar's velocity.
|
||||
public override OMV.Vector3 TargetVelocity
|
||||
{
|
||||
|
@ -459,7 +460,7 @@ public sealed class BSCharacter : BSPhysObject
|
|||
set
|
||||
{
|
||||
DetailLog("{0},BSCharacter.setTargetVelocity,call,vel={1}", LocalID, value);
|
||||
m_targetVelocity = value;
|
||||
base.m_targetVelocity = value;
|
||||
OMV.Vector3 targetVel = value;
|
||||
if (_setAlwaysRun && !_flying)
|
||||
targetVel *= new OMV.Vector3(BSParam.AvatarAlwaysRunFactor, BSParam.AvatarAlwaysRunFactor, 1f);
|
||||
|
@ -472,32 +473,12 @@ public sealed class BSCharacter : BSPhysObject
|
|||
public override OMV.Vector3 Velocity {
|
||||
get { return RawVelocity; }
|
||||
set {
|
||||
RawVelocity = value;
|
||||
OMV.Vector3 vel = RawVelocity;
|
||||
|
||||
DetailLog("{0}: set Velocity = {1}", LocalID, value);
|
||||
|
||||
PhysScene.TaintedObject(LocalID, "BSCharacter.setVelocity", delegate()
|
||||
{
|
||||
if (m_moveActor != null)
|
||||
m_moveActor.SetVelocityAndTarget(vel, vel, true /* inTaintTime */);
|
||||
|
||||
DetailLog("{0},BSCharacter.setVelocity,taint,vel={1}", LocalID, vel);
|
||||
ForceVelocity = vel;
|
||||
});
|
||||
{
|
||||
// m_moveActor.SetVelocityAndTarget(OMV.Vector3.Zero, OMV.Vector3.Zero, false /* inTaintTime */);
|
||||
m_moveActor.SetVelocityAndTarget(RawVelocity, RawVelocity, false /* inTaintTime */);
|
||||
}
|
||||
}
|
||||
|
||||
public override OMV.Vector3 ForceVelocity {
|
||||
get { return RawVelocity; }
|
||||
set {
|
||||
PhysScene.AssertInTaintTime("BSCharacter.ForceVelocity");
|
||||
// Util.PrintCallStack();
|
||||
DetailLog("{0}: set ForceVelocity = {1}", LocalID, value);
|
||||
|
||||
RawVelocity = value;
|
||||
PhysScene.PE.SetLinearVelocity(PhysBody, RawVelocity);
|
||||
PhysScene.PE.Activate(PhysBody, true);
|
||||
base.Velocity = value;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -506,11 +487,23 @@ public sealed class BSCharacter : BSPhysObject
|
|||
{
|
||||
if (m_moveActor != null)
|
||||
{
|
||||
m_moveActor.SetVelocityAndTarget(OMV.Vector3.Zero, OMV.Vector3.Zero, false /* inTaintTime */);
|
||||
// m_moveActor.SetVelocityAndTarget(OMV.Vector3.Zero, OMV.Vector3.Zero, false /* inTaintTime */);
|
||||
m_moveActor.SetVelocityAndTarget(RawVelocity, RawVelocity, false /* inTaintTime */);
|
||||
}
|
||||
base.SetMomentum(momentum);
|
||||
}
|
||||
|
||||
public override OMV.Vector3 ForceVelocity {
|
||||
get { return RawVelocity; }
|
||||
set {
|
||||
PhysScene.AssertInTaintTime("BSCharacter.ForceVelocity");
|
||||
DetailLog("{0}: BSCharacter.ForceVelocity.set = {1}", LocalID, value);
|
||||
|
||||
RawVelocity = Util.ClampV(value, BSParam.MaxLinearVelocity);
|
||||
PhysScene.PE.SetLinearVelocity(PhysBody, RawVelocity);
|
||||
PhysScene.PE.Activate(PhysBody, true);
|
||||
}
|
||||
}
|
||||
|
||||
public override OMV.Vector3 Torque {
|
||||
get { return RawTorque; }
|
||||
|
|
|
@ -230,15 +230,22 @@ public abstract class BSPhysObject : PhysicsActor
|
|||
// Update the physical location and motion of the object. Called with data from Bullet.
|
||||
public abstract void UpdateProperties(EntityProperties entprop);
|
||||
|
||||
// The position value as known by BulletSim. Does not effect the physics engine.
|
||||
public virtual OMV.Vector3 RawPosition { get; set; }
|
||||
// Set position in BulletSim and the physics engined to a value immediately. Must be called at taint time.
|
||||
public abstract OMV.Vector3 ForcePosition { get; set; }
|
||||
|
||||
// The orientation value as known by BulletSim. Does not effect the physics engine.
|
||||
public virtual OMV.Quaternion RawOrientation { get; set; }
|
||||
// Set orientation in BulletSim and the physics engine to a value immediately. Must be called at taint time.
|
||||
public abstract OMV.Quaternion ForceOrientation { get; set; }
|
||||
|
||||
// The velocity value as known by BulletSim. Does not effect the physics engine.
|
||||
public virtual OMV.Vector3 RawVelocity { get; set; }
|
||||
// Set velocity in BulletSim and the physics engined to a value immediately. Must be called at taint time.
|
||||
public abstract OMV.Vector3 ForceVelocity { get; set; }
|
||||
|
||||
// The rotational velocity value as known by BulletSim. Does not effect the physics engine.
|
||||
public OMV.Vector3 RawRotationalVelocity { get; set; }
|
||||
|
||||
// RawForce is a constant force applied to object (see Force { set; } )
|
||||
|
@ -252,18 +259,29 @@ public abstract class BSPhysObject : PhysicsActor
|
|||
public abstract void AddAngularForce(bool inTaintTime, OMV.Vector3 force);
|
||||
public abstract void AddForce(bool inTaintTime, OMV.Vector3 force);
|
||||
|
||||
// PhysicsActor.SetMomentum
|
||||
// All the physics engined use this as a way of forcing the velocity to something.
|
||||
public override void SetMomentum(OMV.Vector3 momentum)
|
||||
// PhysicsActor.Velocity
|
||||
public override OMV.Vector3 Velocity
|
||||
{
|
||||
// This doesn't just set Velocity=momentum because velocity is ramped up to (see MoveActor)
|
||||
RawVelocity = momentum;
|
||||
PhysScene.TaintedObject(LocalID, TypeName + ".SetMomentum", delegate()
|
||||
get { return RawVelocity; }
|
||||
set
|
||||
{
|
||||
// DetailLog("{0},BSPrim.SetMomentum,taint,vel={1}", LocalID, RawVelocity);
|
||||
// This sets the velocity now. BSCharacter will override to clear target velocity
|
||||
// before calling this.
|
||||
RawVelocity = value;
|
||||
PhysScene.TaintedObject(LocalID, TypeName + ".SetVelocity", delegate () {
|
||||
// DetailLog("{0},BSPhysObject.Velocity.set,vel={1}", LocalID, RawVelocity);
|
||||
ForceVelocity = RawVelocity;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// PhysicsActor.SetMomentum
|
||||
// All the physics engines use this as a way of forcing the velocity to something.
|
||||
// BSCharacter overrides this so it can set the target velocity to zero before calling this.
|
||||
public override void SetMomentum(OMV.Vector3 momentum)
|
||||
{
|
||||
this.Velocity = momentum;
|
||||
}
|
||||
|
||||
public override OMV.Vector3 RotationalVelocity {
|
||||
get {
|
||||
|
|
|
@ -787,17 +787,6 @@ public class BSPrim : BSPhysObject
|
|||
}
|
||||
}
|
||||
}
|
||||
public override OMV.Vector3 Velocity {
|
||||
get { return RawVelocity; }
|
||||
set {
|
||||
RawVelocity = value;
|
||||
PhysScene.TaintedObject(LocalID, "BSPrim.setVelocity", delegate()
|
||||
{
|
||||
// DetailLog("{0},BSPrim.SetVelocity,taint,vel={1}", LocalID, RawVelocity);
|
||||
ForceVelocity = RawVelocity;
|
||||
});
|
||||
}
|
||||
}
|
||||
public override OMV.Vector3 ForceVelocity {
|
||||
get { return RawVelocity; }
|
||||
set {
|
||||
|
|
|
@ -632,6 +632,25 @@ namespace OpenSim.Region.PhysicsModule.ubOde
|
|||
}
|
||||
}
|
||||
|
||||
public override Vector3 TargetVelocity
|
||||
{
|
||||
get
|
||||
{
|
||||
return m_targetVelocity;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (value.IsFinite())
|
||||
{
|
||||
AddChange(changes.TargetVelocity, value);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_log.Warn("[PHYSICS]: Got a NaN velocity from Scene in a Character");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public override Vector3 Torque
|
||||
{
|
||||
get { return Vector3.Zero; }
|
||||
|
@ -689,7 +708,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde
|
|||
}
|
||||
else
|
||||
{
|
||||
AddChange(changes.Velocity, force);
|
||||
AddChange(changes.TargetVelocity, force);
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@ -1671,16 +1690,14 @@ namespace OpenSim.Region.PhysicsModule.ubOde
|
|||
{
|
||||
AvatarGeomAndBodyDestroy();
|
||||
|
||||
|
||||
float oldsz = m_size.Z;
|
||||
m_size = pSize;
|
||||
|
||||
|
||||
AvatarGeomAndBodyCreation(_position.X, _position.Y,
|
||||
_position.Z + (m_size.Z - oldsz) * 0.5f);
|
||||
|
||||
Velocity = Vector3.Zero;
|
||||
|
||||
// Velocity = Vector3.Zero;
|
||||
m_targetVelocity = Vector3.Zero;
|
||||
|
||||
_parent_scene.actor_name_map[collider] = (PhysicsActor)this;
|
||||
_parent_scene.actor_name_map[capsule] = (PhysicsActor)this;
|
||||
|
@ -1738,6 +1755,15 @@ namespace OpenSim.Region.PhysicsModule.ubOde
|
|||
}
|
||||
|
||||
private void changeVelocity(Vector3 newVel)
|
||||
{
|
||||
_velocity = newVel;
|
||||
setFreeMove();
|
||||
|
||||
if (Body != IntPtr.Zero)
|
||||
d.BodySetLinearVel(Body, newVel.X, newVel.Y, newVel.Z);
|
||||
}
|
||||
|
||||
private void changeTargetVelocity(Vector3 newVel)
|
||||
{
|
||||
m_pidControllerActive = true;
|
||||
m_freemove = false;
|
||||
|
@ -1881,6 +1907,10 @@ namespace OpenSim.Region.PhysicsModule.ubOde
|
|||
changeVelocity((Vector3)arg);
|
||||
break;
|
||||
|
||||
case changes.TargetVelocity:
|
||||
changeTargetVelocity((Vector3)arg);
|
||||
break;
|
||||
|
||||
// case changes.Acceleration:
|
||||
// changeacceleration((Vector3)arg);
|
||||
// break;
|
||||
|
|
|
@ -1157,6 +1157,8 @@ namespace OpenSim.Region.PhysicsModule.ubOde
|
|||
|
||||
m_building = true; // control must set this to false when done
|
||||
|
||||
AddChange(changes.Add, null);
|
||||
|
||||
// get basic mass parameters
|
||||
ODEPhysRepData repData = _parent_scene.m_meshWorker.NewActorPhysRep(this, _pbs, _size, m_shapetype);
|
||||
|
||||
|
@ -1165,8 +1167,6 @@ namespace OpenSim.Region.PhysicsModule.ubOde
|
|||
m_OBBOffset = repData.OBBOffset;
|
||||
|
||||
UpdatePrimBodyData();
|
||||
|
||||
AddChange(changes.Add, null);
|
||||
}
|
||||
|
||||
private void resetCollisionAccounting()
|
||||
|
@ -3805,6 +3805,9 @@ namespace OpenSim.Region.PhysicsModule.ubOde
|
|||
changevelocity((Vector3)arg);
|
||||
break;
|
||||
|
||||
case changes.TargetVelocity:
|
||||
break;
|
||||
|
||||
// case changes.Acceleration:
|
||||
// changeacceleration((Vector3)arg);
|
||||
// break;
|
||||
|
@ -3933,8 +3936,6 @@ namespace OpenSim.Region.PhysicsModule.ubOde
|
|||
donullchange();
|
||||
break;
|
||||
|
||||
|
||||
|
||||
default:
|
||||
donullchange();
|
||||
break;
|
||||
|
|
|
@ -112,6 +112,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde
|
|||
OriOffset, // not in use
|
||||
// arg Vector3 new position in local coords. Changes prim position in object
|
||||
Velocity,
|
||||
TargetVelocity,
|
||||
AngVelocity,
|
||||
Acceleration,
|
||||
Force,
|
||||
|
@ -1219,10 +1220,13 @@ namespace OpenSim.Region.PhysicsModule.ubOde
|
|||
/// </summary>
|
||||
/// <param name="obj"></param>
|
||||
public void RemoveCollisionEventReporting(PhysicsActor obj)
|
||||
{
|
||||
lock(_collisionEventPrimRemove)
|
||||
{
|
||||
if (_collisionEventPrim.Contains(obj) && !_collisionEventPrimRemove.Contains(obj))
|
||||
_collisionEventPrimRemove.Add(obj);
|
||||
}
|
||||
}
|
||||
|
||||
public override float TimeDilation
|
||||
{
|
||||
|
@ -1758,10 +1762,13 @@ namespace OpenSim.Region.PhysicsModule.ubOde
|
|||
prm.SleeperAddCollisionEvents();
|
||||
sleepers.Clear();
|
||||
|
||||
lock(_collisionEventPrimRemove)
|
||||
{
|
||||
foreach (PhysicsActor obj in _collisionEventPrimRemove)
|
||||
_collisionEventPrim.Remove(obj);
|
||||
|
||||
_collisionEventPrimRemove.Clear();
|
||||
}
|
||||
|
||||
// do a ode simulation step
|
||||
d.WorldQuickStep(world, ODE_STEPSIZE);
|
||||
|
|
|
@ -395,6 +395,10 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing
|
|||
{
|
||||
// m_log.DebugFormat("[MESH]: experimental mesh proxy generation for {0}", primName);
|
||||
|
||||
|
||||
// for ubOde we have a diferent mesh use priority
|
||||
// priority is to use full mesh then decomposition
|
||||
// SL does the oposite
|
||||
bool usemesh = false;
|
||||
|
||||
coords = new List<Coord>();
|
||||
|
@ -443,17 +447,11 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing
|
|||
|
||||
if (physicsParms != null)
|
||||
usemesh = true;
|
||||
else
|
||||
{
|
||||
m_log.WarnFormat("[MESH]: Data for PRIM shape type not found for prim {0}",primName);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if(!usemesh && (map.ContainsKey("physics_convex")))
|
||||
physicsParms = (OSDMap)map["physics_convex"];
|
||||
|
||||
|
||||
if (physicsParms == null)
|
||||
{
|
||||
m_log.WarnFormat("[MESH]: unknown mesh type for prim {0}",primName);
|
||||
|
@ -555,7 +553,10 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing
|
|||
range = range - min;
|
||||
range *= invMaxU16;
|
||||
|
||||
if (!convex && cmap.ContainsKey("HullList") && cmap.ContainsKey("Positions"))
|
||||
if(!convex)
|
||||
{
|
||||
// if mesh data not present and not convex then we need convex decomposition data
|
||||
if (cmap.ContainsKey("HullList") && cmap.ContainsKey("Positions"))
|
||||
{
|
||||
List<int> hsizes = new List<int>();
|
||||
int totalpoints = 0;
|
||||
|
@ -624,7 +625,7 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing
|
|||
vs.Clear();
|
||||
continue;
|
||||
}
|
||||
/*
|
||||
/*
|
||||
if (!HullUtils.ComputeHull(vs, ref hullr, 0, 0.0f))
|
||||
{
|
||||
vs.Clear();
|
||||
|
@ -662,7 +663,7 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing
|
|||
f = new Face(vertsoffset + t1, vertsoffset + t2, vertsoffset + t3);
|
||||
faces.Add(f);
|
||||
}
|
||||
*/
|
||||
*/
|
||||
List<int> indices;
|
||||
if (!HullUtils.ComputeHull(vs, out indices))
|
||||
{
|
||||
|
@ -708,7 +709,12 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing
|
|||
if (coords.Count > 0 && faces.Count > 0)
|
||||
return true;
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
// if neither mesh or decomposition present, warn and use convex
|
||||
m_log.WarnFormat("[MESH]: Data for PRIM shape type ( mesh or decomposition) not found for prim {0}",primName);
|
||||
}
|
||||
}
|
||||
vs.Clear();
|
||||
|
||||
if (cmap.ContainsKey("BoundingVerts"))
|
||||
|
|
|
@ -68,7 +68,7 @@ namespace OpenSim.Region.ScriptEngine.Interfaces
|
|||
void SetMinEventDelay(UUID itemID, double delay);
|
||||
int GetStartParameter(UUID itemID);
|
||||
|
||||
void SetScriptState(UUID itemID, bool state);
|
||||
void SetScriptState(UUID itemID, bool state, bool self);
|
||||
bool GetScriptState(UUID itemID);
|
||||
void SetState(UUID itemID, string newState);
|
||||
void ApiResetScript(UUID itemID);
|
||||
|
|
|
@ -521,7 +521,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
|
||||
if ((item = GetScriptByName(name)) != UUID.Zero)
|
||||
{
|
||||
m_ScriptEngine.SetScriptState(item, run == 0 ? false : true);
|
||||
m_ScriptEngine.SetScriptState(item, run == 0 ? false : true, item == m_item.ItemID);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -14358,6 +14358,91 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
return contacts.ToArray();
|
||||
}
|
||||
|
||||
private ContactResult? GroundIntersection2(Vector3 rayStart, Vector3 rayEnd)
|
||||
{
|
||||
// get work copies
|
||||
float sx = rayStart.X;
|
||||
float ex = rayEnd.X;
|
||||
float sy = rayStart.Y;
|
||||
float ey = rayEnd.Y;
|
||||
|
||||
float dx = ex - sx;
|
||||
float dy = ey - sy;
|
||||
|
||||
// region size info
|
||||
float rsx = World.RegionInfo.RegionSizeX;
|
||||
|
||||
float tmp;
|
||||
|
||||
// region bounds
|
||||
if(sx < 0)
|
||||
{
|
||||
if(ex < 0) // totally outside
|
||||
return null;
|
||||
if(dx <= 0) // out and going away
|
||||
return null;
|
||||
else if(ex >= rsx)
|
||||
ex = rsx - 0.001f;
|
||||
tmp = -sx / dx;
|
||||
sy += dy * dx;
|
||||
sx = 0;
|
||||
}
|
||||
else if(sx >= rsx)
|
||||
{
|
||||
if(ex >= rsx) // totally outside
|
||||
return null;
|
||||
if(dx >= 0) // out and going away
|
||||
return null;
|
||||
else if(ex < 0)
|
||||
ex = 0;
|
||||
tmp = (rsx - sx) / dx;
|
||||
sy += dy * dx;
|
||||
sx = rsx - 0.001f;
|
||||
}
|
||||
|
||||
float rsy = World.RegionInfo.RegionSizeY;
|
||||
if(sy < 0)
|
||||
{
|
||||
if(dy <= 0) // out and going away
|
||||
return null;
|
||||
else if(ey >= rsy)
|
||||
ey = rsy - 0.001f;
|
||||
tmp = -sy / dy;
|
||||
sx += dy * dx;
|
||||
sy = 0;
|
||||
}
|
||||
else if(sy >= rsy)
|
||||
{
|
||||
if(dy >= 0) // out and going away
|
||||
return null;
|
||||
else if(ey < 0)
|
||||
ey = 0;
|
||||
tmp = (rsy - sy) / dy;
|
||||
sx += dy * dx;
|
||||
sy = rsy - 0.001f;
|
||||
}
|
||||
|
||||
if(sx < 0 || sx >= rsx)
|
||||
return null;
|
||||
|
||||
float sz = rayStart.Z;
|
||||
float ez = rayEnd.Z;
|
||||
float dz = ez - sz;
|
||||
|
||||
float dist = dx * dx + dy * dy + dz * dz;
|
||||
if(dist < 0.001)
|
||||
return null;
|
||||
dist = (float)Math.Sqrt(dist);
|
||||
tmp = 1.0f / dist;
|
||||
Vector3 rayn = new Vector3(dx * tmp, dy * tmp, dz * tmp);
|
||||
|
||||
ContactResult? result = null;
|
||||
|
||||
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
private ContactResult? GroundIntersection(Vector3 rayStart, Vector3 rayEnd)
|
||||
{
|
||||
double[,] heightfield = World.Heightmap.GetDoubles();
|
||||
|
@ -16024,8 +16109,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
catch (InvalidCastException e)
|
||||
{
|
||||
Error(originFunc,string.Format(
|
||||
" error running rule #{1}: arg #{2} ",
|
||||
rulesParsed, idx - idxStart) + e.Message);
|
||||
" error running rule #{0}: arg #{1} {2}",
|
||||
rulesParsed, idx - idxStart, e.Message));
|
||||
}
|
||||
finally
|
||||
{
|
||||
|
|
|
@ -295,7 +295,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
idx++;
|
||||
try
|
||||
{
|
||||
iQ = rules.GetQuaternionItem(idx);
|
||||
iQ = rules.GetVector4Item(idx);
|
||||
}
|
||||
catch (InvalidCastException)
|
||||
{
|
||||
|
@ -319,7 +319,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
idx++;
|
||||
try
|
||||
{
|
||||
iQ = rules.GetQuaternionItem(idx);
|
||||
iQ = rules.GetVector4Item(idx);
|
||||
}
|
||||
catch (InvalidCastException)
|
||||
{
|
||||
|
@ -342,7 +342,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
idx++;
|
||||
try
|
||||
{
|
||||
iQ = rules.GetQuaternionItem(idx);
|
||||
iQ = rules.GetVector4Item(idx);
|
||||
}
|
||||
catch (InvalidCastException)
|
||||
{
|
||||
|
@ -532,7 +532,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
idx++;
|
||||
try
|
||||
{
|
||||
iQ = rules.GetQuaternionItem(idx);
|
||||
iQ = rules.GetVector4Item(idx);
|
||||
}
|
||||
catch (InvalidCastException)
|
||||
{
|
||||
|
@ -654,7 +654,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
break;
|
||||
case (int)ScriptBaseClass.WL_SUN_MOON_COLOR:
|
||||
idx++;
|
||||
iQ = rules.GetQuaternionItem(idx);
|
||||
iQ = rules.GetVector4Item(idx);
|
||||
try
|
||||
{
|
||||
wl.sunMoonColor = new Vector4((float)iQ.x, (float)iQ.y, (float)iQ.z, (float)iQ.s);
|
||||
|
|
|
@ -924,6 +924,32 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
|
|||
{
|
||||
try
|
||||
{
|
||||
|
||||
if(e.InnerException != null && e.InnerException is ScriptException)
|
||||
{
|
||||
string text = e.InnerException.Message +
|
||||
"(script: " + ScriptName +
|
||||
" event: " + data.EventName +
|
||||
" at " + Part.AbsolutePosition + ")";
|
||||
if (text.Length > 1000)
|
||||
text = text.Substring(0, 1000);
|
||||
Engine.World.SimChat(Utils.StringToBytes(text),
|
||||
ChatTypeEnum.DebugChannel, 2147483647,
|
||||
Part.AbsolutePosition,
|
||||
Part.Name, Part.UUID, false);
|
||||
m_log.Debug(string.Format(
|
||||
"[SCRIPT INSTANCE]: {0} (at event {1}, part {2} {3} at {4} in {5}",
|
||||
e.InnerException.Message,
|
||||
data.EventName,
|
||||
PrimName,
|
||||
Part.UUID,
|
||||
Part.AbsolutePosition,
|
||||
Part.ParentGroup.Scene.Name));
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
// DISPLAY ERROR INWORLD
|
||||
string text = FormatException(e);
|
||||
|
||||
|
@ -945,6 +971,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
|
|||
Part.ParentGroup.Scene.Name),
|
||||
e);
|
||||
}
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
}
|
||||
|
|
|
@ -700,6 +700,31 @@ namespace OpenSim.Region.ScriptEngine.Shared
|
|||
}
|
||||
}
|
||||
|
||||
// use LSL_Types.Quaternion to parse and store a vector4 for lightShare
|
||||
public LSL_Types.Quaternion GetVector4Item(int itemIndex)
|
||||
{
|
||||
if (Data[itemIndex] is LSL_Types.Quaternion)
|
||||
{
|
||||
LSL_Types.Quaternion q = (LSL_Types.Quaternion)Data[itemIndex];
|
||||
return q;
|
||||
}
|
||||
else if(Data[itemIndex] is OpenMetaverse.Quaternion)
|
||||
{
|
||||
LSL_Types.Quaternion q = new LSL_Types.Quaternion(
|
||||
(OpenMetaverse.Quaternion)Data[itemIndex]);
|
||||
q.Normalize();
|
||||
return q;
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new InvalidCastException(string.Format(
|
||||
"{0} expected but {1} given",
|
||||
typeof(LSL_Types.Quaternion).Name,
|
||||
Data[itemIndex] != null ?
|
||||
Data[itemIndex].GetType().Name : "null"));
|
||||
}
|
||||
}
|
||||
|
||||
public LSL_Types.Quaternion GetQuaternionItem(int itemIndex)
|
||||
{
|
||||
if (Data[itemIndex] is LSL_Types.Quaternion)
|
||||
|
|
|
@ -1854,17 +1854,25 @@ namespace OpenSim.Region.ScriptEngine.XEngine
|
|||
return instance;
|
||||
}
|
||||
|
||||
public void SetScriptState(UUID itemID, bool running)
|
||||
public void SetScriptState(UUID itemID, bool running, bool self)
|
||||
{
|
||||
IScriptInstance instance = GetInstance(itemID);
|
||||
if (instance != null)
|
||||
{
|
||||
if (running)
|
||||
instance.Start();
|
||||
else
|
||||
{
|
||||
if(self)
|
||||
{
|
||||
instance.Running = false;
|
||||
throw new EventAbortException();
|
||||
}
|
||||
else
|
||||
instance.Stop(100);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public bool GetScriptState(UUID itemID)
|
||||
{
|
||||
|
|
|
@ -72,11 +72,8 @@ namespace OpenSim.Services.AuthenticationService
|
|||
{
|
||||
realID = UUID.Zero;
|
||||
|
||||
m_log.DebugFormat("[AUTH SERVICE]: Authenticating for {0}, user account service present: {1}", principalID, m_UserAccountService != null);
|
||||
m_log.DebugFormat("[AUTH SERVICE]: Authenticating for {0}", principalID);
|
||||
AuthenticationData data = m_Database.Get(principalID);
|
||||
UserAccount user = null;
|
||||
if (m_UserAccountService != null)
|
||||
user = m_UserAccountService.GetUserAccount(UUID.Zero, principalID);
|
||||
|
||||
if (data == null || data.Data == null)
|
||||
{
|
||||
|
@ -100,53 +97,7 @@ namespace OpenSim.Services.AuthenticationService
|
|||
return GetToken(principalID, lifetime);
|
||||
}
|
||||
|
||||
if (user == null)
|
||||
{
|
||||
m_log.DebugFormat("[PASS AUTH]: No user record for {0}", principalID);
|
||||
return String.Empty;
|
||||
}
|
||||
|
||||
int impersonateFlag = 1 << 6;
|
||||
|
||||
if ((user.UserFlags & impersonateFlag) == 0)
|
||||
return String.Empty;
|
||||
|
||||
m_log.DebugFormat("[PASS AUTH]: Attempting impersonation");
|
||||
|
||||
List<UserAccount> accounts = m_UserAccountService.GetUserAccountsWhere(UUID.Zero, "UserLevel >= 200");
|
||||
if (accounts == null || accounts.Count == 0)
|
||||
return String.Empty;
|
||||
|
||||
foreach (UserAccount a in accounts)
|
||||
{
|
||||
data = m_Database.Get(a.PrincipalID);
|
||||
if (data == null || data.Data == null ||
|
||||
!data.Data.ContainsKey("passwordHash") ||
|
||||
!data.Data.ContainsKey("passwordSalt"))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
// m_log.DebugFormat("[PASS AUTH]: Trying {0}", data.PrincipalID);
|
||||
|
||||
hashed = Util.Md5Hash(password + ":" +
|
||||
data.Data["passwordSalt"].ToString());
|
||||
|
||||
if (data.Data["passwordHash"].ToString() == hashed)
|
||||
{
|
||||
m_log.DebugFormat("[PASS AUTH]: {0} {1} impersonating {2}, proceeding with login", a.FirstName, a.LastName, principalID);
|
||||
realID = a.PrincipalID;
|
||||
return GetToken(principalID, lifetime);
|
||||
}
|
||||
// else
|
||||
// {
|
||||
// m_log.DebugFormat(
|
||||
// "[AUTH SERVICE]: Salted hash {0} of given password did not match salted hash of {1} for PrincipalID {2}. Authentication failure.",
|
||||
// hashed, data.Data["passwordHash"], data.PrincipalID);
|
||||
// }
|
||||
}
|
||||
|
||||
m_log.DebugFormat("[PASS AUTH]: Impersonation of {0} failed", principalID);
|
||||
m_log.DebugFormat("[AUTH SERVICE]: Authenticating FAIL for {0} ", principalID);
|
||||
return String.Empty;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -323,7 +323,7 @@ namespace OpenSim.Services.Connectors
|
|||
}
|
||||
else
|
||||
m_log.Error(string.Format(
|
||||
"[ESTATE CONNECTOR]: WebException for {0} {1} {2} ",
|
||||
"[ESTATE CONNECTOR]: WebException for {0} {1} {2} {3}",
|
||||
verb, uri, formdata, e));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -221,7 +221,7 @@ namespace OpenSim.Tests.Common
|
|||
throw new System.NotImplementedException ();
|
||||
}
|
||||
|
||||
public void SetScriptState(UUID itemID, bool state)
|
||||
public void SetScriptState(UUID itemID, bool state, bool self)
|
||||
{
|
||||
throw new System.NotImplementedException ();
|
||||
}
|
||||
|
|
|
@ -729,12 +729,6 @@
|
|||
;; then you might want to try setting this to false.
|
||||
; mesh_sculpted_prim = true
|
||||
|
||||
;# {use_NINJA_physics_joints} {[Startup]physics:OpenDynamicsEngine} {Use jointed (NINJA) physics?} {true false} false
|
||||
;; If you would like physics joints to be enabled through a special naming
|
||||
;; convention in the client, set this to true.
|
||||
;; (see NINJA Physics, http://opensimulator.org/wiki/NINJA_Physics)
|
||||
; use_NINJA_physics_joints = false
|
||||
|
||||
[RemoteAdmin]
|
||||
;; This is the remote admin module, which uses XMLRPC requests to
|
||||
;; manage regions from a web interface.
|
||||
|
@ -1171,17 +1165,21 @@
|
|||
|
||||
;; several options to control NPCs creation
|
||||
|
||||
;# {AllowNotOwned} {} {allow NPCs to be created not Owned} {true false} true
|
||||
;; allow NPCs to be created not Owned {true false} default: true
|
||||
; AllowNotOwned = false
|
||||
; AllowNotOwned = true
|
||||
|
||||
;# {AllowSenseAsAvatar} {} {allow NPCs to set to be sensed as Avatars} {true false} true
|
||||
;; allow NPCs to set to be sensed as Avatars {true false} default: true
|
||||
; AllowSenseAsAvatar = false
|
||||
; AllowSenseAsAvatar = true
|
||||
|
||||
;# {AllowCloneOtherAvatars} {} {allow NPCs to created cloning any avatar in region} {true false} true
|
||||
;; allow NPCs to created cloning any avatar in region {true false} default: true
|
||||
; AllowCloneOtherAvatars = false
|
||||
; AllowCloneOtherAvatars = true
|
||||
|
||||
;# {NoNPCGroup} {} {if true NPCs will have no group title, if false display "- NPC -"} {true false} true
|
||||
;; if true NPCs will have no group title, if false display "- NPC -" for easy identification {true false} default: true
|
||||
; NoNPCGroup = false
|
||||
; NoNPCGroup = true
|
||||
|
||||
|
||||
[Terrain]
|
||||
|
|
|
@ -128,9 +128,16 @@
|
|||
; Increasing this number will increase memory usage.
|
||||
MaxPrimUndos = 20
|
||||
|
||||
; Minimum size for non-physical prims.This can be overridden in the region config file (as
|
||||
; NonPhysicalPrimMin!).
|
||||
; NonPhysicalPrimMin = 0.001
|
||||
|
||||
; Maximum size of non physical prims. Affects resizing of existing prims. This can be overridden in the region config file (as NonPhysicalPrimMax!).
|
||||
NonPhysicalPrimMax = 256
|
||||
|
||||
; Minimum size where a prim can be physical. This can be overridden in the region config file.
|
||||
; PhysicalPrimMin = 0.01
|
||||
|
||||
; Maximum size of physical prims. Affects resizing of existing prims. This can be overridden in the region config file.
|
||||
PhysicalPrimMax = 64
|
||||
|
||||
|
@ -304,12 +311,25 @@
|
|||
; ## SCRIPT ENGINE
|
||||
; ##
|
||||
|
||||
;; Default script engine to use. Currently, we only have XEngine
|
||||
DefaultScriptEngine = "XEngine"
|
||||
|
||||
; Http proxy setting for llHTTPRequest and dynamic texture loading, if
|
||||
; required
|
||||
; HttpProxy = "http://proxy.com:8080"
|
||||
|
||||
; If you're using HttpProxy, then you can set HttpProxyExceptions to a
|
||||
; list of regular expressions for URLs that you don't want to go through
|
||||
; the proxy.
|
||||
; For example, servers inside your firewall.
|
||||
; Separate patterns with a ';'
|
||||
; HttpProxyExceptions = ".mydomain.com;localhost"
|
||||
|
||||
; ##
|
||||
; ## EMAIL MODULE
|
||||
; ##
|
||||
|
||||
;; The email module requires some configuration. It needs an SMTP
|
||||
;; server to send mail through.
|
||||
;emailmodule = DefaultEmailModule
|
||||
|
||||
; ##
|
||||
|
@ -324,6 +344,10 @@
|
|||
; won't look right until the physics engine supports it
|
||||
; (i.e delays takeoff for a moment)
|
||||
|
||||
; #
|
||||
; # statistics
|
||||
; #
|
||||
|
||||
; Simulator statistics are output to the console periodically at debug level INFO.
|
||||
; Setting this to zero disables this output.
|
||||
; LogShowStatsSeconds = 3600
|
||||
|
@ -362,16 +386,41 @@
|
|||
; system with reduced logging
|
||||
LogOverloads = True
|
||||
|
||||
; #
|
||||
; # Telehubs
|
||||
; #
|
||||
|
||||
; SpawnPointRouting adjusts the landing for incoming avatars.
|
||||
; "closest" will place the avatar at the SpawnPoint located in the closest
|
||||
; available spot to the destination (typically map click/landmark).
|
||||
; "random" will place the avatar on a randomly selected spawnpoint;
|
||||
; "sequence" will place the avatar on the next sequential SpawnPoint
|
||||
; SpawnPointRouting = closest
|
||||
|
||||
; TelehubAllowLandmark allows users with landmarks to override telehub
|
||||
; routing and land at the landmark coordinates when set to true
|
||||
; default is false
|
||||
; TelehubAllowLandmark = false
|
||||
|
||||
|
||||
[Map]
|
||||
; Map tile options.
|
||||
; If true, then maptiles are generated using the MapImageModule below.
|
||||
; If false then the texture referenced by MaptileStaticUUID is used instead, which can also be overridden
|
||||
; in individual region config file(s). If you do not want to upload map tiles at all, then you will need
|
||||
; both to set this to false and comment out the [Modules] MapImageServiceModule setting in config-include/
|
||||
;GenerateMaptiles = true
|
||||
|
||||
;WorldMapModule = "WorldMap"
|
||||
|
||||
; The module to use in order to generate map images.
|
||||
; MapImageModule is the default. Warp3DImageModule is an alternative experimental module that can
|
||||
; generate better images.
|
||||
;MapImageModule = "MapImageModule"
|
||||
|
||||
; World map blacklist timeout in seconds
|
||||
;BlacklistTimeout = 600
|
||||
|
||||
; Set to false to not generate any maptiles
|
||||
;GenerateMaptiles = true
|
||||
|
||||
; Refresh (in seconds) the map tile periodically
|
||||
;MaptileRefresh = 0
|
||||
|
||||
|
@ -399,6 +448,8 @@
|
|||
; ## PERMISSIONS
|
||||
; ##
|
||||
|
||||
; Permission modules to use, separated by comma.
|
||||
; Possible modules are DefaultPermissionsModule, PrimLimitsModule
|
||||
;permissionmodules = "DefaultPermissionsModule"
|
||||
|
||||
; If set to false, then, in theory, the server never carries out permission checks (allowing anybody to copy
|
||||
|
@ -407,12 +458,22 @@
|
|||
; Default is true
|
||||
serverside_object_permissions = true
|
||||
|
||||
|
||||
; This allows some control over permissions
|
||||
; please note that this still doesn't duplicate SL, and is not intended to
|
||||
|
||||
; This allows grid users with a UserLevel of 200 or more to assume god
|
||||
; powers in the regions in this simulator.
|
||||
allow_grid_gods = false
|
||||
|
||||
; This allows somne control over permissions
|
||||
; please note that this still doesn't duplicate SL, and is not intended to
|
||||
; Allow region owners to assume god powers in their regions
|
||||
;region_owner_is_god = true
|
||||
|
||||
; Allow region managers to assume god powers in regions they manage
|
||||
;region_manager_is_god = false
|
||||
|
||||
; Allow parcel owners to assume god powers in their parcels
|
||||
; you really may not want this...
|
||||
;parcel_owner_is_god = false
|
||||
|
||||
; Control user types that are allowed to create new scripts
|
||||
|
@ -1078,16 +1139,6 @@
|
|||
; number^2 physical level of detail of the sculpt texture. 16x16 - 256 verticies
|
||||
mesh_physical_lod = 16
|
||||
|
||||
; ##
|
||||
; ## Joint support
|
||||
; ##
|
||||
|
||||
; If you would like physics joints to be enabled through a special naming
|
||||
; convention in the client, set this to true.
|
||||
; (See NINJA Physics documentation, http://opensimulator.org/wiki/NINJA_Physics)
|
||||
; Default is false
|
||||
;use_NINJA_physics_joints = true
|
||||
|
||||
; ##
|
||||
; ## additional meshing options
|
||||
; ##
|
||||
|
@ -1097,7 +1148,7 @@
|
|||
; If you would rather have mesh proxies for simple prims, you can set this to
|
||||
; true. Note that this will increase memory usage and region startup time.
|
||||
; Default is false.
|
||||
;force_simple_prim_meshing = true
|
||||
;force_simple_prim_meshing = false
|
||||
|
||||
|
||||
[BulletSim]
|
||||
|
@ -2075,7 +2126,19 @@
|
|||
[NPC]
|
||||
;; Enable Non Player Character (NPC) facilities
|
||||
Enabled = false
|
||||
;; several options to control NPCs creation
|
||||
|
||||
;; allow NPCs to be created not Owned {true false} default: true
|
||||
; AllowNotOwned = true
|
||||
|
||||
;; allow NPCs to set to be sensed as Avatars {true false} default: true
|
||||
; AllowSenseAsAvatar = true
|
||||
|
||||
;; allow NPCs to created cloning any avatar in region {true false} default: true
|
||||
; AllowCloneOtherAvatars = true
|
||||
|
||||
;; if true NPCs will have no group title, if false display "- NPC -" for easy identification {true false} default: true
|
||||
; NoNPCGroup = true
|
||||
|
||||
[Terrain]
|
||||
; Values can be "pinhead-island" or "flat"
|
||||
|
|
Loading…
Reference in New Issue