Merge branch 'master' into careminster-presence-refactor
commit
e2762a68b3
|
@ -669,10 +669,6 @@ namespace OpenSim.Data.SQLite
|
|||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="globalID"></param>
|
||||
public void RemoveLandObject(UUID globalID)
|
||||
{
|
||||
lock (ds)
|
||||
|
@ -698,7 +694,6 @@ namespace OpenSim.Data.SQLite
|
|||
if (landRow != null)
|
||||
{
|
||||
landRow.Delete();
|
||||
land.Rows.Remove(landRow);
|
||||
}
|
||||
List<DataRow> rowsToDelete = new List<DataRow>();
|
||||
foreach (DataRow rowToCheck in landaccesslist.Rows)
|
||||
|
@ -709,7 +704,6 @@ namespace OpenSim.Data.SQLite
|
|||
for (int iter = 0; iter < rowsToDelete.Count; iter++)
|
||||
{
|
||||
rowsToDelete[iter].Delete();
|
||||
landaccesslist.Rows.Remove(rowsToDelete[iter]);
|
||||
}
|
||||
}
|
||||
Commit();
|
||||
|
|
|
@ -1030,11 +1030,12 @@ namespace OpenSim
|
|||
delegate(Scene scene)
|
||||
{
|
||||
MainConsole.Instance.Output(String.Format(
|
||||
"Region Name: {0}, Region XLoc: {1}, Region YLoc: {2}, Region Port: {3}",
|
||||
"Region Name: {0}, Region XLoc: {1}, Region YLoc: {2}, Region Port: {3}, Estate Name: {4}",
|
||||
scene.RegionInfo.RegionName,
|
||||
scene.RegionInfo.RegionLocX,
|
||||
scene.RegionInfo.RegionLocY,
|
||||
scene.RegionInfo.InternalEndPoint.Port));
|
||||
scene.RegionInfo.InternalEndPoint.Port,
|
||||
scene.RegionInfo.EstateSettings.EstateName));
|
||||
});
|
||||
break;
|
||||
|
||||
|
|
|
@ -27,6 +27,7 @@
|
|||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Net;
|
||||
using System.Net.Sockets;
|
||||
|
@ -639,10 +640,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
|||
{
|
||||
object[] array = new object[] { buffer, packet };
|
||||
|
||||
if (m_asyncPacketHandling)
|
||||
Util.FireAndForget(HandleUseCircuitCode, array);
|
||||
else
|
||||
HandleUseCircuitCode(array);
|
||||
|
||||
return;
|
||||
}
|
||||
|
@ -859,7 +857,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
|||
// Begin the process of adding the client to the simulator
|
||||
AddNewClient((UseCircuitCodePacket)packet, remoteEndPoint);
|
||||
|
||||
// Acknowledge the UseCircuitCode packet
|
||||
// Send ack
|
||||
SendAckImmediate(remoteEndPoint, packet.Header.Sequence);
|
||||
|
||||
// m_log.DebugFormat(
|
||||
|
@ -926,12 +924,17 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
|||
|
||||
protected virtual void AddClient(uint circuitCode, UUID agentID, UUID sessionID, IPEndPoint remoteEndPoint, AuthenticateResponse sessionInfo)
|
||||
{
|
||||
// Create the LLUDPClient
|
||||
LLUDPClient udpClient = new LLUDPClient(this, ThrottleRates, m_throttle, circuitCode, agentID, remoteEndPoint, m_defaultRTO, m_maxRTO);
|
||||
// In priciple there shouldn't be more than one thread here, ever.
|
||||
// But in case that happens, we need to synchronize this piece of code
|
||||
// because it's too important
|
||||
lock (this)
|
||||
{
|
||||
IClientAPI existingClient;
|
||||
|
||||
if (!m_scene.TryGetClient(agentID, out existingClient))
|
||||
{
|
||||
// Create the LLUDPClient
|
||||
LLUDPClient udpClient = new LLUDPClient(this, ThrottleRates, m_throttle, circuitCode, agentID, remoteEndPoint, m_defaultRTO, m_maxRTO);
|
||||
// Create the LLClientView
|
||||
LLClientView client = new LLClientView(remoteEndPoint, m_scene, this, udpClient, sessionInfo, agentID, sessionID, circuitCode);
|
||||
client.OnLogout += LogoutHandler;
|
||||
|
@ -940,11 +943,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
|||
|
||||
// Start the IClientAPI
|
||||
client.Start();
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
m_log.WarnFormat("[LLUDPSERVER]: Ignoring a repeated UseCircuitCode from {0} at {1} for circuit {2}",
|
||||
udpClient.AgentID, remoteEndPoint, circuitCode);
|
||||
existingClient.AgentId, remoteEndPoint, circuitCode);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1055,6 +1060,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
|||
|
||||
#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
|
||||
m_scene.ForEachClient(clientPacketHandler);
|
||||
|
@ -1070,6 +1081,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
|||
{
|
||||
m_log.Error("[LLUDPSERVER]: OutgoingPacketHandler loop threw an exception: " + ex.Message, ex);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Watchdog.RemoveThread();
|
||||
|
@ -1107,6 +1119,112 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
|||
}
|
||||
}
|
||||
|
||||
#region Emergency Monitoring
|
||||
// Alternative packet handler fuull of instrumentation
|
||||
// Handy for hunting bugs
|
||||
private Stopwatch watch1 = new Stopwatch();
|
||||
private Stopwatch watch2 = new Stopwatch();
|
||||
|
||||
private float avgProcessingTicks = 0;
|
||||
private float avgResendUnackedTicks = 0;
|
||||
private float avgSendAcksTicks = 0;
|
||||
private float avgSendPingTicks = 0;
|
||||
private float avgDequeueTicks = 0;
|
||||
private long nticks = 0;
|
||||
private long nticksUnack = 0;
|
||||
private long nticksAck = 0;
|
||||
private long nticksPing = 0;
|
||||
private int npacksSent = 0;
|
||||
private int npackNotSent = 0;
|
||||
|
||||
private void MonitoredClientOutgoingPacketHandler(IClientAPI client)
|
||||
{
|
||||
nticks++;
|
||||
watch1.Start();
|
||||
try
|
||||
{
|
||||
if (client is LLClientView)
|
||||
{
|
||||
LLUDPClient udpClient = ((LLClientView)client).UDPClient;
|
||||
|
||||
if (udpClient.IsConnected)
|
||||
{
|
||||
if (m_resendUnacked)
|
||||
{
|
||||
nticksUnack++;
|
||||
watch2.Start();
|
||||
|
||||
ResendUnacked(udpClient);
|
||||
|
||||
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 (m_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
|
||||
|
||||
private void ProcessInPacket(object state)
|
||||
{
|
||||
IncomingPacket incomingPacket = (IncomingPacket)state;
|
||||
|
|
|
@ -141,29 +141,19 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
|||
private void ProcessQueues()
|
||||
{
|
||||
// Process all the pending adds
|
||||
|
||||
OutgoingPacket pendingAdd;
|
||||
if (m_pendingAdds != null)
|
||||
{
|
||||
while (m_pendingAdds.TryDequeue(out pendingAdd))
|
||||
{
|
||||
if (pendingAdd != null && m_packets != null)
|
||||
{
|
||||
if (pendingAdd != null)
|
||||
m_packets[pendingAdd.SequenceNumber] = pendingAdd;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Process all the pending removes, including updating statistics and round-trip times
|
||||
PendingAck pendingRemove;
|
||||
OutgoingPacket ackedPacket;
|
||||
if (m_pendingRemoves != null)
|
||||
{
|
||||
while (m_pendingRemoves.TryDequeue(out pendingRemove))
|
||||
{
|
||||
if (m_pendingRemoves != null && m_packets != null)
|
||||
{
|
||||
if (m_packets.TryGetValue(pendingRemove.SequenceNumber, out ackedPacket))
|
||||
{
|
||||
if (ackedPacket != null)
|
||||
{
|
||||
m_packets.Remove(pendingRemove.SequenceNumber);
|
||||
|
||||
|
@ -183,4 +173,3 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -139,7 +139,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Authorization
|
|||
|
||||
if (scene != null)
|
||||
{
|
||||
UserAccount account = scene.UserAccountService.GetUserAccount(UUID.Zero, userID);
|
||||
UserAccount account = scene.UserAccountService.GetUserAccount(UUID.Zero, new UUID(userID));
|
||||
isAuthorized = IsAuthorizedForRegion(userID, account.FirstName, account.LastName,
|
||||
account.Email, scene.RegionInfo.RegionName, regionID, out message);
|
||||
}
|
||||
|
|
|
@ -0,0 +1,156 @@
|
|||
/*
|
||||
* Copyright (c) Contributors, http://opensimulator.org/
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the OpenSimulator Project nor the
|
||||
* names of its contributors may be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Reflection;
|
||||
using System.Security;
|
||||
using log4net;
|
||||
using Nini.Config;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Region.Framework.Interfaces;
|
||||
using OpenSim.Region.Framework.Scenes;
|
||||
|
||||
namespace OpenSim.Region.CoreModules.World.Estate
|
||||
{
|
||||
public class EstateManagementCommands
|
||||
{
|
||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
protected EstateManagementModule m_module;
|
||||
|
||||
public EstateManagementCommands(EstateManagementModule module)
|
||||
{
|
||||
m_module = module;
|
||||
}
|
||||
|
||||
public void Initialise()
|
||||
{
|
||||
m_module.Scene.AddCommand(this, "set terrain texture",
|
||||
"set terrain texture <number> <uuid> [<x>] [<y>]",
|
||||
"Sets the terrain <number> to <uuid>, if <x> or <y> are specified, it will only " +
|
||||
"set it on regions with a matching coordinate. Specify -1 in <x> or <y> to wildcard" +
|
||||
" that coordinate.",
|
||||
consoleSetTerrainTexture);
|
||||
|
||||
m_module.Scene.AddCommand(this, "set terrain heights",
|
||||
"set terrain heights <corner> <min> <max> [<x>] [<y>]",
|
||||
"Sets the terrain texture heights on corner #<corner> to <min>/<max>, if <x> or <y> are specified, it will only " +
|
||||
"set it on regions with a matching coordinate. Specify -1 in <x> or <y> to wildcard" +
|
||||
" that coordinate. Corner # SW = 0, NW = 1, SE = 2, NE = 3.",
|
||||
consoleSetTerrainHeights);
|
||||
}
|
||||
|
||||
protected void consoleSetTerrainTexture(string module, string[] args)
|
||||
{
|
||||
string num = args[3];
|
||||
string uuid = args[4];
|
||||
int x = (args.Length > 5 ? int.Parse(args[5]) : -1);
|
||||
int y = (args.Length > 6 ? int.Parse(args[6]) : -1);
|
||||
|
||||
if (x == -1 || m_module.Scene.RegionInfo.RegionLocX == x)
|
||||
{
|
||||
if (y == -1 || m_module.Scene.RegionInfo.RegionLocY == y)
|
||||
{
|
||||
int corner = int.Parse(num);
|
||||
UUID texture = UUID.Parse(uuid);
|
||||
|
||||
m_log.Debug("[ESTATEMODULE]: Setting terrain textures for " + m_module.Scene.RegionInfo.RegionName +
|
||||
string.Format(" (C#{0} = {1})", corner, texture));
|
||||
|
||||
switch (corner)
|
||||
{
|
||||
case 0:
|
||||
m_module.Scene.RegionInfo.RegionSettings.TerrainTexture1 = texture;
|
||||
break;
|
||||
case 1:
|
||||
m_module.Scene.RegionInfo.RegionSettings.TerrainTexture2 = texture;
|
||||
break;
|
||||
case 2:
|
||||
m_module.Scene.RegionInfo.RegionSettings.TerrainTexture3 = texture;
|
||||
break;
|
||||
case 3:
|
||||
m_module.Scene.RegionInfo.RegionSettings.TerrainTexture4 = texture;
|
||||
break;
|
||||
}
|
||||
|
||||
m_module.Scene.RegionInfo.RegionSettings.Save();
|
||||
m_module.TriggerRegionInfoChange();
|
||||
m_module.sendRegionInfoPacketToAll();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected void consoleSetTerrainHeights(string module, string[] args)
|
||||
{
|
||||
string num = args[3];
|
||||
string min = args[4];
|
||||
string max = args[5];
|
||||
int x = (args.Length > 6 ? int.Parse(args[6]) : -1);
|
||||
int y = (args.Length > 7 ? int.Parse(args[7]) : -1);
|
||||
|
||||
if (x == -1 || m_module.Scene.RegionInfo.RegionLocX == x)
|
||||
{
|
||||
if (y == -1 || m_module.Scene.RegionInfo.RegionLocY == y)
|
||||
{
|
||||
int corner = int.Parse(num);
|
||||
float lowValue = float.Parse(min, Culture.NumberFormatInfo);
|
||||
float highValue = float.Parse(max, Culture.NumberFormatInfo);
|
||||
|
||||
m_log.Debug("[ESTATEMODULE]: Setting terrain heights " + m_module.Scene.RegionInfo.RegionName +
|
||||
string.Format(" (C{0}, {1}-{2}", corner, lowValue, highValue));
|
||||
|
||||
switch (corner)
|
||||
{
|
||||
case 0:
|
||||
m_module.Scene.RegionInfo.RegionSettings.Elevation1SW = lowValue;
|
||||
m_module.Scene.RegionInfo.RegionSettings.Elevation2SW = highValue;
|
||||
break;
|
||||
case 1:
|
||||
m_module.Scene.RegionInfo.RegionSettings.Elevation1NW = lowValue;
|
||||
m_module.Scene.RegionInfo.RegionSettings.Elevation2NW = highValue;
|
||||
break;
|
||||
case 2:
|
||||
m_module.Scene.RegionInfo.RegionSettings.Elevation1SE = lowValue;
|
||||
m_module.Scene.RegionInfo.RegionSettings.Elevation2SE = highValue;
|
||||
break;
|
||||
case 3:
|
||||
m_module.Scene.RegionInfo.RegionSettings.Elevation1NE = lowValue;
|
||||
m_module.Scene.RegionInfo.RegionSettings.Elevation2NE = highValue;
|
||||
break;
|
||||
}
|
||||
|
||||
m_module.Scene.RegionInfo.RegionSettings.Save();
|
||||
m_module.TriggerRegionInfoChange();
|
||||
m_module.sendRegionHandshakeToAll();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
File diff suppressed because it is too large
Load Diff
|
@ -763,10 +763,11 @@ namespace OpenSim.Region.CoreModules.World.WorldMap
|
|||
}
|
||||
|
||||
if (!responseMap.ContainsKey(itemtype.ToString())) // remote sim doesnt have the stated region handle
|
||||
{
|
||||
if (!m_blacklistedregions.ContainsKey(regionhandle))
|
||||
{
|
||||
m_log.DebugFormat("[WORLD MAP]: Remote sim does not have the stated region. Blacklisting.");
|
||||
lock (m_blacklistedregions)
|
||||
{
|
||||
if (!m_blacklistedregions.ContainsKey(regionhandle))
|
||||
m_blacklistedregions.Add(regionhandle, Environment.TickCount);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -64,6 +64,8 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
|
||||
#region Fields
|
||||
|
||||
public bool EmergencyMonitoring = false;
|
||||
|
||||
public SynchronizeSceneHandler SynchronizeScene;
|
||||
public SimStatsReporter StatsReporter;
|
||||
public List<Border> NorthBorders = new List<Border>();
|
||||
|
|
|
@ -96,6 +96,14 @@ namespace OpenSim.Region.CoreModules.UDP.Linden
|
|||
"Without the 'full' option, only root agents are shown."
|
||||
+ " With the 'full' option child agents are also shown.",
|
||||
ShowThrottlesReport);
|
||||
|
||||
scene.AddCommand(
|
||||
this, "emergency-monitoring",
|
||||
"Go on/off emergency monitoring mode",
|
||||
"Go on/off emergency monitoring mode",
|
||||
"Go on/off emergency monitoring mode",
|
||||
EmergencyMonitoring);
|
||||
|
||||
}
|
||||
|
||||
public void RemoveRegion(Scene scene)
|
||||
|
@ -121,6 +129,24 @@ namespace OpenSim.Region.CoreModules.UDP.Linden
|
|||
MainConsole.Instance.Output(GetThrottlesReport(cmd));
|
||||
}
|
||||
|
||||
protected void EmergencyMonitoring(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(
|
||||
|
@ -335,7 +361,7 @@ namespace OpenSim.Region.CoreModules.UDP.Linden
|
|||
ThrottleRates throttleRates = udpServer.ThrottleRates;
|
||||
report.AppendFormat(
|
||||
"{0,7} {1,8} {2,7} {3,7} {4,7} {5,7} {6,9} {7,7}",
|
||||
"n/a",
|
||||
(throttleRates.Total * 8) / 1000,
|
||||
(throttleRates.ResendLimit * 8) / 1000,
|
||||
(throttleRates.LandLimit * 8) / 1000,
|
||||
(throttleRates.WindLimit * 8) / 1000,
|
||||
|
|
|
@ -205,6 +205,11 @@ namespace OpenSim.Server.Handlers.Simulation
|
|||
|
||||
// We're behind a proxy
|
||||
Hashtable headers = (Hashtable)request["headers"];
|
||||
|
||||
//// DEBUG
|
||||
//foreach (object o in headers.Keys)
|
||||
// m_log.DebugFormat("XXX {0} = {1}", o.ToString(), (headers[o] == null? "null" : headers[o].ToString()));
|
||||
|
||||
string xff = "X-Forwarded-For";
|
||||
if (headers.ContainsKey(xff.ToLower()))
|
||||
xff = xff.ToLower();
|
||||
|
|
|
@ -306,6 +306,9 @@
|
|||
[ODEPhysicsSettings]
|
||||
;# {mesh_sculpted_prim} {[Startup]physics:OpenDynamicsEngine} {Mesh sculpties so they collide as they look?} {true false} true
|
||||
;; Do we want to mesh sculpted prim to collide like they look?
|
||||
;; If you are seeing sculpt texture decode problems
|
||||
;; (messages such as "Decoded image with unhandled number of components: 0 shortly followed by a physcs exception")
|
||||
;; 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
|
||||
|
|
BIN
bin/sqlite3.dll
BIN
bin/sqlite3.dll
Binary file not shown.
Loading…
Reference in New Issue