Merge branch 'master' into httptests

httptests
UbitUmarov 2016-11-27 15:14:34 +00:00
commit 877d3092b4
47 changed files with 645 additions and 318 deletions

View File

@ -390,3 +390,66 @@ CREATE TABLE IF NOT EXISTS `bakedterrain` (
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
COMMIT;
:VERSION 55 #----- Increase float precision for windlight needed by scripts
BEGIN;
ALTER TABLE `regionwindlight`
MODIFY `water_fog_density_exponent` float(9,7) unsigned NOT NULL DEFAULT '4.0',
MODIFY `underwater_fog_modifier` float(9,8) unsigned NOT NULL DEFAULT '0.25',
MODIFY `reflection_wavelet_scale_1` float(9,7) unsigned NOT NULL DEFAULT '2.0',
MODIFY `reflection_wavelet_scale_2` float(9,7) unsigned NOT NULL DEFAULT '2.0',
MODIFY `reflection_wavelet_scale_3` float(9,7) unsigned NOT NULL DEFAULT '2.0',
MODIFY `fresnel_scale` float(9,8) unsigned NOT NULL DEFAULT '0.40',
MODIFY `fresnel_offset` float(9,8) unsigned NOT NULL DEFAULT '0.50',
MODIFY `refract_scale_above` float(9,8) unsigned NOT NULL DEFAULT '0.03',
MODIFY `refract_scale_below` float(9,8) unsigned NOT NULL DEFAULT '0.20',
MODIFY `blur_multiplier` float(9,8) unsigned NOT NULL DEFAULT '0.040',
MODIFY `big_wave_direction_x` float(9,8) NOT NULL DEFAULT '1.05',
MODIFY `big_wave_direction_y` float(9,8) NOT NULL DEFAULT '-0.42',
MODIFY `little_wave_direction_x` float(9,8) NOT NULL DEFAULT '1.11',
MODIFY `little_wave_direction_y` float(9,8) NOT NULL DEFAULT '-1.16',
MODIFY `horizon_r` float(9,8) unsigned NOT NULL DEFAULT '0.25',
MODIFY `horizon_g` float(9,8) unsigned NOT NULL DEFAULT '0.25',
MODIFY `horizon_b` float(9,8) unsigned NOT NULL DEFAULT '0.32',
MODIFY `horizon_i` float(9,8) unsigned NOT NULL DEFAULT '0.32',
MODIFY `haze_horizon` float(9,8) unsigned NOT NULL DEFAULT '0.19',
MODIFY `blue_density_r` float(9,8) unsigned NOT NULL DEFAULT '0.12',
MODIFY `blue_density_g` float(9,8) unsigned NOT NULL DEFAULT '0.22',
MODIFY `blue_density_b` float(9,8) unsigned NOT NULL DEFAULT '0.38',
MODIFY `blue_density_i` float(9,8) unsigned NOT NULL DEFAULT '0.38',
MODIFY `haze_density` float(9,8) unsigned NOT NULL DEFAULT '0.70',
MODIFY `density_multiplier` float(9,8) unsigned NOT NULL DEFAULT '0.18',
MODIFY `distance_multiplier` float(9,6) unsigned NOT NULL DEFAULT '0.8',
MODIFY `sun_moon_color_r` float(9,8) unsigned NOT NULL DEFAULT '0.24',
MODIFY `sun_moon_color_g` float(9,8) unsigned NOT NULL DEFAULT '0.26',
MODIFY `sun_moon_color_b` float(9,8) unsigned NOT NULL DEFAULT '0.30',
MODIFY `sun_moon_color_i` float(9,8) unsigned NOT NULL DEFAULT '0.30',
MODIFY `sun_moon_position` float(9,8) unsigned NOT NULL DEFAULT '0.317',
MODIFY `ambient_r` float(9,8) unsigned NOT NULL DEFAULT '0.35',
MODIFY `ambient_g` float(9,8) unsigned NOT NULL DEFAULT '0.35',
MODIFY `ambient_b` float(9,8) unsigned NOT NULL DEFAULT '0.35',
MODIFY `ambient_i` float(9,8) unsigned NOT NULL DEFAULT '0.35',
MODIFY `east_angle` float(9,8) unsigned NOT NULL DEFAULT '0.00',
MODIFY `sun_glow_focus` float(9,8) unsigned NOT NULL DEFAULT '0.10',
MODIFY `sun_glow_size` float(9,8) unsigned NOT NULL DEFAULT '1.75',
MODIFY `scene_gamma` float(9,7) unsigned NOT NULL DEFAULT '1.00',
MODIFY `star_brightness` float(9,8) unsigned NOT NULL DEFAULT '0.00',
MODIFY `cloud_color_r` float(9,8) unsigned NOT NULL DEFAULT '0.41',
MODIFY `cloud_color_g` float(9,8) unsigned NOT NULL DEFAULT '0.41',
MODIFY `cloud_color_b` float(9,8) unsigned NOT NULL DEFAULT '0.41',
MODIFY `cloud_color_i` float(9,8) unsigned NOT NULL DEFAULT '0.41',
MODIFY `cloud_x` float(9,8) unsigned NOT NULL DEFAULT '1.00',
MODIFY `cloud_y` float(9,8) unsigned NOT NULL DEFAULT '0.53',
MODIFY `cloud_density` float(9,8) unsigned NOT NULL DEFAULT '1.00',
MODIFY `cloud_coverage` float(9,8) unsigned NOT NULL DEFAULT '0.27',
MODIFY `cloud_scale` float(9,8) unsigned NOT NULL DEFAULT '0.42',
MODIFY `cloud_detail_x` float(9,8) unsigned NOT NULL DEFAULT '1.00',
MODIFY `cloud_detail_y` float(9,8) unsigned NOT NULL DEFAULT '0.53',
MODIFY `cloud_detail_density` float(9,8) unsigned NOT NULL DEFAULT '0.12',
MODIFY `cloud_scroll_x` float(9,7) NOT NULL DEFAULT '0.20',
MODIFY `cloud_scroll_y` float(9,7) NOT NULL DEFAULT '0.01';
COMMIT;

View File

@ -155,7 +155,7 @@ namespace OpenSim.Framework
}
}
public virtual byte[] Data
public byte[] Data
{
get { return m_data; }
set { m_data = value; }

View File

@ -136,7 +136,8 @@ namespace OpenSim.Framework.Monitoring
if(m_jobQueue.Count <= 0)
m_cancelSource.Cancel();
m_finishedProcessingAfterStop.WaitOne(RequestProcessTimeoutOnStop);
if(m_finishedProcessingAfterStop.WaitOne(RequestProcessTimeoutOnStop))
m_finishedProcessingAfterStop.Close();
}
finally
{

View File

@ -176,6 +176,9 @@ namespace OpenSim.Framework
/// </remarks>
public uint RegionSizeZ = Constants.RegionHeight;
// If entering avatar has no specific coords, this is where they land
public Vector3 DefaultLandingPoint = new Vector3(128, 128, 30);
private Dictionary<String, String> m_extraSettings = new Dictionary<string, string>();
// Apparently, we're applying the same estatesettings regardless of whether it's local or remote.
@ -712,6 +715,19 @@ namespace OpenSim.Framework
m_regionType = config.GetString("RegionType", String.Empty);
allKeys.Remove("RegionType");
// Get Default Landing Location (Defaults to 128,128)
string temp_location = config.GetString("DefaultLanding", "<128, 128, 30>");
Vector3 temp_vector;
if (Vector3.TryParse(temp_location, out temp_vector))
DefaultLandingPoint = temp_vector;
else
m_log.ErrorFormat("[RegionInfo]: Unable to parse DefaultLanding for '{0}'. The value given was '{1}'", RegionName, temp_location);
allKeys.Remove("DefaultLanding");
DoDefaultLandingSanityChecks();
#region Prim and map stuff
m_nonphysPrimMin = config.GetFloat("NonPhysicalPrimMin", 0);
@ -764,6 +780,48 @@ namespace OpenSim.Framework
}
}
// Make sure DefaultLanding is within region borders with a buffer zone 5 meters from borders
private void DoDefaultLandingSanityChecks()
{
// Sanity Check Default Landing
float buffer_zone = 5f;
bool ValuesCapped = false;
// Minimum Positions
if (DefaultLandingPoint.X < buffer_zone)
{
DefaultLandingPoint.X = buffer_zone;
ValuesCapped = true;
}
if (DefaultLandingPoint.Y < buffer_zone)
{
DefaultLandingPoint.Y = buffer_zone;
ValuesCapped = true;
}
// Maximum Positions
if (DefaultLandingPoint.X > RegionSizeX - buffer_zone)
{
DefaultLandingPoint.X = RegionSizeX - buffer_zone;
ValuesCapped = true;
}
if (DefaultLandingPoint.Y > RegionSizeY - buffer_zone)
{
DefaultLandingPoint.Y = RegionSizeY - buffer_zone;
ValuesCapped = true;
}
// Height
if (DefaultLandingPoint.Z < 0f)
DefaultLandingPoint.Z = 0f;
if (ValuesCapped == true)
m_log.WarnFormat("[RegionInfo]: The default landing location for {0} has been capped to {1}", RegionName, DefaultLandingPoint);
}
// Make sure user specified region sizes are sane.
// Must be multiples of legacy region size (256).
private void DoRegionSizeSanityChecks()

View File

@ -430,11 +430,11 @@ namespace OpenSim.Framework
using (Stream dst = _request.GetRequestStream())
{
m_log.Info("[REST]: GetRequestStream is ok");
m_log.Debug("[REST]: GetRequestStream is ok");
byte[] buf = new byte[1024];
int length = src.Read(buf, 0, 1024);
m_log.Info("[REST]: First Read is ok");
m_log.Debug("[REST]: First Read is ok");
while (length > 0)
{
dst.Write(buf, 0, length);

View File

@ -1019,7 +1019,8 @@ namespace OpenSim.Framework
///
/// <exception cref="System.Net.WebException">Thrown if we encounter a network issue while posting
/// the request. You'll want to make sure you deal with this as they're not uncommon</exception>
public static string MakeRequest(string verb, string requestUrl, string obj, int timeoutsecs, IServiceAuth auth)
public static string MakeRequest(string verb, string requestUrl, string obj, int timeoutsecs = -1,
IServiceAuth auth = null, bool keepalive = true)
{
int reqnum = WebUtil.RequestNumber++;
@ -1034,6 +1035,8 @@ namespace OpenSim.Framework
request.Method = verb;
if (timeoutsecs > 0)
request.Timeout = timeoutsecs * 1000;
if(!keepalive && request is HttpWebRequest)
((HttpWebRequest)request).KeepAlive = false;
if (auth != null)
auth.AddAuthorization(request.Headers);
@ -1125,16 +1128,6 @@ namespace OpenSim.Framework
return respstring;
}
public static string MakeRequest(string verb, string requestUrl, string obj, int timeoutsecs)
{
return MakeRequest(verb, requestUrl, obj, timeoutsecs, null);
}
public static string MakeRequest(string verb, string requestUrl, string obj)
{
return MakeRequest(verb, requestUrl, obj, -1);
}
public static string MakeRequest(string verb, string requestUrl, string obj, IServiceAuth auth)
{
return MakeRequest(verb, requestUrl, obj, -1, auth);

View File

@ -242,22 +242,22 @@ namespace OpenSim
ChangeSelectedRegion);
m_console.Commands.AddCommand("Archiving", false, "save xml",
"save xml",
"save xml [<file name>]",
"Save a region's data in XML format",
SaveXml);
m_console.Commands.AddCommand("Archiving", false, "save xml2",
"save xml2",
"save xml2 [<file name>]",
"Save a region's data in XML2 format",
SaveXml2);
m_console.Commands.AddCommand("Archiving", false, "load xml",
"load xml [-newIDs [<x> <y> <z>]]",
"load xml [<file name> [-newUID [<x> <y> <z>]]]",
"Load a region's data from XML format",
LoadXml);
m_console.Commands.AddCommand("Archiving", false, "load xml2",
"load xml2",
"load xml2 [<file name>]",
"Load a region's data from XML2 format",
LoadXml2);
@ -1068,7 +1068,7 @@ namespace OpenSim
/// <param name="cmdparams"></param>
protected void SavePrimsXml2(string module, string[] cmdparams)
{
if (cmdparams.Length > 5)
if (cmdparams.Length > 4)
{
SceneManager.SaveNamedPrimsToXml2(cmdparams[3], cmdparams[4]);
}
@ -1087,7 +1087,7 @@ namespace OpenSim
{
MainConsole.Instance.Output("PLEASE NOTE, save-xml is DEPRECATED and may be REMOVED soon. If you are using this and there is some reason you can't use save-xml2, please file a mantis detailing the reason.");
if (cmdparams.Length > 0)
if (cmdparams.Length > 2)
{
SceneManager.SaveCurrentSceneToXml(cmdparams[2]);
}

View File

@ -606,21 +606,21 @@ namespace OpenSim.Region.ClientStack.LindenUDP
//m_scene.CloseAllAgents(CircuitCode);
// Disable UDP handling for this client
m_udpClient.Shutdown();
m_udpClient.OnQueueEmpty -= HandleQueueEmpty;
m_udpClient.HasUpdates -= HandleHasUpdates;
m_udpClient.OnPacketStats -= PopulateStats;
m_udpClient.Shutdown();
// Shutdown the image manager
ImageManager.Close();
ImageManager = null;
m_entityUpdates = null;
m_entityProps = null;
m_entityUpdates = new PriorityQueue(1);
m_entityProps = new PriorityQueue(1);
m_killRecord.Clear();
GroupsInView.Clear();
m_scene = null;
// m_scene = null; can't do this unless checks are added everywhere due to workitems already in pools
//m_log.InfoFormat("[CLIENTVIEW] Memory pre GC {0}", System.GC.GetTotalMemory(false));
//GC.Collect();
//m_log.InfoFormat("[CLIENTVIEW] Memory post GC {0}", System.GC.GetTotalMemory(true));
@ -3126,10 +3126,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP
reply.Data.ActualArea = land.Area;
reply.Data.BillableArea = land.Area; // TODO: what is this?
// Bit 0: Mature, bit 7: on sale, other bits: no idea
reply.Data.Flags = (byte)(
(info.AccessLevel > 13 ? (1 << 0) : 0) +
((land.Flags & (uint)ParcelFlags.ForSale) != 0 ? (1 << 7) : 0));
reply.Data.Flags = (byte)Util.ConvertAccessLevelToMaturity((byte)info.AccessLevel);
if((land.Flags & (uint)ParcelFlags.ForSale) != 0)
reply.Data.Flags |= (byte)((1 << 7));
Vector3 pos = land.UserLocation;
if (pos.Equals(Vector3.Zero))
@ -4371,7 +4370,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
ushort timeDilation;
if(m_scene == null)
if(!IsActive)
return;
timeDilation = Utils.FloatToUInt16(m_scene.TimeDilation, 0.0f, 1.0f);
@ -9614,61 +9613,17 @@ namespace OpenSim.Region.ClientStack.LindenUDP
#region Parcel related packets
// acumulate several HandleRegionHandleRequest consecutive overlaping requests
// to be done with minimal resources as possible
// variables temporary here while in test
Queue<UUID> RegionHandleRequests = new Queue<UUID>();
bool RegionHandleRequestsInService = false;
private bool HandleRegionHandleRequest(IClientAPI sender, Packet Pack)
{
UUID currentUUID;
RegionHandleRequest handlerRegionHandleRequest = OnRegionHandleRequest;
if (handlerRegionHandleRequest == null)
return true;
RegionHandleRequestPacket rhrPack = (RegionHandleRequestPacket)Pack;
lock (RegionHandleRequests)
if (handlerRegionHandleRequest != null)
{
if (RegionHandleRequestsInService)
{
// we are already busy doing a previus request
// so enqueue it
RegionHandleRequests.Enqueue(rhrPack.RequestBlock.RegionID);
return true;
}
// else do it
currentUUID = rhrPack.RequestBlock.RegionID;
RegionHandleRequestsInService = true;
RegionHandleRequestPacket rhrPack = (RegionHandleRequestPacket)Pack;
handlerRegionHandleRequest(this, rhrPack.RequestBlock.RegionID);
}
while (true)
{
handlerRegionHandleRequest(this, currentUUID);
lock (RegionHandleRequests)
{
// exit condition, nothing to do or closed
// current code seems to assume we may loose the handler at anytime,
// so keep checking it
handlerRegionHandleRequest = OnRegionHandleRequest;
if (RegionHandleRequests.Count == 0 || !IsActive || handlerRegionHandleRequest == null)
{
RegionHandleRequests.Clear();
RegionHandleRequestsInService = false;
return true;
}
currentUUID = RegionHandleRequests.Dequeue();
}
}
return true; // actually unreached
return true;
}
private bool HandleParcelInfoRequest(IClientAPI sender, Packet Pack)
@ -12945,9 +12900,22 @@ namespace OpenSim.Region.ClientStack.LindenUDP
/// provide your own method.</param>
protected void OutPacket(Packet packet, ThrottleOutPacketType throttlePacketType, bool doAutomaticSplitting, UnackedPacketMethod method)
{
/* this is causing packet loss for some reason
if(!m_udpClient.IsConnected)
{
PacketPool.Instance.ReturnPacket(packet);
return;
}
*/
if (m_outPacketsToDrop != null)
{
if (m_outPacketsToDrop.Contains(packet.Type.ToString()))
{
PacketPool.Instance.ReturnPacket(packet);
return;
}
}
if (DebugPacketLevel > 0)
{

View File

@ -288,21 +288,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP
for (int i = 0; i < THROTTLE_CATEGORY_COUNT; i++)
{
m_packetOutboxes[i].Clear();
m_throttleCategories[i] = null;
m_nextPackets[i] = null;
}
// pull the throttle out of the scene throttle
m_throttleClient.Parent.UnregisterRequest(m_throttleClient);
m_throttleClient = null;
OnPacketStats = null;
OnQueueEmpty = null;
PendingAcks.Clear();
NeedAcks.Clear();
NeedAcks = null;
PendingAcks = null;
m_nextPackets = null;
m_packetOutboxes = null;
}
/// <summary>

View File

@ -521,7 +521,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
// if (usePools)
// EnablePools();
DisablePools();
base.DisablePools();
}
public void Start()

View File

@ -179,6 +179,11 @@ namespace OpenMetaverse
// m_dropRandomGenerator = new Random();
}
~OpenSimUDPBase()
{
if(m_udpSocket !=null)
try { m_udpSocket.Close(); } catch { }
}
/// <summary>
/// Start inbound UDP packet handling.
/// </summary>

View File

@ -97,7 +97,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP
/// </summary>
protected float m_burst;
public virtual float MaxDripRate { get; set; }
protected float m_maxDripRate = 0;
public virtual float MaxDripRate
{
get { return m_maxDripRate; }
set { m_maxDripRate = value; }
}
public float RequestedBurst
{
@ -134,7 +139,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
/// the system tick interval (typically around 15-22ms)</remarks>
protected float m_dripRate;
public virtual float RequestedDripRate
public float RequestedDripRate
{
get { return (m_dripRate == 0 ? m_totalDripRequest : m_dripRate); }
set {
@ -146,7 +151,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
}
}
public virtual float DripRate
public float DripRate
{
get {
float rate = Math.Min(RequestedDripRate,TotalDripRequest);
@ -344,7 +349,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
// greater than this.
// </summary>
protected float m_maxDripRate = 0;
public override float MaxDripRate
{
get { return (m_maxDripRate == 0 ? m_totalDripRequest : m_maxDripRate); }
@ -359,7 +363,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
// <summary>
// Adjust drip rate in response to network conditions.
// </summary>
public virtual float AdjustedDripRate
public float AdjustedDripRate
{
get { return m_dripRate; }
set
@ -380,12 +384,14 @@ namespace OpenSim.Region.ClientStack.LindenUDP
{
m_enabled = enabled;
MaxDripRate = maxDripRate;
m_maxDripRate = (maxDripRate == 0 ? m_totalDripRequest : Math.Max(maxDripRate, m_minimumFlow));
if (enabled)
AdjustedDripRate = m_maxDripRate * .5f;
m_dripRate = m_maxDripRate * .5f;
else
AdjustedDripRate = m_maxDripRate;
m_dripRate = m_maxDripRate;
if (m_parent != null)
m_parent.RegisterRequest(this, m_dripRate);
}
/// <summary>

View File

@ -55,9 +55,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat
protected List<string> FreezeCache = new List<string>();
protected string m_adminPrefix = "";
protected object m_syncy = new object();
protected IConfig m_config;
#region ISharedRegionModule Members
public virtual void Initialise(IConfigSource config)
{

View File

@ -455,6 +455,10 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
position = emergencyPos;
}
// Check Default Location (Also See ScenePresence.CompleteMovement)
if (position.X == 128f && position.Y == 128f)
position = sp.Scene.RegionInfo.DefaultLandingPoint;
// TODO: Get proper AVG Height
float localHalfAVHeight = 0.8f;
if (sp.Appearance != null)
@ -594,12 +598,22 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
uint x = 0, y = 0;
Util.RegionHandleToWorldLoc(regionHandle, out x, out y);
GridRegion reg;
// handle legacy HG. linked regions are mapped into y = 0 and have no size information
// so we can only search by base handle
if( y == 0)
{
reg = gridService.GetRegionByPosition(scope, (int)x, (int)y);
return reg;
}
// Compute the world location we're teleporting to
double worldX = (double)x + position.X;
double worldY = (double)y + position.Y;
// Find the region that contains the position
GridRegion reg = GetRegionContainingWorldLocation(gridService, scope, worldX, worldY);
reg = GetRegionContainingWorldLocation(gridService, scope, worldX, worldY);
if (reg != null)
{
@ -813,8 +827,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
if (OutSideViewRange)
{
m_log.DebugFormat(
"[ENTITY TRANSFER MODULE]: Determined that region {0} at {1},{2} needs new child agent for agent {3} from {4}",
finalDestination.RegionName, newRegionX, newRegionY, sp.Name, Scene.Name);
"[ENTITY TRANSFER MODULE]: Determined that region {0} at {1},{2} size {3},{4} needs new child agent for agent {5} from {6}",
finalDestination.RegionName, newRegionX, newRegionY,newSizeX, newSizeY, sp.Name, Scene.Name);
//sp.ControllingClient.SendTeleportProgress(teleportFlags, "Creating agent...");
#region IP Translation for NAT
@ -2180,8 +2194,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
#endregion // NotFoundLocationCache class
private NotFoundLocationCache m_notFoundLocationCache = new NotFoundLocationCache();
// needed for old grid code
protected GridRegion GetRegionContainingWorldLocation(IGridService pGridService, UUID pScopeID, double px, double py)
{
// Since we don't know how big the regions could be, we have to search a very large area
@ -2191,6 +2203,9 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
// Given a world position, get the GridRegion info for
// the region containing that point.
// for compatibility with old grids it does a scan to find large regions
// 0.9 grids to that
protected GridRegion GetRegionContainingWorldLocation(IGridService pGridService, UUID pScopeID,
double px, double py, uint pSizeHint)
{

View File

@ -48,31 +48,16 @@ namespace OpenSim.Region.CoreModules.Framework
MethodBase.GetCurrentMethod().DeclaringType);
private readonly List<Scene> m_scenes = new List<Scene>();
private System.Timers.Timer m_timer = new System.Timers.Timer();
private Queue<Action> m_RequestQueue = new Queue<Action>();
private Dictionary<string, List<string>> m_Pending = new Dictionary<string, List<string>>();
private int m_Interval;
private JobEngine m_processorJobEngine;
#region ISharedRegionModule
public void Initialise(IConfigSource config)
{
m_Interval = Util.GetConfigVarFromSections<int>(config, "Interval", new string[] { "ServiceThrottle" }, 5000);
m_timer = new System.Timers.Timer();
m_timer.AutoReset = false;
m_timer.Enabled = true;
m_timer.Interval = 15000; // 15 secs at first
m_timer.Elapsed += ProcessQueue;
m_timer.Start();
//WorkManager.StartThread(
// ProcessQueue,
// "GridServiceRequestThread",
// ThreadPriority.BelowNormal,
// true,
// false);
m_processorJobEngine = new JobEngine(
"ServiceThrottle","ServiceThrottle");
m_processorJobEngine.RequestProcessTimeoutOnStop = 31000; // many webrequests have 30s expire
m_processorJobEngine.Start();
}
public void AddRegion(Scene scene)
@ -82,7 +67,6 @@ namespace OpenSim.Region.CoreModules.Framework
m_scenes.Add(scene);
scene.RegisterModuleInterface<IServiceThrottleModule>(this);
scene.EventManager.OnNewClient += OnNewClient;
scene.EventManager.OnMakeRootAgent += OnMakeRootAgent;
}
}
@ -105,6 +89,7 @@ namespace OpenSim.Region.CoreModules.Framework
public void Close()
{
m_processorJobEngine.Stop();
}
public string Name
@ -126,38 +111,24 @@ namespace OpenSim.Region.CoreModules.Framework
client.OnRegionHandleRequest += OnRegionHandleRequest;
}
void OnMakeRootAgent(ScenePresence obj)
{
lock (m_timer)
{
if (!m_timer.Enabled)
{
m_timer.Interval = m_Interval;
m_timer.Enabled = true;
m_timer.Start();
}
}
}
public void OnRegionHandleRequest(IClientAPI client, UUID regionID)
{
//m_log.DebugFormat("[SERVICE THROTTLE]: RegionHandleRequest {0}", regionID);
ulong handle = 0;
if (IsLocalRegionHandle(regionID, out handle))
{
client.SendRegionHandle(regionID, handle);
return;
}
Action action = delegate
{
if(!client.IsActive)
return;
GridRegion r = m_scenes[0].GridService.GetRegionByUUID(UUID.Zero, regionID);
if(!client.IsActive)
return;
if (r != null && r.RegionHandle != 0)
client.SendRegionHandle(regionID, r.RegionHandle);
};
Enqueue("region", regionID.ToString(), action);
m_processorJobEngine.QueueJob("regionHandle", action, regionID.ToString());
}
#endregion Events
@ -166,91 +137,10 @@ namespace OpenSim.Region.CoreModules.Framework
public void Enqueue(string category, string itemid, Action continuation)
{
lock (m_RequestQueue)
{
if (m_Pending.ContainsKey(category))
{
if (m_Pending[category].Contains(itemid))
// Don't enqueue, it's already pending
return;
}
else
m_Pending.Add(category, new List<string>());
m_Pending[category].Add(itemid);
m_RequestQueue.Enqueue(delegate
{
lock (m_RequestQueue)
m_Pending[category].Remove(itemid);
continuation();
});
}
m_processorJobEngine.QueueJob(category, continuation, itemid);
}
#endregion IServiceThrottleModule
#region Process Continuation Queue
private void ProcessQueue(object sender, System.Timers.ElapsedEventArgs e)
{
//m_log.DebugFormat("[YYY]: Process queue with {0} continuations", m_RequestQueue.Count);
while (m_RequestQueue.Count > 0)
{
Action continuation = null;
lock (m_RequestQueue)
continuation = m_RequestQueue.Dequeue();
if (continuation != null)
continuation();
}
if (AreThereRootAgents())
{
lock (m_timer)
{
m_timer.Interval = 1000; // 1 sec
m_timer.Enabled = true;
m_timer.Start();
}
}
else
lock (m_timer)
m_timer.Enabled = false;
}
#endregion Process Continuation Queue
#region Misc
private bool IsLocalRegionHandle(UUID regionID, out ulong regionHandle)
{
regionHandle = 0;
foreach (Scene s in m_scenes)
if (s.RegionInfo.RegionID == regionID)
{
regionHandle = s.RegionInfo.RegionHandle;
return true;
}
return false;
}
private bool AreThereRootAgents()
{
foreach (Scene s in m_scenes)
{
foreach (ScenePresence sp in s.GetScenePresences())
if (!sp.IsChildAgent)
return true;
}
return false;
}
#endregion Misc
}
}

View File

@ -206,7 +206,7 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement
}
// Not found in cache, queue continuation
m_ServiceThrottle.Enqueue("name", uuid.ToString(), delegate
m_ServiceThrottle.Enqueue("uuidname", uuid.ToString(), delegate
{
//m_log.DebugFormat("[YYY]: Name request {0}", uuid);
@ -216,9 +216,12 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement
// So to avoid clients
// (particularly Hypergrid clients) permanently binding "Unknown User" to a given UUID, we will
// instead drop the request entirely.
if(!client.IsActive)
return;
if (GetUser(uuid, out user))
{
client.SendNameReply(uuid, user.FirstName, user.LastName);
if(client.IsActive)
client.SendNameReply(uuid, user.FirstName, user.LastName);
}
// else
// m_log.DebugFormat(

View File

@ -61,7 +61,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.AgentPreferences
get { return "RemoteAgentPreferencesServicesConnector"; }
}
public override void Initialise(IConfigSource source)
public new void Initialise(IConfigSource source)
{
IConfig moduleConfig = source.Configs["Modules"];
if (moduleConfig != null)

View File

@ -1801,30 +1801,51 @@ namespace OpenSim.Region.CoreModules.World.Land
{
Hashtable hash = new Hashtable();
hash = (Hashtable)LLSD.LLSDDeserialize(Utils.StringToBytes(request));
if (hash.ContainsKey("region_id") && hash.ContainsKey("location"))
if (hash.ContainsKey("location"))
{
UUID regionID = (UUID)hash["region_id"];
UUID scope = m_scene.RegionInfo.ScopeID;
ArrayList list = (ArrayList)hash["location"];
uint x = (uint)(double)list[0];
uint y = (uint)(double)list[1];
if (hash.ContainsKey("region_handle"))
if(hash.ContainsKey("region_id"))
{
UUID regionID = (UUID)hash["region_id"];
if (regionID == m_scene.RegionInfo.RegionID)
{
// a parcel request for a local parcel => no need to query the grid
parcelID = Util.BuildFakeParcelID(m_scene.RegionInfo.RegionHandle, x, y);
}
else
{
// a parcel request for a parcel in another region. Ask the grid about the region
GridRegion info = m_scene.GridService.GetRegionByUUID(scope, regionID);
if (info != null)
parcelID = Util.BuildFakeParcelID(info.RegionHandle, x, y);
}
}
else if (hash.ContainsKey("region_handle"))
{
// if you do a "About Landmark" on a landmark a second time, the viewer sends the
// region_handle it got earlier via RegionHandleRequest
ulong regionHandle = Util.BytesToUInt64Big((byte[])hash["region_handle"]);
parcelID = Util.BuildFakeParcelID(regionHandle, x, y);
}
else if (regionID == m_scene.RegionInfo.RegionID)
{
// a parcel request for a local parcel => no need to query the grid
parcelID = Util.BuildFakeParcelID(m_scene.RegionInfo.RegionHandle, x, y);
}
else
{
// a parcel request for a parcel in another region. Ask the grid about the region
GridRegion info = m_scene.GridService.GetRegionByUUID(UUID.Zero, regionID);
if (info != null)
parcelID = Util.BuildFakeParcelID(info.RegionHandle, x, y);
if(regionHandle == m_scene.RegionInfo.RegionHandle)
parcelID = Util.BuildFakeParcelID(regionHandle, x, y);
else
{
uint wx;
uint wy;
Util.RegionHandleToWorldLoc(regionHandle, out wx, out wy);
wx += x;
wy += y;
GridRegion info = m_scene.GridService.GetRegionByPosition(scope, (int)wx, (int)wy);
if(info != null)
{
wx -= (uint)info.RegionLocX;
wy -= (uint)info.RegionLocY;
parcelID = Util.BuildFakeParcelID(info.RegionHandle, wx, wy);
}
}
}
}
}

View File

@ -5454,6 +5454,7 @@ Label_GroupsDone:
public void CleanTempObjects()
{
DateTime now = DateTime.UtcNow;
EntityBase[] entities = GetEntities();
foreach (EntityBase obj in entities)
{
@ -5465,7 +5466,7 @@ Label_GroupsDone:
{
if ((grp.RootPart.Flags & PrimFlags.TemporaryOnRez) != 0)
{
if (grp.GetSittingAvatarsCount() == 0 && grp.RootPart.Expires <= DateTime.Now)
if (grp.GetSittingAvatarsCount() == 0 && grp.RootPart.Expires <= now)
DeleteSceneObject(grp, false);
}
}

View File

@ -153,9 +153,9 @@ namespace OpenSim.Region.Framework.Scenes
{
m_scene.SceneGraph.FireChangeBackup(this);
}
timeLastChanged = DateTime.Now.Ticks;
timeLastChanged = DateTime.UtcNow.Ticks;
if (!m_hasGroupChanged)
timeFirstChanged = DateTime.Now.Ticks;
timeFirstChanged = DateTime.UtcNow.Ticks;
if (m_rootPart != null && m_rootPart.UUID != null && m_scene != null)
{
/*
@ -233,7 +233,7 @@ namespace OpenSim.Region.Framework.Scenes
m_minPersistTime = m_scene.m_dontPersistBefore;
}
long currentTime = DateTime.Now.Ticks;
long currentTime = DateTime.UtcNow.Ticks;
if (timeLastChanged == 0) timeLastChanged = currentTime;
if (timeFirstChanged == 0) timeFirstChanged = currentTime;
@ -4161,6 +4161,180 @@ namespace OpenSim.Region.Framework.Scenes
}
public bool GroupResize(double fscale)
{
// m_log.DebugFormat(
// "[SCENE OBJECT GROUP]: Group resizing {0} {1} from {2} to {3}", Name, LocalId, RootPart.Scale, fscale);
if (Scene == null || IsDeleted || inTransit || fscale < 0)
return false;
// ignore lsl restrictions. let them be done a LSL
PhysicsActor pa = m_rootPart.PhysActor;
if(RootPart.KeyframeMotion != null)
RootPart.KeyframeMotion.Suspend();
float minsize = Scene.m_minNonphys;
float maxsize = Scene.m_maxNonphys;
// assuming physics is more restrictive
if (pa != null && pa.IsPhysical)
{
minsize = Scene.m_minPhys;
maxsize = Scene.m_maxPhys;
}
SceneObjectPart[] parts = m_parts.GetArray();
float tmp;
// check scaling factor so parts don't violate dimensions
for(int i = 0; i < parts.Length; i++)
{
SceneObjectPart obPart = parts[i];
Vector3 oldSize = new Vector3(obPart.Scale);
tmp = (float)(oldSize.X * fscale);
if(tmp > maxsize)
return false;
if(tmp < minsize)
return false;
tmp = (float)(oldSize.Y * fscale);
if(tmp > maxsize)
return false;
if(tmp < minsize)
return false;
tmp = (float)(oldSize.Z * fscale);
if(tmp > maxsize)
return false;
if(tmp < minsize)
return false;
}
Vector3 newSize = RootPart.Scale;
newSize.X = (float)(newSize.X * fscale);
newSize.Y = (float)(newSize.Y * fscale);
newSize.Z = (float)(newSize.Z * fscale);
if(pa != null)
pa.Building = true;
RootPart.Scale = newSize;
Vector3 currentpos;
for (int i = 0; i < parts.Length; i++)
{
SceneObjectPart obPart = parts[i];
if (obPart.UUID != m_rootPart.UUID)
{
currentpos = obPart.OffsetPosition;
currentpos.X = (float)(currentpos.X * fscale);
currentpos.Y = (float)(currentpos.Y * fscale);
currentpos.Z = (float)(currentpos.Z * fscale);
newSize = obPart.Scale;
newSize.X = (float)(newSize.X * fscale);
newSize.Y = (float)(newSize.Y * fscale);
newSize.Z = (float)(newSize.Z * fscale);
obPart.Scale = newSize;
obPart.UpdateOffSet(currentpos);
}
}
if(pa != null)
pa.Building = false;
InvalidBoundsRadius();
HasGroupChanged = true;
m_rootPart.TriggerScriptChangedEvent(Changed.SCALE);
ScheduleGroupForFullUpdate();
if(RootPart.KeyframeMotion != null)
RootPart.KeyframeMotion.Resume();
return true;
}
public float GetMaxGroupResizeScale()
{
if (Scene == null || IsDeleted || inTransit)
return 1.0f;
float maxsize = Scene.m_maxNonphys;
PhysicsActor pa = m_rootPart.PhysActor;
// assuming physics is more restrictive
if (pa != null && pa.IsPhysical)
maxsize = Scene.m_maxPhys;
SceneObjectPart[] parts = m_parts.GetArray();
float larger = float.MinValue;
for(int i = 0; i < parts.Length; i++)
{
SceneObjectPart obPart = parts[i];
Vector3 oldSize = new Vector3(obPart.Scale);
if(larger < oldSize.X)
larger = oldSize.X;
if(larger < oldSize.Y)
larger = oldSize.Y;
if(larger < oldSize.Z)
larger = oldSize.Z;
}
if(larger >= maxsize)
return 1.0f;
larger += 1e-3f;
float fscale = maxsize / larger;
return fscale;
}
public float GetMinGroupResizeScale()
{
if (Scene == null || IsDeleted || inTransit)
return 1.0f;
float minsize = Scene.m_minNonphys;
PhysicsActor pa = m_rootPart.PhysActor;
// assuming physics is more restrictive
if (pa != null && pa.IsPhysical)
minsize = Scene.m_minPhys;
SceneObjectPart[] parts = m_parts.GetArray();
float smaller = float.MaxValue;
for(int i = 0; i < parts.Length; i++)
{
SceneObjectPart obPart = parts[i];
Vector3 oldSize = new Vector3(obPart.Scale);
if(smaller > oldSize.X)
smaller = oldSize.X;
if(smaller > oldSize.Y)
smaller = oldSize.Y;
if(smaller > oldSize.Z)
smaller = oldSize.Z;
}
if(smaller <= minsize)
return 1.0f;
if(smaller > 2e-3f)
smaller -= 1e-3f;
float fscale = minsize / smaller;
if(fscale < 1e-8f)
fscale = 1e-8f;
return fscale;
}
#endregion
#region Position

View File

@ -185,8 +185,7 @@ namespace OpenSim.Region.Framework.Scenes
return
!(SitTargetPosition == Vector3.Zero
&& (SitTargetOrientation == Quaternion.Identity // Valid Zero Rotation quaternion
|| SitTargetOrientation.X == 0f && SitTargetOrientation.Y == 0f && SitTargetOrientation.Z == 1f && SitTargetOrientation.W == 0f // W-Z Mapping was invalid at one point
|| SitTargetOrientation.X == 0f && SitTargetOrientation.Y == 0f && SitTargetOrientation.Z == 0f && SitTargetOrientation.W == 0f)); // Invalid Quaternion
|| (SitTargetOrientation.W == 0f && SitTargetOrientation.X == 0f && SitTargetOrientation.Y == 0f && SitTargetOrientation.Z == 0f ))); // Invalid Quaternion
}
}
@ -1909,7 +1908,7 @@ namespace OpenSim.Region.Framework.Scenes
public void ResetExpire()
{
Expires = DateTime.Now + new TimeSpan(600000000);
Expires = DateTime.UtcNow + new TimeSpan(600000000);
}
public void AddFlag(PrimFlags flag)

View File

@ -2043,6 +2043,10 @@ namespace OpenSim.Region.Framework.Scenes
look = new Vector3(0.99f, 0.042f, 0);
}
// Check Default Location (Also See EntityTransferModule.TeleportAgentWithinRegion)
if (AbsolutePosition.X == 128f && AbsolutePosition.Y == 128f)
AbsolutePosition = Scene.RegionInfo.DefaultLandingPoint;
if (!MakeRootAgent(AbsolutePosition, flying, ref look))
{
m_log.DebugFormat(
@ -2071,14 +2075,13 @@ namespace OpenSim.Region.Framework.Scenes
m_log.DebugFormat("[CompleteMovement]: Missing COF for {0} is {1}", client.AgentId, COF);
}
if(!gotCrossUpdate)
RotateToLookAt(look);
// Tell the client that we're totally ready
ControllingClient.MoveAgentIntoRegion(m_scene.RegionInfo, AbsolutePosition, look);
m_log.DebugFormat("[CompleteMovement] MoveAgentIntoRegion: {0}ms", Util.EnvironmentTickCountSubtract(ts));
if (!string.IsNullOrEmpty(m_callbackURI))
{
// We cannot sleep here since this would hold up the inbound packet processing thread, as
@ -2107,12 +2110,28 @@ namespace OpenSim.Region.Framework.Scenes
// client.Name, client.AgentId, m_scene.RegionInfo.RegionName);
// }
m_log.DebugFormat("[CompleteMovement] ReleaseAgent: {0}ms", Util.EnvironmentTickCountSubtract(ts));
if(m_teleportFlags > 0) //sanity check
gotCrossUpdate = false;
if(!gotCrossUpdate)
RotateToLookAt(look);
// start sending terrain patchs
if (!gotCrossUpdate && !isNPC)
Scene.SendLayerData(ControllingClient);
// HG delay
if((m_teleportFlags & TeleportFlags.ViaHGLogin) != 0)
{
Thread.Sleep(500);
m_log.DebugFormat("[CompleteMovement] HG delay: {0}ms", Util.EnvironmentTickCountSubtract(ts));
}
m_previusParcelHide = false;
m_previusParcelUUID = UUID.Zero;
m_currentParcelHide = false;

View File

@ -265,6 +265,7 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
foreach (XmlNode aPrimNode in rootNode.ChildNodes)
{
SceneObjectGroup obj = DeserializeGroupFromXml2(aPrimNode.OuterXml);
scene.AddNewSceneObject(obj, true);
if (startScripts)
sceneObjects.Add(obj);
}

View File

@ -53,15 +53,13 @@ namespace OpenSim.Region.OptionalModules.Avatar.Concierge
{
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
private const int DEBUG_CHANNEL = 2147483647;
// private const int DEBUG_CHANNEL = 2147483647; use base value
private List<IScene> m_scenes = new List<IScene>();
private new List<IScene> m_scenes = new List<IScene>();
private List<IScene> m_conciergedScenes = new List<IScene>();
private bool m_replacingChatModule = false;
private IConfig m_config;
private string m_whoami = "conferencier";
private Regex m_regions = null;
private string m_welcomes = null;
@ -72,29 +70,28 @@ namespace OpenSim.Region.OptionalModules.Avatar.Concierge
private string m_brokerURI = String.Empty;
private int m_brokerUpdateTimeout = 300;
internal object m_syncy = new object();
internal new object m_syncy = new object();
internal bool m_enabled = false;
internal new bool m_enabled = false;
#region ISharedRegionModule Members
public override void Initialise(IConfigSource config)
public override void Initialise(IConfigSource configSource)
{
m_config = config.Configs["Concierge"];
IConfig config = configSource.Configs["Concierge"];
if (null == m_config)
if (config == null)
return;
if (!m_config.GetBoolean("enabled", false))
if (!config.GetBoolean("enabled", false))
return;
m_enabled = true;
// check whether ChatModule has been disabled: if yes,
// then we'll "stand in"
try
{
if (config.Configs["Chat"] == null)
if (configSource.Configs["Chat"] == null)
{
// if Chat module has not been configured it's
// enabled by default, so we are not going to
@ -103,7 +100,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.Concierge
}
else
{
m_replacingChatModule = !config.Configs["Chat"].GetBoolean("enabled", true);
m_replacingChatModule = !configSource.Configs["Chat"].GetBoolean("enabled", true);
}
}
catch (Exception)
@ -114,21 +111,21 @@ namespace OpenSim.Region.OptionalModules.Avatar.Concierge
m_log.InfoFormat("[Concierge] {0} ChatModule", m_replacingChatModule ? "replacing" : "not replacing");
// take note of concierge channel and of identity
m_conciergeChannel = config.Configs["Concierge"].GetInt("concierge_channel", m_conciergeChannel);
m_whoami = m_config.GetString("whoami", "conferencier");
m_welcomes = m_config.GetString("welcomes", m_welcomes);
m_announceEntering = m_config.GetString("announce_entering", m_announceEntering);
m_announceLeaving = m_config.GetString("announce_leaving", m_announceLeaving);
m_xmlRpcPassword = m_config.GetString("password", m_xmlRpcPassword);
m_brokerURI = m_config.GetString("broker", m_brokerURI);
m_brokerUpdateTimeout = m_config.GetInt("broker_timeout", m_brokerUpdateTimeout);
m_conciergeChannel = configSource.Configs["Concierge"].GetInt("concierge_channel", m_conciergeChannel);
m_whoami = config.GetString("whoami", "conferencier");
m_welcomes = config.GetString("welcomes", m_welcomes);
m_announceEntering = config.GetString("announce_entering", m_announceEntering);
m_announceLeaving = config.GetString("announce_leaving", m_announceLeaving);
m_xmlRpcPassword = config.GetString("password", m_xmlRpcPassword);
m_brokerURI = config.GetString("broker", m_brokerURI);
m_brokerUpdateTimeout = config.GetInt("broker_timeout", m_brokerUpdateTimeout);
m_log.InfoFormat("[Concierge] reporting as \"{0}\" to our users", m_whoami);
// calculate regions Regex
if (m_regions == null)
{
string regions = m_config.GetString("regions", String.Empty);
string regions = config.GetString("regions", String.Empty);
if (!String.IsNullOrEmpty(regions))
{
m_regions = new Regex(@regions, RegexOptions.Compiled | RegexOptions.IgnoreCase);
@ -136,7 +133,6 @@ namespace OpenSim.Region.OptionalModules.Avatar.Concierge
}
}
public override void AddRegion(Scene scene)
{
if (!m_enabled) return;

View File

@ -532,7 +532,7 @@ namespace OpenSim.Region.OptionalModules.Materials
lock(m_Materials)
{
if(oldid != UUID.Zero)
if(oldid != UUID.Zero && m_MaterialsRefCount.ContainsKey(oldid))
{
m_MaterialsRefCount[oldid]--;
if(m_MaterialsRefCount[oldid] <= 0)

View File

@ -2969,6 +2969,13 @@ namespace OpenSim.Region.PhysicsModule.ubOde
private void changePhysRepData(ODEPhysRepData repData)
{
if(_size == repData.size &&
_pbs == repData.pbs &&
m_shapetype == repData.shapetype &&
m_mesh == repData.mesh &&
primVolume == repData.volume)
return;
CheckDelaySelect();
OdePrim parent = (OdePrim)_parent;

View File

@ -1803,6 +1803,53 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
return 0;
}
public LSL_Integer llScaleByFactor(double scaling_factor)
{
m_host.AddScriptLPS(1);
SceneObjectGroup group = m_host.ParentGroup;
if(scaling_factor < 1e-6)
return ScriptBaseClass.FALSE;
if(scaling_factor > 1e6)
return ScriptBaseClass.FALSE;
if (group == null || group.IsDeleted || group.inTransit)
return ScriptBaseClass.FALSE;
if (group.RootPart.PhysActor != null && group.RootPart.PhysActor.IsPhysical)
return ScriptBaseClass.FALSE;
if (group.RootPart.KeyframeMotion != null)
return ScriptBaseClass.FALSE;
if(group.GroupResize(scaling_factor))
return ScriptBaseClass.TRUE;
else
return ScriptBaseClass.FALSE;
}
public LSL_Float llGetMaxScaleFactor()
{
m_host.AddScriptLPS(1);
SceneObjectGroup group = m_host.ParentGroup;
if (group == null || group.IsDeleted || group.inTransit)
return 1.0f;
return (LSL_Float)group.GetMaxGroupResizeScale();
}
public LSL_Float llGetMinScaleFactor()
{
m_host.AddScriptLPS(1);
SceneObjectGroup group = m_host.ParentGroup;
if (group == null || group.IsDeleted || group.inTransit)
return 1.0f;
return (LSL_Float)group.GetMinGroupResizeScale();
}
public void llSetScale(LSL_Vector scale)
{
m_host.AddScriptLPS(1);
@ -3049,7 +3096,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
{
m_host.AddScriptLPS(1);
double ScriptTime = Util.GetTimeStampMS() - m_timer;
return (ScriptTime / 1000.0);
return (float)Math.Round((ScriptTime / 1000.0), 3);
}
public void llResetTime()
@ -3064,7 +3111,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
double now = Util.GetTimeStampMS();
double ScriptTime = now - m_timer;
m_timer = now;
return (ScriptTime / 1000.0);
return (float)Math.Round((ScriptTime / 1000.0), 3);
}
public void llSound(string sound, double volume, int queue, int loop)
@ -3482,13 +3529,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
if (item == null)
{
Error("llRezAtRoot", "Can't find object '" + inventory + "'");
Error("llRez(AtRoot/Object)", "Can't find object '" + inventory + "'");
return;
}
if (item.InvType != (int)InventoryType.Object)
{
Error("llRezAtRoot", "Can't create requested object; object is missing from database");
Error("llRez(AtRoot/Object)", "Can't create requested object; object is missing from database");
return;
}
@ -3532,7 +3579,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
// Variable script delay? (see (http://wiki.secondlife.com/wiki/LSL_Delay)
}
}, null, "LSL_Api.llRezAtRoot");
}, null, "LSL_Api.doObjectRez");
//ScriptSleep((int)((groupmass * velmag) / 10));
ScriptSleep(m_sleepMsOnRezAtRoot);

View File

@ -1938,8 +1938,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
taskItem.ResetIDs(m_host.UUID);
taskItem.ParentID = m_host.UUID;
taskItem.CreationDate = (uint)Util.UnixTimeSinceEpoch();
taskItem.Name = asset.Name;
taskItem.Description = asset.Description;
taskItem.Name = name;
taskItem.Description = description;
taskItem.Type = (int)AssetType.Notecard;
taskItem.InvType = (int)InventoryType.Notecard;
taskItem.OwnerID = m_host.OwnerID;
@ -3354,8 +3354,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
m_host.AddScriptLPS(1);
Scene scene = m_ScriptEngine.World;
GridRegion region = scene.GridService.GetRegionByUUID(UUID.Zero, World.RegionInfo.RegionID);
return new LSL_Vector((float)region.RegionSizeX, (float)region.RegionSizeY, (float)Constants.RegionHeight);
RegionInfo reg = World.RegionInfo;
// GridRegion region = scene.GridService.GetRegionByUUID(UUID.Zero, World.RegionInfo.RegionID);
// return new LSL_Vector((float)region.RegionSizeX, (float)region.RegionSizeY, (float)Constants.RegionHeight);
return new LSL_Vector((float)reg.RegionSizeX, (float)reg.RegionSizeY, 0.0f);
}
public int osGetSimulatorMemory()

View File

@ -326,6 +326,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
LSL_Integer llRound(double f);
LSL_Integer llSameGroup(string agent);
void llSay(int channelID, string text);
LSL_Integer llScaleByFactor(double scaling_factor);
LSL_Float llGetMaxScaleFactor();
LSL_Float llGetMinScaleFactor();
void llScaleTexture(double u, double v, int face);
LSL_Integer llScriptDanger(LSL_Vector pos);
void llScriptProfiler(LSL_Integer flag);

View File

@ -1465,6 +1465,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
m_LSL_Functions.llSay(channelID, text);
}
public LSL_Integer llScaleByFactor(double scaling_factor)
{
return m_LSL_Functions.llScaleByFactor(scaling_factor);
}
public LSL_Float llGetMaxScaleFactor()
{
return m_LSL_Functions.llGetMaxScaleFactor();
}
public LSL_Float llGetMinScaleFactor()
{
return m_LSL_Functions.llGetMinScaleFactor();
}
public void llScaleTexture(double u, double v, int face)
{
m_LSL_Functions.llScaleTexture(u, v, face);

View File

@ -880,7 +880,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
try
{
m_CurrentEvent = data.EventName;
m_EventStart = DateTime.Now;
m_EventStart = DateTime.UtcNow;
m_InEvent = true;
try
@ -1033,7 +1033,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
if (!m_InEvent)
return 0;
return (DateTime.Now - m_EventStart).Seconds;
return (DateTime.UtcNow - m_EventStart).Seconds;
}
public void ResetScript(int timeout)

View File

@ -70,13 +70,17 @@ namespace OpenSim.Server.Handlers.Hypergrid
string imageURL = string.Empty;
ulong regionHandle = 0;
string reason = string.Empty;
int sizeX = 256;
int sizeY = 256;
bool success = m_GatekeeperService.LinkRegion(name, out regionID, out regionHandle, out externalName, out imageURL, out reason);
bool success = m_GatekeeperService.LinkRegion(name, out regionID, out regionHandle, out externalName, out imageURL, out reason, out sizeX, out sizeY);
Hashtable hash = new Hashtable();
hash["result"] = success.ToString();
hash["uuid"] = regionID.ToString();
hash["handle"] = regionHandle.ToString();
hash["size_x"] = sizeX.ToString();
hash["size_y"] = sizeY.ToString();
hash["region_image"] = imageURL;
hash["external_name"] = externalName;

View File

@ -139,6 +139,7 @@ namespace OpenSim.Server.Handlers.Hypergrid
hash["region_name"] = regInfo.RegionName;
hash["hostname"] = regInfo.ExternalHostName;
hash["http_port"] = regInfo.HttpPort.ToString();
hash["server_uri"] = regInfo.ServerURI;
hash["internal_port"] = regInfo.InternalEndPoint.Port.ToString();
hash["position"] = position.ToString();
hash["lookAt"] = lookAt.ToString();

View File

@ -62,7 +62,7 @@ namespace OpenSim.Services.Connectors
Initialise(source);
}
public virtual void Initialise(IConfigSource source)
public void Initialise(IConfigSource source)
{
IConfig gridConfig = source.Configs["AgentPreferencesService"];
if (gridConfig == null)

View File

@ -158,7 +158,7 @@ namespace OpenSim.Services.Connectors.Friends
try
{
string reply = SynchronousRestFormsRequester.MakeRequest("POST", uri, reqString);
string reply = SynchronousRestFormsRequester.MakeRequest("POST", uri, reqString, 15, null, false);
if (reply != string.Empty)
{
Dictionary<string, object> replyData = ServerUtils.ParseXmlResponse(reply);

View File

@ -73,13 +73,15 @@ namespace OpenSim.Services.Connectors.Hypergrid
return "foreignobject/";
}
public bool LinkRegion(GridRegion info, out UUID regionID, out ulong realHandle, out string externalName, out string imageURL, out string reason)
public bool LinkRegion(GridRegion info, out UUID regionID, out ulong realHandle, out string externalName, out string imageURL, out string reason, out int sizeX, out int sizeY)
{
regionID = UUID.Zero;
imageURL = string.Empty;
realHandle = 0;
externalName = string.Empty;
reason = string.Empty;
sizeX = (int)Constants.RegionSize;
sizeY = (int)Constants.RegionSize;
Hashtable hash = new Hashtable();
hash["region_name"] = info.RegionName;
@ -134,8 +136,15 @@ namespace OpenSim.Services.Connectors.Hypergrid
externalName = (string)hash["external_name"];
//m_log.Debug(">> HERE, externalName: " + externalName);
}
if (hash["size_x"] != null)
{
Int32.TryParse((string)hash["size_x"], out sizeX);
}
if (hash["size_y"] != null)
{
Int32.TryParse((string)hash["size_y"], out sizeY);
}
}
}
catch (Exception e)
{

View File

@ -277,7 +277,10 @@ namespace OpenSim.Services.Connectors.Hypergrid
{
reply = SynchronousRestFormsRequester.MakeRequest("POST",
uri,
ServerUtils.BuildQueryString(sendData), 15);
ServerUtils.BuildQueryString(sendData),
15,
null,
false);
}
catch (Exception e)
{

View File

@ -77,6 +77,7 @@ namespace OpenSim.Services.FSAssetService
protected int m_missingAssetsFS = 0;
protected string m_FSBase;
protected bool m_useOsgridFormat = false;
protected bool m_showStats = true;
private static bool m_Initialized;
private bool m_MainInstance;
@ -186,6 +187,9 @@ namespace OpenSim.Services.FSAssetService
m_useOsgridFormat = assetConfig.GetBoolean("UseOsgridFormat", m_useOsgridFormat);
// Default is to show stats to retain original behaviour
m_showStats = assetConfig.GetBoolean("ShowConsoleStats", m_showStats);
if (m_MainInstance)
{
string loader = assetConfig.GetString("DefaultAssetLoader", string.Empty);
@ -203,8 +207,12 @@ namespace OpenSim.Services.FSAssetService
m_WriterThread = new Thread(Writer);
m_WriterThread.Start();
m_StatsThread = new Thread(Stats);
m_StatsThread.Start();
if (m_showStats)
{
m_StatsThread = new Thread(Stats);
m_StatsThread.Start();
}
}
m_log.Info("[FSASSETS]: FS asset service enabled");
@ -441,7 +449,7 @@ namespace OpenSim.Services.FSAssetService
Store(asset);
}
}
if (asset == null)
if (asset == null && m_showStats)
{
// m_log.InfoFormat("[FSASSETS]: Asset {0} not found", id);
m_missingAssets++;
@ -469,8 +477,11 @@ namespace OpenSim.Services.FSAssetService
}
}
if (asset == null)
m_missingAssetsFS++;
// m_log.InfoFormat("[FSASSETS]: Asset {0}, hash {1} not found in FS", id, hash);
{
if (m_showStats)
m_missingAssetsFS++;
// m_log.InfoFormat("[FSASSETS]: Asset {0}, hash {1} not found in FS", id, hash);
}
else
{
// Deal with bug introduced in Oct. 20 (1eb3e6cc43e2a7b4053bc1185c7c88e22356c5e8)
@ -484,10 +495,13 @@ namespace OpenSim.Services.FSAssetService
}
}
lock (m_statsLock)
if (m_showStats)
{
m_readTicks += Environment.TickCount - startTime;
m_readCount++;
lock (m_statsLock)
{
m_readTicks += Environment.TickCount - startTime;
m_readCount++;
}
}
// Deal with bug introduced in Oct. 20 (1eb3e6cc43e2a7b4053bc1185c7c88e22356c5e8)

View File

@ -198,7 +198,7 @@ namespace OpenSim.Services.GridService
mapName = mapName.Trim();
if (!mapName.StartsWith("http"))
if (!mapName.StartsWith("http") && !mapName.StartsWith("https"))
{
// Formats: grid.example.com:8002:region name
// grid.example.com:region name
@ -231,9 +231,10 @@ namespace OpenSim.Services.GridService
{
regionName = parts[2];
}
bool success = TryCreateLink(scopeID, xloc, yloc, regionName, port, host, ownerID, out regInfo, out reason);
if (success)
string serverURI = "http://"+ host +":"+ port.ToString() + "/";
// bool success = TryCreateLink(scopeID, xloc, yloc, regionName, port, host, ownerID, out regInfo, out reason);
if(TryCreateLink(scopeID, xloc, yloc, regionName, 0, null, serverURI, ownerID, out regInfo, out reason))
{
regInfo.RegionName = mapName;
return regInfo;
@ -257,6 +258,8 @@ namespace OpenSim.Services.GridService
}
serverURI = parts[0];
if (!serverURI.EndsWith("/"))
serverURI = serverURI + "/";
if (parts.Length >= 2)
{
@ -365,7 +368,9 @@ namespace OpenSim.Services.GridService
UUID regionID = UUID.Zero;
string externalName = string.Empty;
string imageURL = string.Empty;
if (!m_GatekeeperConnector.LinkRegion(regInfo, out regionID, out handle, out externalName, out imageURL, out reason))
int sizeX = (int)Constants.RegionSize;
int sizeY = (int)Constants.RegionSize;
if (!m_GatekeeperConnector.LinkRegion(regInfo, out regionID, out handle, out externalName, out imageURL, out reason, out sizeX, out sizeY))
return false;
if (regionID == UUID.Zero)
@ -397,6 +402,8 @@ namespace OpenSim.Services.GridService
// }
regInfo.RegionID = regionID;
regInfo.RegionSizeX = sizeX;
regInfo.RegionSizeY = sizeY;
if (externalName == string.Empty)
regInfo.RegionName = regInfo.ServerURI;

View File

@ -162,10 +162,12 @@ namespace OpenSim.Services.HypergridService
exceptions.Add(s.Trim());
}
public bool LinkRegion(string regionName, out UUID regionID, out ulong regionHandle, out string externalName, out string imageURL, out string reason)
public bool LinkRegion(string regionName, out UUID regionID, out ulong regionHandle, out string externalName, out string imageURL, out string reason, out int sizeX, out int sizeY)
{
regionID = UUID.Zero;
regionHandle = 0;
sizeX = (int)Constants.RegionSize;
sizeY = (int)Constants.RegionSize;
externalName = m_ExternalName + ((regionName != string.Empty) ? " " + regionName : "");
imageURL = string.Empty;
reason = string.Empty;
@ -199,6 +201,8 @@ namespace OpenSim.Services.HypergridService
regionID = region.RegionID;
regionHandle = region.RegionHandle;
sizeX = region.RegionSizeX;
sizeY = region.RegionSizeY;
string regionimage = "regionImage" + regionID.ToString();
regionimage = regionimage.Replace("-", "");

View File

@ -36,7 +36,7 @@ namespace OpenSim.Services.Interfaces
{
public interface IGatekeeperService
{
bool LinkRegion(string regionDescriptor, out UUID regionID, out ulong regionHandle, out string externalName, out string imageURL, out string reason);
bool LinkRegion(string regionDescriptor, out UUID regionID, out ulong regionHandle, out string externalName, out string imageURL, out string reason, out int sizeX, out int sizeY);
/// <summary>
/// Returns the region a Hypergrid visitor should enter.

View File

@ -785,7 +785,10 @@ namespace OpenSim.Services.LLLoginService
ulong handle;
string imageURL = string.Empty, reason = string.Empty;
string message;
if (m_GatekeeperConnector.LinkRegion(gatekeeper, out regionID, out handle, out domainName, out imageURL, out reason))
int sizeX = (int)Constants.RegionSize;
int sizeY = (int)Constants.RegionSize;
if (m_GatekeeperConnector.LinkRegion(gatekeeper, out regionID, out handle, out domainName, out imageURL, out reason, out sizeX, out sizeY))
{
string homeURI = null;
if (account.ServiceURLs != null && account.ServiceURLs.ContainsKey("HomeURI"))

View File

@ -397,10 +397,6 @@
;; Allow region managers to assume god powers in regions they manage
; region_manager_is_god = false
;# {parcel_owner_is_god} {} {Allow parcel owner gods} {true false} false
;; Allow parcel owners to assume god powers in their parcels
; parcel_owner_is_god = false
;# {simple_build_permissions} {} {Allow building in parcel by access list (no groups)} {true false} false
;; More control over permissions
;; This is definitely not SL!

View File

@ -473,7 +473,7 @@
;region_manager_is_god = false
; Allow parcel owners to assume god powers in their parcels
; you really may not want this...
; you really do not want this...
;parcel_owner_is_god = false
; Control user types that are allowed to create new scripts

View File

@ -31,6 +31,9 @@ ExternalHostName = SYSTEMIP
; SizeX = 512
; SizeY = 512
; * Default region landing point used when no teleport coords are specified
; DefaultLanding = <128,128,30>
; *
; * Prim data
; * This allows limiting the sizes of prims and the region prim count

View File

@ -242,6 +242,9 @@
;; Reduces DB calls if asset is requested often. Default value 0 will always update access time
;DaysBetweenAccessTimeUpdates = 30
;; Should FSAssets print read/write stats to the robust console, default is true
;ShowConsoleStats = true
;; FSAssets Custom Database Config (Leave blank to use grids default database configuration)
;StorageProvider = ""
;ConnectionString = ""

View File

@ -204,6 +204,9 @@
;; Reduces DB calls if asset is requested often. Default value 0 will always update access time
;DaysBetweenAccessTimeUpdates = 30
;; Should FSAssets print read/write stats to the robust console, default is true
;ShowConsoleStats = true
;; FSAssets Custom Database Config (Leave blank to use grids default database configuration)
;StorageProvider = ""
;ConnectionString = ""