aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region
diff options
context:
space:
mode:
authorMelanie2014-02-04 01:55:41 +0000
committerMelanie2014-02-04 01:55:41 +0000
commite1d1c279651784d7290241b8c4b416bc4c96ab3c (patch)
tree0a6f258ff2612b0faaf6aceadaa7be09b1f0386e /OpenSim/Region
parentDropping the rest of Avination's modified appearance code for core. (diff)
parentAdd "--no-objects" parameter to 'load oar'. (diff)
downloadopensim-SC_OLD-e1d1c279651784d7290241b8c4b416bc4c96ab3c.zip
opensim-SC_OLD-e1d1c279651784d7290241b8c4b416bc4c96ab3c.tar.gz
opensim-SC_OLD-e1d1c279651784d7290241b8c4b416bc4c96ab3c.tar.bz2
opensim-SC_OLD-e1d1c279651784d7290241b8c4b416bc4c96ab3c.tar.xz
Merge branch 'master' of melanie@opensimulator.org:/var/git/opensim
Diffstat (limited to 'OpenSim/Region')
-rw-r--r--OpenSim/Region/Application/OpenSim.cs18
-rw-r--r--OpenSim/Region/CoreModules/Avatar/UserProfiles/UserProfileModule.cs77
-rw-r--r--OpenSim/Region/CoreModules/Scripting/HttpRequest/ScriptsHttpRequests.cs7
-rw-r--r--OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs51
-rw-r--r--OpenSim/Region/CoreModules/World/Archiver/ArchiverModule.cs48
-rw-r--r--OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs2
-rw-r--r--OpenSim/Region/CoreModules/World/Land/LandObject.cs5
-rw-r--r--OpenSim/Region/CoreModules/World/Sun/SunModule.cs181
-rw-r--r--OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs35
-rw-r--r--OpenSim/Region/CoreModules/World/Terrain/Tests/TerrainTest.cs36
-rw-r--r--OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs2
-rw-r--r--OpenSim/Region/Framework/Interfaces/INPCModule.cs26
-rw-r--r--OpenSim/Region/Framework/Interfaces/ITerrainChannel.cs3
-rw-r--r--OpenSim/Region/Framework/Interfaces/ITerrainModule.cs2
-rw-r--r--OpenSim/Region/Framework/Scenes/TerrainChannel.cs72
-rw-r--r--OpenSim/Region/Framework/Scenes/UuidGatherer.cs17
-rw-r--r--OpenSim/Region/OptionalModules/Scripting/RegionReadyModule/RegionReadyModule.cs2
-rw-r--r--OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs15
-rw-r--r--OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs26
-rwxr-xr-xOpenSim/Region/Physics/BulletSPlugin/BSParam.cs2
-rw-r--r--OpenSim/Region/Physics/BulletSPlugin/BSScene.cs8
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs223
22 files changed, 522 insertions, 336 deletions
diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs
index 1e36853..77b9440 100644
--- a/OpenSim/Region/Application/OpenSim.cs
+++ b/OpenSim/Region/Application/OpenSim.cs
@@ -267,18 +267,20 @@ namespace OpenSim
267 267
268 m_console.Commands.AddCommand("Archiving", false, "load oar", 268 m_console.Commands.AddCommand("Archiving", false, "load oar",
269 "load oar [--merge] [--skip-assets]" 269 "load oar [--merge] [--skip-assets]"
270 + " [--forceterrain] [--forceparcels]" 270 + " [--force-terrain] [--force-parcels]"
271 + " [--rotation degrees] [--rotationCenter \"<x,y,z>\"]" 271 + " [--no-objects]"
272 + " [--rotation degrees] [--rotation-center \"<x,y,z>\"]"
272 + " [--displacement \"<x,y,z>\"]" 273 + " [--displacement \"<x,y,z>\"]"
273 + " [<OAR path>]", 274 + " [<OAR path>]",
274 "Load a region's data from an OAR archive.", 275 "Load a region's data from an OAR archive.",
275 "--merge will merge the OAR with the existing scene (suppresses terrain and parcel info loading)." + Environment.NewLine 276 "--merge will merge the OAR with the existing scene (suppresses terrain and parcel info loading)." + Environment.NewLine
276 + "--skip-assets will load the OAR but ignore the assets it contains." + Environment.NewLine 277 + "--skip-assets will load the OAR but ignore the assets it contains." + Environment.NewLine
277 + "--displacement will add this value to the position of every object loaded" + Environment.NewLine 278 + "--displacement will add this value to the position of every object loaded" + Environment.NewLine
278 + "--forceterrain forces the loading of terrain from the oar (undoes suppression done by --merge)" + Environment.NewLine 279 + "--force-terrain forces the loading of terrain from the oar (undoes suppression done by --merge)" + Environment.NewLine
279 + "--forceparcels forces the loading of parcels from the oar (undoes suppression done by --merge)" + Environment.NewLine 280 + "--force-parcels forces the loading of parcels from the oar (undoes suppression done by --merge)" + Environment.NewLine
280 + "--rotation specified rotation to be applied to the oar. Specified in degrees." + Environment.NewLine 281 + "--rotation specified rotation to be applied to the oar. Specified in degrees." + Environment.NewLine
281 + "--rotationcenter Location (relative to original OAR) to apply rotation. Default is <128,128,0>" + Environment.NewLine 282 + "--rotation-center Location (relative to original OAR) to apply rotation. Default is <128,128,0>" + Environment.NewLine
283 + "--no-objects suppresses the addition of any objects (good for loading only the terrain)" + Environment.NewLine
282 + "The path can be either a filesystem location or a URI." 284 + "The path can be either a filesystem location or a URI."
283 + " If this is not given then the command looks for an OAR named region.oar in the current directory.", 285 + " If this is not given then the command looks for an OAR named region.oar in the current directory.",
284 LoadOar); 286 LoadOar);
diff --git a/OpenSim/Region/CoreModules/Avatar/UserProfiles/UserProfileModule.cs b/OpenSim/Region/CoreModules/Avatar/UserProfiles/UserProfileModule.cs
index 7e50cc6..2da0a74 100644
--- a/OpenSim/Region/CoreModules/Avatar/UserProfiles/UserProfileModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/UserProfiles/UserProfileModule.cs
@@ -1290,9 +1290,8 @@ namespace OpenSim.Region.OptionalModules.Avatar.UserProfiles
1290 webRequest.ContentType = "application/json-rpc"; 1290 webRequest.ContentType = "application/json-rpc";
1291 webRequest.Method = "POST"; 1291 webRequest.Method = "POST";
1292 1292
1293 Stream dataStream = webRequest.GetRequestStream(); 1293 using (Stream dataStream = webRequest.GetRequestStream())
1294 dataStream.Write(content, 0, content.Length); 1294 dataStream.Write(content, 0, content.Length);
1295 dataStream.Close();
1296 1295
1297 WebResponse webResponse = null; 1296 WebResponse webResponse = null;
1298 try 1297 try
@@ -1306,26 +1305,18 @@ namespace OpenSim.Region.OptionalModules.Avatar.UserProfiles
1306 return false; 1305 return false;
1307 } 1306 }
1308 1307
1309 Stream rstream = webResponse.GetResponseStream(); 1308 using (webResponse)
1310 1309 using (Stream rstream = webResponse.GetResponseStream())
1311 OSDMap mret = new OSDMap();
1312 try
1313 {
1314 mret = (OSDMap)OSDParser.DeserializeJson(rstream);
1315 }
1316 catch (Exception e)
1317 { 1310 {
1318 m_log.DebugFormat("[PROFILES]: JsonRpcRequest Error {0} - remote user with legacy profiles?", e.Message); 1311 OSDMap mret = (OSDMap)OSDParser.DeserializeJson(rstream);
1319 return false;
1320 }
1321 1312
1313 if (mret.ContainsKey("error"))
1314 return false;
1322 1315
1323 if (mret.ContainsKey("error")) 1316 // get params...
1324 return false; 1317 OSD.DeserializeMembers(ref parameters, (OSDMap)mret["result"]);
1325 1318 return true;
1326 // get params... 1319 }
1327 OSD.DeserializeMembers(ref parameters, (OSDMap) mret["result"]);
1328 return true;
1329 } 1320 }
1330 1321
1331 /// <summary> 1322 /// <summary>
@@ -1366,9 +1357,8 @@ namespace OpenSim.Region.OptionalModules.Avatar.UserProfiles
1366 webRequest.ContentType = "application/json-rpc"; 1357 webRequest.ContentType = "application/json-rpc";
1367 webRequest.Method = "POST"; 1358 webRequest.Method = "POST";
1368 1359
1369 Stream dataStream = webRequest.GetRequestStream(); 1360 using (Stream dataStream = webRequest.GetRequestStream())
1370 dataStream.Write(content, 0, content.Length); 1361 dataStream.Write(content, 0, content.Length);
1371 dataStream.Close();
1372 1362
1373 WebResponse webResponse = null; 1363 WebResponse webResponse = null;
1374 try 1364 try
@@ -1382,29 +1372,32 @@ namespace OpenSim.Region.OptionalModules.Avatar.UserProfiles
1382 return false; 1372 return false;
1383 } 1373 }
1384 1374
1385 Stream rstream = webResponse.GetResponseStream(); 1375 using (webResponse)
1386 1376 using (Stream rstream = webResponse.GetResponseStream())
1387 OSDMap response = new OSDMap();
1388 try
1389 {
1390 response = (OSDMap)OSDParser.DeserializeJson(rstream);
1391 }
1392 catch (Exception e)
1393 { 1377 {
1394 m_log.DebugFormat("[PROFILES]: JsonRpcRequest Error {0} - remote user with legacy profiles?", e.Message); 1378 OSDMap response = new OSDMap();
1395 return false; 1379 try
1396 } 1380 {
1381 response = (OSDMap)OSDParser.DeserializeJson(rstream);
1382 }
1383 catch (Exception e)
1384 {
1385 m_log.DebugFormat("[PROFILES]: JsonRpcRequest Error {0} - remote user with legacy profiles?", e.Message);
1386 return false;
1387 }
1397 1388
1398 if(response.ContainsKey("error")) 1389 if (response.ContainsKey("error"))
1399 { 1390 {
1400 data = response["error"]; 1391 data = response["error"];
1401 return false; 1392 return false;
1402 } 1393 }
1403 1394
1404 data = response; 1395 data = response;
1405 1396
1406 return true; 1397 return true;
1398 }
1407 } 1399 }
1400
1408 #endregion Web Util 1401 #endregion Web Util
1409 } 1402 }
1410} \ No newline at end of file 1403}
diff --git a/OpenSim/Region/CoreModules/Scripting/HttpRequest/ScriptsHttpRequests.cs b/OpenSim/Region/CoreModules/Scripting/HttpRequest/ScriptsHttpRequests.cs
index c3a8afd..a7237ea 100644
--- a/OpenSim/Region/CoreModules/Scripting/HttpRequest/ScriptsHttpRequests.cs
+++ b/OpenSim/Region/CoreModules/Scripting/HttpRequest/ScriptsHttpRequests.cs
@@ -488,9 +488,8 @@ namespace OpenSim.Region.CoreModules.Scripting.HttpRequest
488 byte[] data = Util.UTF8.GetBytes(OutboundBody); 488 byte[] data = Util.UTF8.GetBytes(OutboundBody);
489 489
490 Request.ContentLength = data.Length; 490 Request.ContentLength = data.Length;
491 Stream bstream = Request.GetRequestStream(); 491 using (Stream bstream = Request.GetRequestStream())
492 bstream.Write(data, 0, data.Length); 492 bstream.Write(data, 0, data.Length);
493 bstream.Close();
494 } 493 }
495 494
496 try 495 try
@@ -584,4 +583,4 @@ namespace OpenSim.Region.CoreModules.Scripting.HttpRequest
584 Request.Abort(); 583 Request.Abort();
585 } 584 }
586 } 585 }
587} \ No newline at end of file 586}
diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs
index f4807ad..0c4b79b 100644
--- a/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs
+++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs
@@ -121,7 +121,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver
121 protected Vector3 m_displacement = Vector3.Zero; 121 protected Vector3 m_displacement = Vector3.Zero;
122 122
123 /// <value> 123 /// <value>
124 /// Rotation to apply to the objects as they are loaded. 124 /// Rotation (in radians) to apply to the objects as they are loaded.
125 /// </value> 125 /// </value>
126 protected float m_rotation = 0f; 126 protected float m_rotation = 0f;
127 127
@@ -130,6 +130,8 @@ namespace OpenSim.Region.CoreModules.World.Archiver
130 /// </value> 130 /// </value>
131 protected Vector3 m_rotationCenter = new Vector3(Constants.RegionSize / 2f, Constants.RegionSize / 2f, 0f); 131 protected Vector3 m_rotationCenter = new Vector3(Constants.RegionSize / 2f, Constants.RegionSize / 2f, 0f);
132 132
133 protected bool m_noObjects = false;
134
133 /// <summary> 135 /// <summary>
134 /// Used to cache lookups for valid uuids. 136 /// Used to cache lookups for valid uuids.
135 /// </summary> 137 /// </summary>
@@ -177,14 +179,15 @@ namespace OpenSim.Region.CoreModules.World.Archiver
177 179
178 m_errorMessage = String.Empty; 180 m_errorMessage = String.Empty;
179 m_merge = options.ContainsKey("merge"); 181 m_merge = options.ContainsKey("merge");
180 m_forceTerrain = options.ContainsKey("forceTerrain"); 182 m_forceTerrain = options.ContainsKey("force-terrain");
181 m_forceParcels = options.ContainsKey("forceParcels"); 183 m_forceParcels = options.ContainsKey("force-parcels");
184 m_noObjects = options.ContainsKey("no-objects");
182 m_skipAssets = options.ContainsKey("skipAssets"); 185 m_skipAssets = options.ContainsKey("skipAssets");
183 m_requestId = requestId; 186 m_requestId = requestId;
184 m_displacement = options.ContainsKey("displacement") ? (Vector3)options["displacement"] : Vector3.Zero; 187 m_displacement = options.ContainsKey("displacement") ? (Vector3)options["displacement"] : Vector3.Zero;
185 m_rotation = options.ContainsKey("rotation") ? (float)options["rotation"] : 0f; 188 m_rotation = options.ContainsKey("rotation") ? (float)options["rotation"] : 0f;
186 m_rotationCenter = options.ContainsKey("rotationCenter") ? (Vector3)options["rotationCenter"] 189 m_rotationCenter = options.ContainsKey("rotation-center") ? (Vector3)options["rotation-center"]
187 : new Vector3(Constants.RegionSize / 2f, Constants.RegionSize / 2f, 0f); 190 : new Vector3(scene.RegionInfo.RegionSizeX / 2f, scene.RegionInfo.RegionSizeY / 2f, 0f);
188 191
189 // Zero can never be a valid user id 192 // Zero can never be a valid user id
190 m_validUserUuids[UUID.Zero] = false; 193 m_validUserUuids[UUID.Zero] = false;
@@ -261,7 +264,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver
261 264
262 // Process the file 265 // Process the file
263 266
264 if (filePath.StartsWith(ArchiveConstants.OBJECTS_PATH)) 267 if (filePath.StartsWith(ArchiveConstants.OBJECTS_PATH) && !m_noObjects)
265 { 268 {
266 sceneContext.SerialisedSceneObjects.Add(Encoding.UTF8.GetString(data)); 269 sceneContext.SerialisedSceneObjects.Add(Encoding.UTF8.GetString(data));
267 } 270 }
@@ -454,8 +457,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver
454 // Reload serialized prims 457 // Reload serialized prims
455 m_log.InfoFormat("[ARCHIVER]: Loading {0} scene objects. Please wait.", serialisedSceneObjects.Count); 458 m_log.InfoFormat("[ARCHIVER]: Loading {0} scene objects. Please wait.", serialisedSceneObjects.Count);
456 459
457 float angle = (float)(m_rotation / 180.0 * Math.PI); 460 OpenMetaverse.Quaternion rot = OpenMetaverse.Quaternion.CreateFromAxisAngle(0, 0, 1, m_rotation);
458 OpenMetaverse.Quaternion rot = OpenMetaverse.Quaternion.CreateFromAxisAngle(0, 0, 1, angle);
459 461
460 UUID oldTelehubUUID = scene.RegionInfo.RegionSettings.TelehubObject; 462 UUID oldTelehubUUID = scene.RegionInfo.RegionSettings.TelehubObject;
461 463
@@ -483,16 +485,25 @@ namespace OpenSim.Region.CoreModules.World.Archiver
483 // Happily this does not do much to the object since it hasn't been added to the scene yet 485 // Happily this does not do much to the object since it hasn't been added to the scene yet
484 if (sceneObject.AttachmentPoint == 0) 486 if (sceneObject.AttachmentPoint == 0)
485 { 487 {
486 if (angle != 0f) 488 if (m_displacement != Vector3.Zero || m_rotation != 0f)
487 {
488 sceneObject.RootPart.RotationOffset = rot * sceneObject.GroupRotation;
489 Vector3 offset = sceneObject.AbsolutePosition - m_rotationCenter;
490 offset *= rot;
491 sceneObject.AbsolutePosition = m_rotationCenter + offset;
492 }
493 if (m_displacement != Vector3.Zero)
494 { 489 {
495 sceneObject.AbsolutePosition += m_displacement; 490 Vector3 pos = sceneObject.AbsolutePosition;
491 if (m_rotation != 0f)
492 {
493 // Rotate the object
494 sceneObject.RootPart.RotationOffset = rot * sceneObject.GroupRotation;
495 // Get object position relative to rotation axis
496 Vector3 offset = pos - m_rotationCenter;
497 // Rotate the object position
498 offset *= rot;
499 // Restore the object position back to relative to the region
500 pos = m_rotationCenter + offset;
501 }
502 if (m_displacement != Vector3.Zero)
503 {
504 pos += m_displacement;
505 }
506 sceneObject.AbsolutePosition = pos;
496 } 507 }
497 } 508 }
498 509
@@ -868,10 +879,10 @@ namespace OpenSim.Region.CoreModules.World.Archiver
868 ITerrainModule terrainModule = scene.RequestModuleInterface<ITerrainModule>(); 879 ITerrainModule terrainModule = scene.RequestModuleInterface<ITerrainModule>();
869 880
870 MemoryStream ms = new MemoryStream(data); 881 MemoryStream ms = new MemoryStream(data);
871 if (m_displacement != Vector3.Zero) 882 if (m_displacement != Vector3.Zero || m_rotation != 0f)
872 { 883 {
873 Vector2 terrainDisplacement = new Vector2(m_displacement.X, m_displacement.Y); 884 Vector2 rotationCenter = new Vector2(m_rotationCenter.X, m_rotationCenter.Y);
874 terrainModule.LoadFromStream(terrainPath, terrainDisplacement, ms); 885 terrainModule.LoadFromStream(terrainPath, m_displacement, m_rotation, rotationCenter, ms);
875 } 886 }
876 else 887 else
877 { 888 {
diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiverModule.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiverModule.cs
index 2a6f1eb..2b2da6f 100644
--- a/OpenSim/Region/CoreModules/World/Archiver/ArchiverModule.cs
+++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiverModule.cs
@@ -106,6 +106,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver
106 bool skipAssets = false; 106 bool skipAssets = false;
107 bool forceTerrain = false; 107 bool forceTerrain = false;
108 bool forceParcels = false; 108 bool forceParcels = false;
109 bool noObjects = false;
109 Vector3 displacement = new Vector3(0f, 0f, 0f); 110 Vector3 displacement = new Vector3(0f, 0f, 0f);
110 float rotation = 0f; 111 float rotation = 0f;
111 Vector3 rotationCenter = new Vector3(Constants.RegionSize / 2f, Constants.RegionSize / 2f, 0); 112 Vector3 rotationCenter = new Vector3(Constants.RegionSize / 2f, Constants.RegionSize / 2f, 0);
@@ -113,26 +114,48 @@ namespace OpenSim.Region.CoreModules.World.Archiver
113 OptionSet options = new OptionSet(); 114 OptionSet options = new OptionSet();
114 options.Add("m|merge", delegate (string v) { mergeOar = (v != null); }); 115 options.Add("m|merge", delegate (string v) { mergeOar = (v != null); });
115 options.Add("s|skip-assets", delegate (string v) { skipAssets = (v != null); }); 116 options.Add("s|skip-assets", delegate (string v) { skipAssets = (v != null); });
116 options.Add("forceterrain", delegate (string v) { forceTerrain = (v != null); }); 117 options.Add("force-terrain", delegate (string v) { forceTerrain = (v != null); });
117 options.Add("forceparcels", delegate (string v) { forceParcels = (v != null); }); 118 options.Add("forceterrain", delegate (string v) { forceTerrain = (v != null); }); // downward compatibility
119 options.Add("force-parcels", delegate (string v) { forceParcels = (v != null); });
120 options.Add("forceparcels", delegate (string v) { forceParcels = (v != null); }); // downward compatibility
121 options.Add("no-objects", delegate (string v) { noObjects = (v != null); });
118 options.Add("displacement=", delegate (string v) { 122 options.Add("displacement=", delegate (string v) {
119 try 123 try
120 { 124 {
121 displacement = v == null ? Vector3.Zero : Vector3.Parse(v); 125 displacement = v == null ? Vector3.Zero : Vector3.Parse(v);
122 } 126 }
123 catch (Exception e) 127 catch
124 { 128 {
125 m_log.ErrorFormat("[ARCHIVER MODULE] failure parsing displacement"); 129 m_log.ErrorFormat("[ARCHIVER MODULE] failure parsing displacement");
126 displacement = new Vector3(0f, 0f, 0f); 130 m_log.ErrorFormat("[ARCHIVER MODULE] Must be represented as vector3: --displacement \"<128,128,0>\"");
131 return;
127 } 132 }
128 }); 133 });
129 options.Add("rotation=", delegate (string v) { 134 options.Add("rotation=", delegate (string v) {
130 rotation = float.Parse(v); 135 try
131 rotation = Util.Clamp<float>(rotation, -359f, 359f); 136 {
137 rotation = v == null ? 0f : float.Parse(v);
138 }
139 catch
140 {
141 m_log.ErrorFormat("[ARCHIVER MODULE] failure parsing rotation");
142 m_log.ErrorFormat("[ARCHIVER MODULE] Must be an angle in degrees between -360 and +360: --rotation 45");
143 return;
144 }
145 // Convert to radians for internals
146 rotation = Util.Clamp<float>(rotation, -359f, 359f) / 180f * (float)Math.PI;
132 }); 147 });
133 options.Add("rotationcenter=", delegate (string v) { 148 options.Add("rotation-center=", delegate (string v) {
134 // RA 20130119: libomv's Vector2.Parse doesn't work. Need to use vector3 for the moment 149 try
135 rotationCenter = Vector3.Parse(v); 150 {
151 rotationCenter = v == null ? Vector3.Zero : Vector3.Parse(v);
152 }
153 catch
154 {
155 m_log.ErrorFormat("[ARCHIVER MODULE] failure parsing rotation displacement");
156 m_log.ErrorFormat("[ARCHIVER MODULE] Must be represented as vector3: --rotation-center \"<128,128,0>\"");
157 return;
158 }
136 }); 159 });
137 160
138 // Send a message to the region ready module 161 // Send a message to the region ready module
@@ -155,11 +178,12 @@ namespace OpenSim.Region.CoreModules.World.Archiver
155 Dictionary<string, object> archiveOptions = new Dictionary<string, object>(); 178 Dictionary<string, object> archiveOptions = new Dictionary<string, object>();
156 if (mergeOar) archiveOptions.Add("merge", null); 179 if (mergeOar) archiveOptions.Add("merge", null);
157 if (skipAssets) archiveOptions.Add("skipAssets", null); 180 if (skipAssets) archiveOptions.Add("skipAssets", null);
158 if (forceTerrain) archiveOptions.Add("forceTerrain", null); 181 if (forceTerrain) archiveOptions.Add("force-terrain", null);
159 if (forceParcels) archiveOptions.Add("forceParcels", null); 182 if (forceParcels) archiveOptions.Add("force-parcels", null);
183 if (noObjects) archiveOptions.Add("no-objects", null);
160 archiveOptions.Add("displacement", displacement); 184 archiveOptions.Add("displacement", displacement);
161 archiveOptions.Add("rotation", rotation); 185 archiveOptions.Add("rotation", rotation);
162 archiveOptions.Add("rotationCenter", rotationCenter); 186 archiveOptions.Add("rotation-center", rotationCenter);
163 187
164 if (mainParams.Count > 2) 188 if (mainParams.Count > 2)
165 { 189 {
diff --git a/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs b/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs
index 53f41f9..e08a42d 100644
--- a/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs
+++ b/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs
@@ -579,7 +579,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver.Tests
579 ArchiveConstants.CONTROL_FILE_PATH, 579 ArchiveConstants.CONTROL_FILE_PATH,
580 new ArchiveWriteRequest(m_scene, (Stream)null, Guid.Empty).CreateControlFile(new ArchiveScenesGroup())); 580 new ArchiveWriteRequest(m_scene, (Stream)null, Guid.Empty).CreateControlFile(new ArchiveScenesGroup()));
581 581
582 LandObject lo = new LandObject(groupID, true, null); 582 LandObject lo = new LandObject(groupID, true, m_scene);
583 lo.SetLandBitmap(lo.BasicFullRegionLandBitmap()); 583 lo.SetLandBitmap(lo.BasicFullRegionLandBitmap());
584 LandData ld = lo.LandData; 584 LandData ld = lo.LandData;
585 ld.GlobalID = landID; 585 ld.GlobalID = landID;
diff --git a/OpenSim/Region/CoreModules/World/Land/LandObject.cs b/OpenSim/Region/CoreModules/World/Land/LandObject.cs
index f8f4986..939512f 100644
--- a/OpenSim/Region/CoreModules/World/Land/LandObject.cs
+++ b/OpenSim/Region/CoreModules/World/Land/LandObject.cs
@@ -134,7 +134,10 @@ namespace OpenSim.Region.CoreModules.World.Land
134 public LandObject(UUID owner_id, bool is_group_owned, Scene scene) 134 public LandObject(UUID owner_id, bool is_group_owned, Scene scene)
135 { 135 {
136 m_scene = scene; 136 m_scene = scene;
137 m_landBitmap = new bool[m_scene.RegionInfo.RegionSizeX / landUnit, m_scene.RegionInfo.RegionSizeY / landUnit]; 137 if (m_scene == null)
138 m_landBitmap = new bool[Constants.RegionSize / landUnit, Constants.RegionSize / landUnit];
139 else
140 m_landBitmap = new bool[m_scene.RegionInfo.RegionSizeX / landUnit, m_scene.RegionInfo.RegionSizeY / landUnit];
138 141
139 LandData.OwnerID = owner_id; 142 LandData.OwnerID = owner_id;
140 if (is_group_owned) 143 if (is_group_owned)
diff --git a/OpenSim/Region/CoreModules/World/Sun/SunModule.cs b/OpenSim/Region/CoreModules/World/Sun/SunModule.cs
index 6f344c8..561552a 100644
--- a/OpenSim/Region/CoreModules/World/Sun/SunModule.cs
+++ b/OpenSim/Region/CoreModules/World/Sun/SunModule.cs
@@ -68,9 +68,6 @@ namespace OpenSim.Region.CoreModules
68 // updating those region settings in GenSunPos() 68 // updating those region settings in GenSunPos()
69 private bool receivedEstateToolsSunUpdate = false; 69 private bool receivedEstateToolsSunUpdate = false;
70 70
71 // Configurable values
72 private string m_RegionMode = "SL";
73
74 // Sun's position information is updated and sent to clients every m_UpdateInterval frames 71 // Sun's position information is updated and sent to clients every m_UpdateInterval frames
75 private int m_UpdateInterval = 0; 72 private int m_UpdateInterval = 0;
76 73
@@ -90,7 +87,6 @@ namespace OpenSim.Region.CoreModules
90 // private double m_longitude = 0; 87 // private double m_longitude = 0;
91 // private double m_latitude = 0; 88 // private double m_latitude = 0;
92 // Configurable defaults Defaults close to SL 89 // Configurable defaults Defaults close to SL
93 private string d_mode = "SL";
94 private int d_frame_mod = 100; // Every 10 seconds (actually less) 90 private int d_frame_mod = 100; // Every 10 seconds (actually less)
95 private double d_day_length = 4; // A VW day is 4 RW hours long 91 private double d_day_length = 4; // A VW day is 4 RW hours long
96 private int d_year_length = 60; // There are 60 VW days in a VW year 92 private int d_year_length = 60; // There are 60 VW days in a VW year
@@ -134,12 +130,15 @@ namespace OpenSim.Region.CoreModules
134 130
135 private const int TICKS_PER_SECOND = 10000000; 131 private const int TICKS_PER_SECOND = 10000000;
136 132
133 private ulong m_CurrentTimeOffset = 0;
134
137 // Current time in elapsed seconds since Jan 1st 1970 135 // Current time in elapsed seconds since Jan 1st 1970
138 private ulong CurrentTime 136 private ulong CurrentTime
139 { 137 {
140 get 138 get
141 { 139 {
142 return (ulong)(((DateTime.Now.Ticks) - TicksToEpoch + TicksUTCOffset) / TICKS_PER_SECOND); 140 ulong ctime = (ulong)(((DateTime.Now.Ticks) - TicksToEpoch + TicksUTCOffset) / TICKS_PER_SECOND);
141 return ctime + m_CurrentTimeOffset;
143 } 142 }
144 } 143 }
145 144
@@ -262,10 +261,8 @@ namespace OpenSim.Region.CoreModules
262 261
263 private float GetCurrentTimeAsLindenSunHour() 262 private float GetCurrentTimeAsLindenSunHour()
264 { 263 {
265 if (m_SunFixed) 264 float curtime = m_SunFixed ? m_SunFixedHour : GetCurrentSunHour();
266 return m_SunFixedHour + 6; 265 return (curtime + 6.0f) % 24.0f;
267
268 return GetCurrentSunHour() + 6.0f;
269 } 266 }
270 267
271 #region INonSharedRegion Methods 268 #region INonSharedRegion Methods
@@ -291,8 +288,6 @@ namespace OpenSim.Region.CoreModules
291 try 288 try
292 { 289 {
293 // Mode: determines how the sun is handled 290 // Mode: determines how the sun is handled
294 m_RegionMode = config.Configs["Sun"].GetString("mode", d_mode);
295 // Mode: determines how the sun is handled
296 // m_latitude = config.Configs["Sun"].GetDouble("latitude", d_latitude); 291 // m_latitude = config.Configs["Sun"].GetDouble("latitude", d_latitude);
297 // Mode: determines how the sun is handled 292 // Mode: determines how the sun is handled
298 // m_longitude = config.Configs["Sun"].GetDouble("longitude", d_longitude); 293 // m_longitude = config.Configs["Sun"].GetDouble("longitude", d_longitude);
@@ -314,7 +309,6 @@ namespace OpenSim.Region.CoreModules
314 catch (Exception e) 309 catch (Exception e)
315 { 310 {
316 m_log.Debug("[SUN]: Configuration access failed, using defaults. Reason: " + e.Message); 311 m_log.Debug("[SUN]: Configuration access failed, using defaults. Reason: " + e.Message);
317 m_RegionMode = d_mode;
318 m_YearLengthDays = d_year_length; 312 m_YearLengthDays = d_year_length;
319 m_DayLengthHours = d_day_length; 313 m_DayLengthHours = d_day_length;
320 m_HorizonShift = d_day_night; 314 m_HorizonShift = d_day_night;
@@ -325,40 +319,28 @@ namespace OpenSim.Region.CoreModules
325 // m_longitude = d_longitude; 319 // m_longitude = d_longitude;
326 } 320 }
327 321
328 switch (m_RegionMode) 322 SecondsPerSunCycle = (uint) (m_DayLengthHours * 60 * 60);
329 { 323 SecondsPerYear = (uint) (SecondsPerSunCycle*m_YearLengthDays);
330 case "T1":
331 default:
332 case "SL":
333 // Time taken to complete a cycle (day and season)
334
335 SecondsPerSunCycle = (uint) (m_DayLengthHours * 60 * 60);
336 SecondsPerYear = (uint) (SecondsPerSunCycle*m_YearLengthDays);
337 324
338 // Ration of real-to-virtual time 325 // Ration of real-to-virtual time
339 326
340 // VWTimeRatio = 24/m_day_length; 327 // VWTimeRatio = 24/m_day_length;
341 328
342 // Speed of rotation needed to complete a cycle in the 329 // Speed of rotation needed to complete a cycle in the
343 // designated period (day and season) 330 // designated period (day and season)
344 331
345 SunSpeed = m_SunCycle/SecondsPerSunCycle; 332 SunSpeed = m_SunCycle/SecondsPerSunCycle;
346 SeasonSpeed = m_SeasonalCycle/SecondsPerYear; 333 SeasonSpeed = m_SeasonalCycle/SecondsPerYear;
347 334
348 // Horizon translation 335 // Horizon translation
349 336
350 HorizonShift = m_HorizonShift; // Z axis translation 337 HorizonShift = m_HorizonShift; // Z axis translation
351 // HoursToRadians = (SunCycle/24)*VWTimeRatio; 338 // HoursToRadians = (SunCycle/24)*VWTimeRatio;
352
353 m_log.Debug("[SUN]: Mode is " + m_RegionMode);
354 m_log.Debug("[SUN]: Initialization completed. Day is " + SecondsPerSunCycle + " seconds, and year is " + m_YearLengthDays + " days");
355 m_log.Debug("[SUN]: Axis offset is " + m_HorizonShift);
356 m_log.Debug("[SUN]: Percentage of time for daylight " + m_DayTimeSunHourScale);
357 m_log.Debug("[SUN]: Positional data updated every " + m_UpdateInterval + " frames");
358
359 break;
360 }
361 339
340 m_log.Debug("[SUN]: Initialization completed. Day is " + SecondsPerSunCycle + " seconds, and year is " + m_YearLengthDays + " days");
341 m_log.Debug("[SUN]: Axis offset is " + m_HorizonShift);
342 m_log.Debug("[SUN]: Percentage of time for daylight " + m_DayTimeSunHourScale);
343 m_log.Debug("[SUN]: Positional data updated every " + m_UpdateInterval + " frames");
362 } 344 }
363 345
364 public Type ReplaceableInterface 346 public Type ReplaceableInterface
@@ -385,7 +367,8 @@ namespace OpenSim.Region.CoreModules
385 string sunCommand = string.Format("sun {0}", kvp.Key); 367 string sunCommand = string.Format("sun {0}", kvp.Key);
386 m_scene.AddCommand("Regions", this, sunCommand, string.Format("{0} [<value>]", sunCommand), kvp.Value, "", HandleSunConsoleCommand); 368 m_scene.AddCommand("Regions", this, sunCommand, string.Format("{0} [<value>]", sunCommand), kvp.Value, "", HandleSunConsoleCommand);
387 } 369 }
388 370 m_scene.AddCommand("Regions", this, "sun help", "sun help", "list parameters that can be changed", "", HandleSunConsoleCommand);
371 m_scene.AddCommand("Regions", this, "sun list", "sun list", "list parameters that can be changed", "", HandleSunConsoleCommand);
389 ready = true; 372 ready = true;
390 } 373 }
391 374
@@ -419,23 +402,22 @@ namespace OpenSim.Region.CoreModules
419 402
420 public void SunToClient(IClientAPI client) 403 public void SunToClient(IClientAPI client)
421 { 404 {
422 if (m_RegionMode != "T1") 405 if (ready)
423 { 406 {
424 if (ready) 407 if (m_SunFixed)
425 { 408 {
426 if (m_SunFixed) 409 // m_log.DebugFormat("[SUN]: Fixed SunHour {0}, Position {1}, PosTime {2}, OrbitalPosition : {3} ",
427 { 410 // m_SunFixedHour, Position.ToString(), PosTime.ToString(), OrbitalPosition.ToString());
428 // m_log.DebugFormat("[SUN]: SunHour {0}, Position {1}, PosTime {2}, OrbitalPosition : {3} ", m_SunFixedHour, Position.ToString(), PosTime.ToString(), OrbitalPosition.ToString()); 411 client.SendSunPos(Position, Velocity, PosTime, SecondsPerSunCycle, SecondsPerYear, OrbitalPosition);
429 client.SendSunPos(Position, Velocity, PosTime, SecondsPerSunCycle, SecondsPerYear, OrbitalPosition); 412 }
430 } 413 else
431 else 414 {
432 { 415 // m_log.DebugFormat("[SUN]: SunHour {0}, Position {1}, PosTime {2}, OrbitalPosition : {3} ",
433 // m_log.DebugFormat("[SUN]: SunHour {0}, Position {1}, PosTime {2}, OrbitalPosition : {3} ", m_SunFixedHour, Position.ToString(), PosTime.ToString(), OrbitalPosition.ToString()); 416 // m_SunFixedHour, Position.ToString(), PosTime.ToString(), OrbitalPosition.ToString());
434 client.SendSunPos(Position, Velocity, CurrentTime, SecondsPerSunCycle, SecondsPerYear, OrbitalPosition); 417 client.SendSunPos(Position, Velocity, CurrentTime, SecondsPerSunCycle, SecondsPerYear, OrbitalPosition);
435 }
436 } 418 }
437 } 419 }
438 } 420 }
439 421
440 public void SunUpdate() 422 public void SunUpdate()
441 { 423 {
@@ -532,6 +514,9 @@ namespace OpenSim.Region.CoreModules
532 case "update_interval": 514 case "update_interval":
533 return m_UpdateInterval; 515 return m_UpdateInterval;
534 516
517 case "current_time":
518 return GetCurrentTimeAsLindenSunHour();
519
535 default: 520 default:
536 throw new Exception("Unknown sun parameter."); 521 throw new Exception("Unknown sun parameter.");
537 } 522 }
@@ -539,7 +524,51 @@ namespace OpenSim.Region.CoreModules
539 524
540 public void SetSunParameter(string param, double value) 525 public void SetSunParameter(string param, double value)
541 { 526 {
542 HandleSunConsoleCommand("sun", new string[] {param, value.ToString() }); 527 switch (param)
528 {
529 case "year_length":
530 m_YearLengthDays = (int)value;
531 SecondsPerYear = (uint) (SecondsPerSunCycle*m_YearLengthDays);
532 SeasonSpeed = m_SeasonalCycle/SecondsPerYear;
533 break;
534
535 case "day_length":
536 m_DayLengthHours = value;
537 SecondsPerSunCycle = (uint) (m_DayLengthHours * 60 * 60);
538 SecondsPerYear = (uint) (SecondsPerSunCycle*m_YearLengthDays);
539 SunSpeed = m_SunCycle/SecondsPerSunCycle;
540 SeasonSpeed = m_SeasonalCycle/SecondsPerYear;
541 break;
542
543 case "day_night_offset":
544 m_HorizonShift = value;
545 HorizonShift = m_HorizonShift;
546 break;
547
548 case "day_time_sun_hour_scale":
549 m_DayTimeSunHourScale = value;
550 break;
551
552 case "update_interval":
553 m_UpdateInterval = (int)value;
554 break;
555
556 case "current_time":
557 value = (value + 18.0) % 24.0;
558 // set the current offset so that the effective sun time is the parameter
559 m_CurrentTimeOffset = 0; // clear this first so we use raw time
560 m_CurrentTimeOffset = (ulong)(SecondsPerSunCycle * value/ 24.0) - (CurrentTime % SecondsPerSunCycle);
561 break;
562
563 default:
564 throw new Exception("Unknown sun parameter.");
565
566 // Generate shared values
567 GenSunPos();
568
569 // When sun settings are updated, we should update all clients with new settings.
570 SunUpdateToAllClients();
571 }
543 } 572 }
544 573
545 public float GetCurrentSunHour() 574 public float GetCurrentSunHour()
@@ -572,7 +601,7 @@ namespace OpenSim.Region.CoreModules
572 601
573 foreach (string output in ParseCmdParams(cmdparams)) 602 foreach (string output in ParseCmdParams(cmdparams))
574 { 603 {
575 m_log.Info("[SUN] " + output); 604 MainConsole.Instance.Output(output);
576 } 605 }
577 } 606 }
578 607
@@ -581,10 +610,11 @@ namespace OpenSim.Region.CoreModules
581 Dictionary<string, string> Params = new Dictionary<string, string>(); 610 Dictionary<string, string> Params = new Dictionary<string, string>();
582 611
583 Params.Add("year_length", "number of days to a year"); 612 Params.Add("year_length", "number of days to a year");
584 Params.Add("day_length", "number of seconds to a day"); 613 Params.Add("day_length", "number of hours to a day");
585 Params.Add("day_night_offset", "induces a horizon shift"); 614 Params.Add("day_night_offset", "induces a horizon shift");
586 Params.Add("update_interval", "how often to update the sun's position in frames"); 615 Params.Add("update_interval", "how often to update the sun's position in frames");
587 Params.Add("day_time_sun_hour_scale", "scales day light vs nite hours to change day/night ratio"); 616 Params.Add("day_time_sun_hour_scale", "scales day light vs nite hours to change day/night ratio");
617 Params.Add("current_time", "time in seconds of the simulator");
588 618
589 return Params; 619 return Params;
590 } 620 }
@@ -618,46 +648,15 @@ namespace OpenSim.Region.CoreModules
618 } 648 }
619 else if (args.Length == 3) 649 else if (args.Length == 3)
620 { 650 {
621 float value = 0.0f; 651 double value = 0.0;
622 if (!float.TryParse(args[2], out value)) 652 if (! double.TryParse(args[2], out value))
623 { 653 {
624 Output.Add(String.Format("The parameter value {0} is not a valid number.", args[2])); 654 Output.Add(String.Format("The parameter value {0} is not a valid number.", args[2]));
655 return Output;
625 } 656 }
626 657
627 switch (args[1].ToLower()) 658 SetSunParameter(args[1].ToLower(), value);
628 {
629 case "year_length":
630 m_YearLengthDays = (int)value;
631 break;
632
633 case "day_length":
634 m_DayLengthHours = value;
635 break;
636
637 case "day_night_offset":
638 m_HorizonShift = value;
639 break;
640
641 case "day_time_sun_hour_scale":
642 m_DayTimeSunHourScale = value;
643 break;
644
645 case "update_interval":
646 m_UpdateInterval = (int)value;
647 break;
648
649 default:
650 Output.Add(String.Format("Unknown parameter {0}.", args[1]));
651 return Output;
652 }
653
654 Output.Add(String.Format("Parameter {0} set to {1}.", args[1], value.ToString())); 659 Output.Add(String.Format("Parameter {0} set to {1}.", args[1], value.ToString()));
655
656 // Generate shared values
657 GenSunPos();
658
659 // When sun settings are updated, we should update all clients with new settings.
660 SunUpdateToAllClients();
661 } 660 }
662 661
663 return Output; 662 return Output;
diff --git a/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs b/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs
index 7bc5e88..08891d9 100644
--- a/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs
+++ b/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs
@@ -316,8 +316,7 @@ namespace OpenSim.Region.CoreModules.World.Terrain
316 316
317 public void LoadFromStream(string filename, Stream stream) 317 public void LoadFromStream(string filename, Stream stream)
318 { 318 {
319 Vector2 defaultDisplacement = new Vector2(0f, 0f); 319 LoadFromStream(filename, Vector3.Zero, 0f, Vector2.Zero, stream);
320 LoadFromStream(filename, defaultDisplacement, stream);
321 } 320 }
322 321
323 /// <summary> 322 /// <summary>
@@ -325,7 +324,8 @@ namespace OpenSim.Region.CoreModules.World.Terrain
325 /// </summary> 324 /// </summary>
326 /// <param name="filename">Filename to terrain file. Type is determined by extension.</param> 325 /// <param name="filename">Filename to terrain file. Type is determined by extension.</param>
327 /// <param name="stream"></param> 326 /// <param name="stream"></param>
328 public void LoadFromStream(string filename, Vector2 displacement, Stream stream) 327 public void LoadFromStream(string filename, Vector3 displacement,
328 float radianRotation, Vector2 rotationDisplacement, Stream stream)
329 { 329 {
330 foreach (KeyValuePair<string, ITerrainLoader> loader in m_loaders) 330 foreach (KeyValuePair<string, ITerrainLoader> loader in m_loaders)
331 { 331 {
@@ -336,7 +336,7 @@ namespace OpenSim.Region.CoreModules.World.Terrain
336 try 336 try
337 { 337 {
338 ITerrainChannel channel = loader.Value.LoadStream(stream); 338 ITerrainChannel channel = loader.Value.LoadStream(stream);
339 MergeTerrainIntoExisting(channel, displacement); 339 m_channel.Merge(channel, displacement, radianRotation, rotationDisplacement);
340 UpdateRevertMap(); 340 UpdateRevertMap();
341 } 341 }
342 catch (NotImplementedException) 342 catch (NotImplementedException)
@@ -356,33 +356,6 @@ namespace OpenSim.Region.CoreModules.World.Terrain
356 throw new TerrainException(String.Format("unable to load heightmap from file {0}: no loader available for that format", filename)); 356 throw new TerrainException(String.Format("unable to load heightmap from file {0}: no loader available for that format", filename));
357 } 357 }
358 358
359 private void MergeTerrainIntoExisting(ITerrainChannel channel, Vector2 displacement)
360 {
361 if (displacement == Vector2.Zero)
362 {
363 // If there is no displacement, just use this channel as the new heightmap
364 m_scene.Heightmap = channel;
365 m_channel = channel;
366 }
367 else
368 {
369 // If there is a displacement, we copy the loaded heightmap into the overall region
370 for (int xx = 0; xx < channel.Width; xx++)
371 {
372 for (int yy = 0; yy < channel.Height; yy++)
373 {
374 int dispX = xx + (int)displacement.X;
375 int dispY = yy + (int)displacement.Y;
376 if (dispX >= 0 && dispX < m_channel.Width
377 && dispY >= 0 && dispY < m_channel.Height)
378 {
379 m_channel[dispX, dispY] = channel[xx, yy];
380 }
381 }
382 }
383 }
384 }
385
386 private static Stream URIFetch(Uri uri) 359 private static Stream URIFetch(Uri uri)
387 { 360 {
388 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri); 361 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
diff --git a/OpenSim/Region/CoreModules/World/Terrain/Tests/TerrainTest.cs b/OpenSim/Region/CoreModules/World/Terrain/Tests/TerrainTest.cs
index be719ea..96c16a9 100644
--- a/OpenSim/Region/CoreModules/World/Terrain/Tests/TerrainTest.cs
+++ b/OpenSim/Region/CoreModules/World/Terrain/Tests/TerrainTest.cs
@@ -40,10 +40,13 @@ namespace OpenSim.Region.CoreModules.World.Terrain.Tests
40 [Test] 40 [Test]
41 public void BrushTest() 41 public void BrushTest()
42 { 42 {
43 int midRegion = (int)Constants.RegionSize / 2;
44
45 // Create a mask that covers only the left half of the region
43 bool[,] allowMask = new bool[(int)Constants.RegionSize, 256]; 46 bool[,] allowMask = new bool[(int)Constants.RegionSize, 256];
44 int x; 47 int x;
45 int y; 48 int y;
46 for (x = 0; x < (int)((int)Constants.RegionSize * 0.5f); x++) 49 for (x = 0; x < midRegion; x++)
47 { 50 {
48 for (y = 0; y < (int)Constants.RegionSize; y++) 51 for (y = 0; y < (int)Constants.RegionSize; y++)
49 { 52 {
@@ -57,13 +60,12 @@ namespace OpenSim.Region.CoreModules.World.Terrain.Tests
57 TerrainChannel map = new TerrainChannel((int)Constants.RegionSize, (int)Constants.RegionSize); 60 TerrainChannel map = new TerrainChannel((int)Constants.RegionSize, (int)Constants.RegionSize);
58 ITerrainPaintableEffect effect = new RaiseSphere(); 61 ITerrainPaintableEffect effect = new RaiseSphere();
59 62
60 effect.PaintEffect(map, allowMask, (int)Constants.RegionSize * 0.5f, (int)Constants.RegionSize * 0.5f, -1.0, 2, 0.1); 63 effect.PaintEffect(map, allowMask, midRegion, midRegion, -1.0, 2, 6.0);
61 Assert.That(map[127, (int)((int)Constants.RegionSize * 0.5f)] > 0.0, "Raise brush should raising value at this point (127,128)."); 64 Assert.That(map[127, midRegion] > 0.0, "Raise brush should raising value at this point (127,128).");
62 Assert.That(map[124, (int)((int)Constants.RegionSize * 0.5f)] > 0.0, "Raise brush should raising value at this point (124,128)."); 65 Assert.That(map[125, midRegion] > 0.0, "Raise brush should raising value at this point (124,128).");
63 Assert.That(map[123, (int)((int)Constants.RegionSize * 0.5f)] == 0.0, "Raise brush should not change value at this point (123,128)."); 66 Assert.That(map[120, midRegion] == 0.0, "Raise brush should not change value at this point (120,128).");
64 Assert.That(map[128, (int)((int)Constants.RegionSize * 0.5f)] == 0.0, "Raise brush should not change value at this point (128,128)."); 67 Assert.That(map[128, midRegion] == 0.0, "Raise brush should not change value at this point (128,128).");
65 Assert.That(map[0, (int)((int)Constants.RegionSize * 0.5f)] == 0.0, "Raise brush should not change value at this point (0,128)."); 68 Assert.That(map[0, midRegion] == 0.0, "Raise brush should not change value at this point (0,128).");
66
67 // 69 //
68 // Test LowerSphere 70 // Test LowerSphere
69 // 71 //
@@ -77,13 +79,13 @@ namespace OpenSim.Region.CoreModules.World.Terrain.Tests
77 } 79 }
78 effect = new LowerSphere(); 80 effect = new LowerSphere();
79 81
80 effect.PaintEffect(map, allowMask, ((int)Constants.RegionSize * 0.5f), ((int)Constants.RegionSize * 0.5f), -1.0, 2, 6.0); 82 effect.PaintEffect(map, allowMask, midRegion, midRegion, -1.0, 2, 6.0);
81 Assert.That(map[127, (int)((int)Constants.RegionSize * 0.5f)] >= 0.0, "Lower should not lowering value below 0.0 at this point (127,128)."); 83 Assert.That(map[127, midRegion] >= 0.0, "Lower should not lowering value below 0.0 at this point (127,128).");
82 Assert.That(map[127, (int)((int)Constants.RegionSize * 0.5f)] == 0.0, "Lower brush should lowering value to 0.0 at this point (127,128)."); 84 Assert.That(map[127, midRegion] == 0.0, "Lower brush should lowering value to 0.0 at this point (127,128).");
83 Assert.That(map[124, (int)((int)Constants.RegionSize * 0.5f)] < 1.0, "Lower brush should lowering value at this point (124,128)."); 85 Assert.That(map[125, midRegion] < 1.0, "Lower brush should lowering value at this point (124,128).");
84 Assert.That(map[123, (int)((int)Constants.RegionSize * 0.5f)] == 1.0, "Lower brush should not change value at this point (123,128)."); 86 Assert.That(map[120, midRegion] == 1.0, "Lower brush should not change value at this point (120,128).");
85 Assert.That(map[128, (int)((int)Constants.RegionSize * 0.5f)] == 1.0, "Lower brush should not change value at this point (128,128)."); 87 Assert.That(map[128, midRegion] == 1.0, "Lower brush should not change value at this point (128,128).");
86 Assert.That(map[0, (int)((int)Constants.RegionSize * 0.5f)] == 1.0, "Lower brush should not change value at this point (0,128)."); 88 Assert.That(map[0, midRegion] == 1.0, "Lower brush should not change value at this point (0,128).");
87 } 89 }
88 90
89 [Test] 91 [Test]
@@ -100,10 +102,6 @@ namespace OpenSim.Region.CoreModules.World.Terrain.Tests
100 x[0, 0] -= 1.0; 102 x[0, 0] -= 1.0;
101 Assert.That(x[0, 0] == 4.0, "Terrain addition/subtraction error."); 103 Assert.That(x[0, 0] == 4.0, "Terrain addition/subtraction error.");
102 104
103 x[0, 0] = Math.PI;
104 double[,] doublesExport = x.GetDoubles();
105 Assert.That(doublesExport[0, 0] == Math.PI, "Export to double[,] array not working correctly.");
106
107 x[0, 0] = 1.0; 105 x[0, 0] = 1.0;
108 float[] floatsExport = x.GetFloatsSerialised(); 106 float[] floatsExport = x.GetFloatsSerialised();
109 Assert.That(floatsExport[0] == 1.0f, "Export to float[] not working correctly."); 107 Assert.That(floatsExport[0] == 1.0f, "Export to float[] not working correctly.");
diff --git a/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs b/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs
index f57be83..a3b0f39 100644
--- a/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs
+++ b/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs
@@ -899,7 +899,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap
899 finally 899 finally
900 { 900 {
901 if (os != null) 901 if (os != null)
902 os.Close(); 902 os.Dispose();
903 } 903 }
904 904
905 string response_mapItems_reply = null; 905 string response_mapItems_reply = null;
diff --git a/OpenSim/Region/Framework/Interfaces/INPCModule.cs b/OpenSim/Region/Framework/Interfaces/INPCModule.cs
index 9817cf7..d5dcddd 100644
--- a/OpenSim/Region/Framework/Interfaces/INPCModule.cs
+++ b/OpenSim/Region/Framework/Interfaces/INPCModule.cs
@@ -72,6 +72,32 @@ namespace OpenSim.Region.Framework.Interfaces
72 AvatarAppearance appearance); 72 AvatarAppearance appearance);
73 73
74 /// <summary> 74 /// <summary>
75 /// Create an NPC with a user-supplied agentID
76 /// </summary>
77 /// <param name="firstname"></param>
78 /// <param name="lastname"></param>
79 /// <param name="position"></param>
80 /// <param name="agentID"></param>
81 /// The desired agent ID
82 /// <param name="owner"></param>
83 /// <param name="senseAsAgent">
84 /// Make the NPC show up as an agent on LSL sensors. The default is
85 /// that they show up as the NPC type instead, but this is currently
86 /// an OpenSim-only extension.
87 /// </param>
88 /// <param name="scene"></param>
89 /// <param name="appearance">
90 /// The avatar appearance to use for the new NPC.
91 /// </param>
92 /// <returns>
93 /// The UUID of the ScenePresence created. UUID.Zero if there was a
94 /// failure.
95 /// </returns>
96 UUID CreateNPC(string firstname, string lastname,
97 Vector3 position, UUID agentID, UUID owner, bool senseAsAgent, Scene scene,
98 AvatarAppearance appearance);
99
100 /// <summary>
75 /// Check if the agent is an NPC. 101 /// Check if the agent is an NPC.
76 /// </summary> 102 /// </summary>
77 /// <param name="agentID"></param> 103 /// <param name="agentID"></param>
diff --git a/OpenSim/Region/Framework/Interfaces/ITerrainChannel.cs b/OpenSim/Region/Framework/Interfaces/ITerrainChannel.cs
index 469bd31..f660b8d 100644
--- a/OpenSim/Region/Framework/Interfaces/ITerrainChannel.cs
+++ b/OpenSim/Region/Framework/Interfaces/ITerrainChannel.cs
@@ -26,6 +26,7 @@
26 */ 26 */
27 27
28using OpenSim.Framework; 28using OpenSim.Framework;
29using OpenMetaverse;
29 30
30namespace OpenSim.Region.Framework.Interfaces 31namespace OpenSim.Region.Framework.Interfaces
31{ 32{
@@ -56,5 +57,7 @@ namespace OpenSim.Region.Framework.Interfaces
56 ITerrainChannel MakeCopy(); 57 ITerrainChannel MakeCopy();
57 string SaveToXmlString(); 58 string SaveToXmlString();
58 void LoadFromXmlString(string data); 59 void LoadFromXmlString(string data);
60 // Merge some terrain into this channel
61 void Merge(ITerrainChannel newTerrain, Vector3 displacement, float radianRotation, Vector2 rotationDisplacement);
59 } 62 }
60} 63}
diff --git a/OpenSim/Region/Framework/Interfaces/ITerrainModule.cs b/OpenSim/Region/Framework/Interfaces/ITerrainModule.cs
index 189a30a..a6f5d98 100644
--- a/OpenSim/Region/Framework/Interfaces/ITerrainModule.cs
+++ b/OpenSim/Region/Framework/Interfaces/ITerrainModule.cs
@@ -51,7 +51,7 @@ namespace OpenSim.Region.Framework.Interfaces
51 /// </param> 51 /// </param>
52 /// <param name="stream"></param> 52 /// <param name="stream"></param>
53 void LoadFromStream(string filename, Stream stream); 53 void LoadFromStream(string filename, Stream stream);
54 void LoadFromStream(string filename, Vector2 displacement, Stream stream); 54 void LoadFromStream(string filename, Vector3 displacement, float radianRotation, Vector2 rotationDisplacement, Stream stream);
55 void LoadFromStream(string filename, System.Uri pathToTerrainHeightmap); 55 void LoadFromStream(string filename, System.Uri pathToTerrainHeightmap);
56 /// <summary> 56 /// <summary>
57 /// Save a terrain to a stream. 57 /// Save a terrain to a stream.
diff --git a/OpenSim/Region/Framework/Scenes/TerrainChannel.cs b/OpenSim/Region/Framework/Scenes/TerrainChannel.cs
index b4b1823..24709dc 100644
--- a/OpenSim/Region/Framework/Scenes/TerrainChannel.cs
+++ b/OpenSim/Region/Framework/Scenes/TerrainChannel.cs
@@ -36,6 +36,8 @@ using OpenSim.Data;
36using OpenSim.Framework; 36using OpenSim.Framework;
37using OpenSim.Region.Framework.Interfaces; 37using OpenSim.Region.Framework.Interfaces;
38 38
39using OpenMetaverse;
40
39using log4net; 41using log4net;
40 42
41namespace OpenSim.Region.Framework.Scenes 43namespace OpenSim.Region.Framework.Scenes
@@ -212,6 +214,76 @@ namespace OpenSim.Region.Framework.Scenes
212 sr.Close(); 214 sr.Close();
213 } 215 }
214 216
217 // ITerrainChannel.Merge
218 public void Merge(ITerrainChannel newTerrain, Vector3 displacement, float radianRotation, Vector2 rotationDisplacement)
219 {
220 for (int xx = 0; xx < newTerrain.Width; xx++)
221 {
222 for (int yy = 0; yy < newTerrain.Height; yy++)
223 {
224 int dispX = (int)displacement.X;
225 int dispY = (int)displacement.Y;
226 float newHeight = (float)newTerrain[xx, yy] + displacement.Z;
227 if (radianRotation == 0)
228 {
229 // If no rotation, place the new height in the specified location
230 dispX += xx;
231 dispY += yy;
232 if (dispX >= 0 && dispX < m_terrainData.SizeX && dispY >= 0 && dispY < m_terrainData.SizeY)
233 {
234 m_terrainData[dispX, dispY] = newHeight;
235 }
236 }
237 else
238 {
239 // If rotating, we have to smooth the result because the conversion
240 // to ints will mean heightmap entries will not get changed
241 // First compute the rotation location for the new height.
242 dispX += (int)(rotationDisplacement.X
243 + ((float)xx - rotationDisplacement.X) * Math.Cos(radianRotation)
244 - ((float)yy - rotationDisplacement.Y) * Math.Sin(radianRotation) );
245
246 dispY += (int)(rotationDisplacement.Y
247 + ((float)xx - rotationDisplacement.X) * Math.Sin(radianRotation)
248 + ((float)yy - rotationDisplacement.Y) * Math.Cos(radianRotation) );
249
250 if (dispX >= 0 && dispX < m_terrainData.SizeX && dispY >= 0 && dispY < m_terrainData.SizeY)
251 {
252 float oldHeight = m_terrainData[dispX, dispY];
253 // Smooth the heights around this location if the old height is far from this one
254 for (int sxx = dispX - 2; sxx < dispX + 2; sxx++)
255 {
256 for (int syy = dispY - 2; syy < dispY + 2; syy++)
257 {
258 if (sxx >= 0 && sxx < m_terrainData.SizeX && syy >= 0 && syy < m_terrainData.SizeY)
259 {
260 if (sxx == dispX && syy == dispY)
261 {
262 // Set height for the exact rotated point
263 m_terrainData[dispX, dispY] = newHeight;
264 }
265 else
266 {
267 if (Math.Abs(m_terrainData[sxx, syy] - newHeight) > 1f)
268 {
269 // If the adjacent height is far off, force it to this height
270 m_terrainData[sxx, syy] = newHeight;
271 }
272 }
273 }
274 }
275 }
276 }
277
278 if (dispX >= 0 && dispX < m_terrainData.SizeX && dispY >= 0 && dispY < m_terrainData.SizeY)
279 {
280 m_terrainData[dispX, dispY] = (float)newTerrain[xx, yy];
281 }
282 }
283 }
284 }
285 }
286
215 #endregion 287 #endregion
216 288
217 public TerrainChannel Copy() 289 public TerrainChannel Copy()
diff --git a/OpenSim/Region/Framework/Scenes/UuidGatherer.cs b/OpenSim/Region/Framework/Scenes/UuidGatherer.cs
index 75a51b5..fe6cb84 100644
--- a/OpenSim/Region/Framework/Scenes/UuidGatherer.cs
+++ b/OpenSim/Region/Framework/Scenes/UuidGatherer.cs
@@ -161,7 +161,7 @@ namespace OpenSim.Region.Framework.Scenes
161 { 161 {
162 // Get the prim's default texture. This will be used for faces which don't have their own texture 162 // Get the prim's default texture. This will be used for faces which don't have their own texture
163 if (textureEntry.DefaultTexture != null) 163 if (textureEntry.DefaultTexture != null)
164 assetUuids[textureEntry.DefaultTexture.TextureID] = (sbyte)AssetType.Texture; 164 GatherTextureEntryAssets(textureEntry.DefaultTexture, assetUuids);
165 165
166 if (textureEntry.FaceTextures != null) 166 if (textureEntry.FaceTextures != null)
167 { 167 {
@@ -169,7 +169,7 @@ namespace OpenSim.Region.Framework.Scenes
169 foreach (Primitive.TextureEntryFace texture in textureEntry.FaceTextures) 169 foreach (Primitive.TextureEntryFace texture in textureEntry.FaceTextures)
170 { 170 {
171 if (texture != null) 171 if (texture != null)
172 assetUuids[texture.TextureID] = (sbyte)AssetType.Texture; 172 GatherTextureEntryAssets(texture, assetUuids);
173 } 173 }
174 } 174 }
175 } 175 }
@@ -233,6 +233,19 @@ namespace OpenSim.Region.Framework.Scenes
233 } 233 }
234 } 234 }
235 235
236 /// <summary>
237 /// Gather all the asset uuids found in one face of a Texture Entry.
238 /// </summary>
239 private void GatherTextureEntryAssets(Primitive.TextureEntryFace texture, IDictionary<UUID, sbyte> assetUuids)
240 {
241 assetUuids[texture.TextureID] = (sbyte)AssetType.Texture;
242
243 if (texture.MaterialID != UUID.Zero)
244 {
245 GatherAssetUuids(texture.MaterialID, (sbyte)OpenSimAssetType.Material, assetUuids);
246 }
247 }
248
236// /// <summary> 249// /// <summary>
237// /// The callback made when we request the asset for an object from the asset service. 250// /// The callback made when we request the asset for an object from the asset service.
238// /// </summary> 251// /// </summary>
diff --git a/OpenSim/Region/OptionalModules/Scripting/RegionReadyModule/RegionReadyModule.cs b/OpenSim/Region/OptionalModules/Scripting/RegionReadyModule/RegionReadyModule.cs
index 296ab87..d059b97 100644
--- a/OpenSim/Region/OptionalModules/Scripting/RegionReadyModule/RegionReadyModule.cs
+++ b/OpenSim/Region/OptionalModules/Scripting/RegionReadyModule/RegionReadyModule.cs
@@ -304,7 +304,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.RegionReady
304 finally 304 finally
305 { 305 {
306 if (os != null) 306 if (os != null)
307 os.Close(); 307 os.Dispose();
308 } 308 }
309 } 309 }
310 } 310 }
diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs
index a895ee1..fb644b7 100644
--- a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs
+++ b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs
@@ -61,7 +61,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC
61 private readonly string m_firstname; 61 private readonly string m_firstname;
62 private readonly string m_lastname; 62 private readonly string m_lastname;
63 private readonly Vector3 m_startPos; 63 private readonly Vector3 m_startPos;
64 private readonly UUID m_uuid = UUID.Random(); 64 private readonly UUID m_uuid;
65 private readonly Scene m_scene; 65 private readonly Scene m_scene;
66 private readonly UUID m_ownerID; 66 private readonly UUID m_ownerID;
67 67
@@ -71,6 +71,19 @@ namespace OpenSim.Region.OptionalModules.World.NPC
71 m_firstname = firstname; 71 m_firstname = firstname;
72 m_lastname = lastname; 72 m_lastname = lastname;
73 m_startPos = position; 73 m_startPos = position;
74 m_uuid = UUID.Random();
75 m_scene = scene;
76 m_ownerID = ownerID;
77 SenseAsAgent = senseAsAgent;
78 }
79
80 public NPCAvatar(
81 string firstname, string lastname, UUID agentID, Vector3 position, UUID ownerID, bool senseAsAgent, Scene scene)
82 {
83 m_firstname = firstname;
84 m_lastname = lastname;
85 m_startPos = position;
86 m_uuid = agentID;
74 m_scene = scene; 87 m_scene = scene;
75 m_ownerID = ownerID; 88 m_ownerID = ownerID;
76 SenseAsAgent = senseAsAgent; 89 SenseAsAgent = senseAsAgent;
diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs
index fffe1ab..8a2da6e 100644
--- a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs
+++ b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs
@@ -140,8 +140,30 @@ namespace OpenSim.Region.OptionalModules.World.NPC
140 Vector3 position, UUID owner, bool senseAsAgent, Scene scene, 140 Vector3 position, UUID owner, bool senseAsAgent, Scene scene,
141 AvatarAppearance appearance) 141 AvatarAppearance appearance)
142 { 142 {
143 NPCAvatar npcAvatar = new NPCAvatar(firstname, lastname, position, 143 return CreateNPC(firstname, lastname, position, UUID.Zero, owner, senseAsAgent, scene, appearance);
144 owner, senseAsAgent, scene); 144 }
145
146 public UUID CreateNPC(string firstname, string lastname,
147 Vector3 position, UUID agentID, UUID owner, bool senseAsAgent, Scene scene,
148 AvatarAppearance appearance)
149 {
150 NPCAvatar npcAvatar = null;
151
152 try
153 {
154 if (agentID == UUID.Zero)
155 npcAvatar = new NPCAvatar(firstname, lastname, position,
156 owner, senseAsAgent, scene);
157 else
158 npcAvatar = new NPCAvatar(firstname, lastname, agentID, position,
159 owner, senseAsAgent, scene);
160 }
161 catch (Exception e)
162 {
163 m_log.Info("[NPC MODULE]: exception creating NPC avatar: " + e.ToString());
164 return UUID.Zero;
165 }
166
145 npcAvatar.CircuitCode = (uint)Util.RandomClass.Next(0, 167 npcAvatar.CircuitCode = (uint)Util.RandomClass.Next(0,
146 int.MaxValue); 168 int.MaxValue);
147 169
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSParam.cs b/OpenSim/Region/Physics/BulletSPlugin/BSParam.cs
index 834228e..d993e6a 100755
--- a/OpenSim/Region/Physics/BulletSPlugin/BSParam.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSParam.cs
@@ -538,7 +538,7 @@ public static class BSParam
538 (s,o) => { s.PE.SetContactProcessingThreshold(o.PhysBody, ContactProcessingThreshold); } ), 538 (s,o) => { s.PE.SetContactProcessingThreshold(o.PhysBody, ContactProcessingThreshold); } ),
539 539
540 new ParameterDefn<float>("TerrainImplementation", "Type of shape to use for terrain (0=heightmap, 1=mesh)", 540 new ParameterDefn<float>("TerrainImplementation", "Type of shape to use for terrain (0=heightmap, 1=mesh)",
541 (float)BSTerrainPhys.TerrainImplementation.Mesh ), 541 (float)BSTerrainPhys.TerrainImplementation.Heightmap ),
542 new ParameterDefn<int>("TerrainMeshMagnification", "Number of times the 256x256 heightmap is multiplied to create the terrain mesh" , 542 new ParameterDefn<int>("TerrainMeshMagnification", "Number of times the 256x256 heightmap is multiplied to create the terrain mesh" ,
543 2 ), 543 2 ),
544 new ParameterDefn<float>("TerrainFriction", "Factor to reduce movement against terrain surface" , 544 new ParameterDefn<float>("TerrainFriction", "Factor to reduce movement against terrain surface" ,
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs b/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs
index fe014fc..2d2e55f 100644
--- a/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs
@@ -235,6 +235,14 @@ public sealed class BSScene : PhysicsScene, IPhysicsParameters
235 // Set default values for physics parameters plus any overrides from the ini file 235 // Set default values for physics parameters plus any overrides from the ini file
236 GetInitialParameterValues(config); 236 GetInitialParameterValues(config);
237 237
238 // Force some parameters to values depending on other configurations
239 // Only use heightmap terrain implementation if terrain larger than legacy size
240 if ((uint)regionExtent.X > Constants.RegionSize || (uint)regionExtent.Y > Constants.RegionSize)
241 {
242 m_log.WarnFormat("{0} Forcing terrain implementation to heightmap for large region", LogHeader);
243 BSParam.TerrainImplementation = (float)BSTerrainPhys.TerrainImplementation.Heightmap;
244 }
245
238 // Get the connection to the physics engine (could be native or one of many DLLs) 246 // Get the connection to the physics engine (could be native or one of many DLLs)
239 PE = SelectUnderlyingBulletEngine(BulletEngineName); 247 PE = SelectUnderlyingBulletEngine(BulletEngineName);
240 248
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index 7b56abf..91885b7 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -101,7 +101,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
101 /// </summary> 101 /// </summary>
102 protected TaskInventoryItem m_item; 102 protected TaskInventoryItem m_item;
103 103
104 protected bool throwErrorOnNotImplemented = true; 104 protected bool throwErrorOnNotImplemented = false;
105 protected AsyncCommandManager AsyncCommands = null; 105 protected AsyncCommandManager AsyncCommands = null;
106 protected float m_ScriptDelayFactor = 1.0f; 106 protected float m_ScriptDelayFactor = 1.0f;
107 protected float m_ScriptDistanceFactor = 1.0f; 107 protected float m_ScriptDistanceFactor = 1.0f;
@@ -261,7 +261,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
261 if ((item = GetScriptByName(name)) != UUID.Zero) 261 if ((item = GetScriptByName(name)) != UUID.Zero)
262 m_ScriptEngine.ResetScript(item); 262 m_ScriptEngine.ResetScript(item);
263 else 263 else
264 ShoutError("llResetOtherScript: script "+name+" not found"); 264 Error("llResetOtherScript", "Can't find script '" + name + "'");
265 } 265 }
266 266
267 public LSL_Integer llGetScriptState(string name) 267 public LSL_Integer llGetScriptState(string name)
@@ -275,7 +275,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
275 return m_ScriptEngine.GetScriptState(item) ?1:0; 275 return m_ScriptEngine.GetScriptState(item) ?1:0;
276 } 276 }
277 277
278 ShoutError("llGetScriptState: script "+name+" not found"); 278 Error("llGetScriptState", "Can't find script '" + name + "'");
279 279
280 // If we didn't find it, then it's safe to 280 // If we didn't find it, then it's safe to
281 // assume it is not running. 281 // assume it is not running.
@@ -298,7 +298,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
298 } 298 }
299 else 299 else
300 { 300 {
301 ShoutError("llSetScriptState: script "+name+" not found"); 301 Error("llSetScriptState", "Can't find script '" + name + "'");
302 } 302 }
303 } 303 }
304 304
@@ -890,7 +890,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
890 { 890 {
891 if (channelID == 0) 891 if (channelID == 0)
892 { 892 {
893 LSLError("Cannot use llRegionSay() on channel 0"); 893 Error("llRegionSay", "Cannot use on channel 0");
894 return; 894 return;
895 } 895 }
896 896
@@ -2553,9 +2553,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2553 public void llSound(string sound, double volume, int queue, int loop) 2553 public void llSound(string sound, double volume, int queue, int loop)
2554 { 2554 {
2555 m_host.AddScriptLPS(1); 2555 m_host.AddScriptLPS(1);
2556 // This function has been deprecated 2556 Deprecated("llSound", "Use llPlaySound instead");
2557 // see http://www.lslwiki.net/lslwiki/wakka.php?wakka=llSound
2558 Deprecated("llSound");
2559 } 2557 }
2560 2558
2561 // Xantor 20080528 PlaySound updated so it accepts an objectinventory name -or- a key to a sound 2559 // Xantor 20080528 PlaySound updated so it accepts an objectinventory name -or- a key to a sound
@@ -2886,7 +2884,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2886 2884
2887 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_DEBIT) == 0) 2885 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_DEBIT) == 0)
2888 { 2886 {
2889 LSLError("No permissions to give money"); 2887 Error("llGiveMoney", "No permissions to give money");
2890 return; 2888 return;
2891 } 2889 }
2892 2890
@@ -2894,7 +2892,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2894 2892
2895 if (!UUID.TryParse(destination, out toID)) 2893 if (!UUID.TryParse(destination, out toID))
2896 { 2894 {
2897 LSLError("Bad key in llGiveMoney"); 2895 Error("llGiveMoney", "Bad key in llGiveMoney");
2898 return; 2896 return;
2899 } 2897 }
2900 2898
@@ -2914,28 +2912,28 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2914 public void llMakeExplosion(int particles, double scale, double vel, double lifetime, double arc, string texture, LSL_Vector offset) 2912 public void llMakeExplosion(int particles, double scale, double vel, double lifetime, double arc, string texture, LSL_Vector offset)
2915 { 2913 {
2916 m_host.AddScriptLPS(1); 2914 m_host.AddScriptLPS(1);
2917 Deprecated("llMakeExplosion"); 2915 Deprecated("llMakeExplosion", "Use llParticleSystem instead");
2918 ScriptSleep(100); 2916 ScriptSleep(100);
2919 } 2917 }
2920 2918
2921 public void llMakeFountain(int particles, double scale, double vel, double lifetime, double arc, int bounce, string texture, LSL_Vector offset, double bounce_offset) 2919 public void llMakeFountain(int particles, double scale, double vel, double lifetime, double arc, int bounce, string texture, LSL_Vector offset, double bounce_offset)
2922 { 2920 {
2923 m_host.AddScriptLPS(1); 2921 m_host.AddScriptLPS(1);
2924 Deprecated("llMakeFountain"); 2922 Deprecated("llMakeFountain", "Use llParticleSystem instead");
2925 ScriptSleep(100); 2923 ScriptSleep(100);
2926 } 2924 }
2927 2925
2928 public void llMakeSmoke(int particles, double scale, double vel, double lifetime, double arc, string texture, LSL_Vector offset) 2926 public void llMakeSmoke(int particles, double scale, double vel, double lifetime, double arc, string texture, LSL_Vector offset)
2929 { 2927 {
2930 m_host.AddScriptLPS(1); 2928 m_host.AddScriptLPS(1);
2931 Deprecated("llMakeSmoke"); 2929 Deprecated("llMakeSmoke", "Use llParticleSystem instead");
2932 ScriptSleep(100); 2930 ScriptSleep(100);
2933 } 2931 }
2934 2932
2935 public void llMakeFire(int particles, double scale, double vel, double lifetime, double arc, string texture, LSL_Vector offset) 2933 public void llMakeFire(int particles, double scale, double vel, double lifetime, double arc, string texture, LSL_Vector offset)
2936 { 2934 {
2937 m_host.AddScriptLPS(1); 2935 m_host.AddScriptLPS(1);
2938 Deprecated("llMakeFire"); 2936 Deprecated("llMakeFire", "Use llParticleSystem instead");
2939 ScriptSleep(100); 2937 ScriptSleep(100);
2940 } 2938 }
2941 2939
@@ -2957,13 +2955,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2957 2955
2958 if (item == null) 2956 if (item == null)
2959 { 2957 {
2960 llSay(0, "Could not find object " + inventory); 2958 Error("llRezAtRoot", "Can't find object '" + inventory + "'");
2961 return; 2959 return;
2962 } 2960 }
2963 2961
2964 if (item.InvType != (int)InventoryType.Object) 2962 if (item.InvType != (int)InventoryType.Object)
2965 { 2963 {
2966 llSay(0, "Unable to create requested object. Object is missing from database."); 2964 Error("llRezAtRoot", "Can't create requested object; object is missing from database");
2967 return; 2965 return;
2968 } 2966 }
2969 2967
@@ -3053,7 +3051,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3053 public void llStopLookAt() 3051 public void llStopLookAt()
3054 { 3052 {
3055 m_host.AddScriptLPS(1); 3053 m_host.AddScriptLPS(1);
3056// NotImplemented("llStopLookAt");
3057 m_host.StopLookAt(); 3054 m_host.StopLookAt();
3058 } 3055 }
3059 3056
@@ -3237,13 +3234,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3237 public void llTakeCamera(string avatar) 3234 public void llTakeCamera(string avatar)
3238 { 3235 {
3239 m_host.AddScriptLPS(1); 3236 m_host.AddScriptLPS(1);
3240 Deprecated("llTakeCamera"); 3237 Deprecated("llTakeCamera", "Use llSetCameraParams instead");
3241 } 3238 }
3242 3239
3243 public void llReleaseCamera(string avatar) 3240 public void llReleaseCamera(string avatar)
3244 { 3241 {
3245 m_host.AddScriptLPS(1); 3242 m_host.AddScriptLPS(1);
3246 Deprecated("llReleaseCamera"); 3243 Deprecated("llReleaseCamera", "Use llClearCameraParams instead");
3247 } 3244 }
3248 3245
3249 public LSL_String llGetOwner() 3246 public LSL_String llGetOwner()
@@ -3320,7 +3317,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3320 IEmailModule emailModule = m_ScriptEngine.World.RequestModuleInterface<IEmailModule>(); 3317 IEmailModule emailModule = m_ScriptEngine.World.RequestModuleInterface<IEmailModule>();
3321 if (emailModule == null) 3318 if (emailModule == null)
3322 { 3319 {
3323 ShoutError("llEmail: email module not configured"); 3320 Error("llEmail", "Email module not configured");
3324 return; 3321 return;
3325 } 3322 }
3326 3323
@@ -3334,7 +3331,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3334 IEmailModule emailModule = m_ScriptEngine.World.RequestModuleInterface<IEmailModule>(); 3331 IEmailModule emailModule = m_ScriptEngine.World.RequestModuleInterface<IEmailModule>();
3335 if (emailModule == null) 3332 if (emailModule == null)
3336 { 3333 {
3337 ShoutError("llGetNextEmail: email module not configured"); 3334 Error("llGetNextEmail", "Email module not configured");
3338 return; 3335 return;
3339 } 3336 }
3340 Email email; 3337 Email email;
@@ -3419,17 +3416,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3419 catch (NotImplementedException) 3416 catch (NotImplementedException)
3420 { 3417 {
3421 // Currently not implemented in DotNetEngine only XEngine 3418 // Currently not implemented in DotNetEngine only XEngine
3422 NotImplemented("llMinEventDelay in DotNetEngine"); 3419 NotImplemented("llMinEventDelay", "In DotNetEngine");
3423 } 3420 }
3424 } 3421 }
3425 3422
3426 /// <summary>
3427 /// llSoundPreload is deprecated. In SL this appears to do absolutely nothing
3428 /// and is documented to have no delay.
3429 /// </summary>
3430 public void llSoundPreload(string sound) 3423 public void llSoundPreload(string sound)
3431 { 3424 {
3432 m_host.AddScriptLPS(1); 3425 m_host.AddScriptLPS(1);
3426 Deprecated("llSoundPreload", "Use llPreloadSound instead");
3433 } 3427 }
3434 3428
3435 public void llRotLookAt(LSL_Rotation target, double strength, double damping) 3429 public void llRotLookAt(LSL_Rotation target, double strength, double damping)
@@ -3734,7 +3728,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3734 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0 3728 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0
3735 && !m_automaticLinkPermission) 3729 && !m_automaticLinkPermission)
3736 { 3730 {
3737 ShoutError("Script trying to link but PERMISSION_CHANGE_LINKS permission not set!"); 3731 Error("llCreateLink", "PERMISSION_CHANGE_LINKS permission not set");
3738 return; 3732 return;
3739 } 3733 }
3740 3734
@@ -3789,7 +3783,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3789 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0 3783 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0
3790 && !m_automaticLinkPermission) 3784 && !m_automaticLinkPermission)
3791 { 3785 {
3792 ShoutError("Script trying to link but PERMISSION_CHANGE_LINKS permission not set!"); 3786 Error("llBreakLink", "PERMISSION_CHANGE_LINKS permission not set");
3793 return; 3787 return;
3794 } 3788 }
3795 3789
@@ -4009,7 +4003,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4009 4003
4010 if (!UUID.TryParse(destination, out destId)) 4004 if (!UUID.TryParse(destination, out destId))
4011 { 4005 {
4012 llSay(0, "Could not parse key " + destination); 4006 Error("llGiveInventory", "Can't parse destination key '" + destination + "'");
4013 return; 4007 return;
4014 } 4008 }
4015 4009
@@ -4017,8 +4011,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4017 4011
4018 if (item == null) 4012 if (item == null)
4019 { 4013 {
4020 llSay(0, String.Format("Could not find object '{0}'", inventory)); 4014 Error("llGiveInventory", "Can't find inventory object '" + inventory + "'");
4021 throw new Exception(String.Format("The inventory object '{0}' could not be found", inventory));
4022 } 4015 }
4023 4016
4024 UUID objId = item.ItemID; 4017 UUID objId = item.ItemID;
@@ -4042,7 +4035,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4042 4035
4043 if (account == null) 4036 if (account == null)
4044 { 4037 {
4045 llSay(0, "Can't find destination "+destId.ToString()); 4038 Error("llGiveInventory", "Can't find destination '" + destId.ToString() + "'");
4046 return; 4039 return;
4047 } 4040 }
4048 } 4041 }
@@ -4394,17 +4387,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4394 UUID av = new UUID(); 4387 UUID av = new UUID();
4395 if (!UUID.TryParse(agent,out av)) 4388 if (!UUID.TryParse(agent,out av))
4396 { 4389 {
4397 LSLError("First parameter to llTextBox needs to be a key"); 4390 Error("llTextBox", "First parameter must be a key");
4398 return; 4391 return;
4399 } 4392 }
4400 4393
4401 if (message == string.Empty) 4394 if (message == string.Empty)
4402 { 4395 {
4403 ShoutError("Trying to use llTextBox with empty message."); 4396 Error("llTextBox", "Empty message");
4404 } 4397 }
4405 else if (message.Length > 512) 4398 else if (message.Length > 512)
4406 { 4399 {
4407 ShoutError("Trying to use llTextBox with message over 512 characters."); 4400 Error("llTextBox", "Message more than 512 characters");
4408 } 4401 }
4409 else 4402 else
4410 { 4403 {
@@ -6814,17 +6807,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
6814 UUID av = new UUID(); 6807 UUID av = new UUID();
6815 if (!UUID.TryParse(avatar,out av)) 6808 if (!UUID.TryParse(avatar,out av))
6816 { 6809 {
6817 LSLError("First parameter to llDialog needs to be a key"); 6810 Error("llDialog", "First parameter must be a key");
6818 return; 6811 return;
6819 } 6812 }
6820 if (buttons.Length < 1) 6813 if (buttons.Length < 1)
6821 { 6814 {
6822 LSLError("No less than 1 button can be shown"); 6815 Error("llDialog", "At least 1 button must be shown");
6823 return; 6816 return;
6824 } 6817 }
6825 if (buttons.Length > 12) 6818 if (buttons.Length > 12)
6826 { 6819 {
6827 LSLError("No more than 12 buttons can be shown"); 6820 Error("llDialog", "No more than 12 buttons can be shown");
6828 return; 6821 return;
6829 } 6822 }
6830 string[] buts = new string[buttons.Length]; 6823 string[] buts = new string[buttons.Length];
@@ -6832,12 +6825,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
6832 { 6825 {
6833 if (buttons.Data[i].ToString() == String.Empty) 6826 if (buttons.Data[i].ToString() == String.Empty)
6834 { 6827 {
6835 LSLError("button label cannot be blank"); 6828 Error("llDialog", "Button label cannot be blank");
6836 return; 6829 return;
6837 } 6830 }
6838 if (buttons.Data[i].ToString().Length > 24) 6831 if (buttons.Data[i].ToString().Length > 24)
6839 { 6832 {
6840 LSLError("button label cannot be longer than 24 characters"); 6833 Error("llDialog", "Button label cannot be longer than 24 characters");
6841 return; 6834 return;
6842 } 6835 }
6843 buts[i] = buttons.Data[i].ToString(); 6836 buts[i] = buttons.Data[i].ToString();
@@ -6858,15 +6851,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
6858 m_host.ParentGroup.ScriptSetVolumeDetect(detect != 0); 6851 m_host.ParentGroup.ScriptSetVolumeDetect(detect != 0);
6859 } 6852 }
6860 6853
6861 /// <summary>
6862 /// This is a depecated function so this just replicates the result of
6863 /// invoking it in SL
6864 /// </summary>
6865 public void llRemoteLoadScript(string target, string name, int running, int start_param) 6854 public void llRemoteLoadScript(string target, string name, int running, int start_param)
6866 { 6855 {
6867 m_host.AddScriptLPS(1); 6856 m_host.AddScriptLPS(1);
6868 // Report an error as it does in SL 6857 Deprecated("llRemoteLoadScript", "Use llRemoteLoadScriptPin instead");
6869 ShoutError("Deprecated. Please use llRemoteLoadScriptPin instead.");
6870 ScriptSleep(3000); 6858 ScriptSleep(3000);
6871 } 6859 }
6872 6860
@@ -6884,7 +6872,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
6884 6872
6885 if (!UUID.TryParse(target, out destId)) 6873 if (!UUID.TryParse(target, out destId))
6886 { 6874 {
6887 llSay(0, "Could not parse key " + target); 6875 Error("llRemoteLoadScriptPin", "Can't parse key '" + target + "'");
6888 return; 6876 return;
6889 } 6877 }
6890 6878
@@ -6900,7 +6888,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
6900 // make sure the object is a script 6888 // make sure the object is a script
6901 if (item == null || item.Type != 10) 6889 if (item == null || item.Type != 10)
6902 { 6890 {
6903 llSay(0, "Could not find script " + name); 6891 Error("llRemoteLoadScriptPin", "Can't find script '" + name + "'");
6904 return; 6892 return;
6905 } 6893 }
6906 6894
@@ -7948,9 +7936,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7948 } 7936 }
7949 catch (InvalidCastException e) 7937 catch (InvalidCastException e)
7950 { 7938 {
7951 ShoutError(string.Format( 7939 Error(originFunc, string.Format("Error running rule #{0}: arg #{1} - ", rulesParsed, idx - idxStart) + e.Message);
7952 "{0} error running rule #{1}: arg #{2} ",
7953 originFunc, rulesParsed, idx - idxStart) + e.Message);
7954 } 7940 }
7955 finally 7941 finally
7956 { 7942 {
@@ -7983,9 +7969,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7983 string encodedData = Convert.ToBase64String(encData_byte); 7969 string encodedData = Convert.ToBase64String(encData_byte);
7984 return encodedData; 7970 return encodedData;
7985 } 7971 }
7986 catch (Exception e) 7972 catch
7987 { 7973 {
7988 throw new Exception("Error in base64Encode" + e.Message); 7974 Error("llBase64ToString", "Error encoding string");
7975 return String.Empty;
7989 } 7976 }
7990 } 7977 }
7991 7978
@@ -7996,16 +7983,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7996 { 7983 {
7997 return Util.Base64ToString(str); 7984 return Util.Base64ToString(str);
7998 } 7985 }
7999 catch (Exception e) 7986 catch
8000 { 7987 {
8001 throw new Exception("Error in base64Decode" + e.Message); 7988 Error("llBase64ToString", "Error decoding string");
7989 return String.Empty;
8002 } 7990 }
8003 } 7991 }
8004 7992
8005 public LSL_String llXorBase64Strings(string str1, string str2) 7993 public LSL_String llXorBase64Strings(string str1, string str2)
8006 { 7994 {
8007 m_host.AddScriptLPS(1); 7995 m_host.AddScriptLPS(1);
8008 Deprecated("llXorBase64Strings"); 7996 Deprecated("llXorBase64Strings", "Use llXorBase64 instead");
8009 ScriptSleep(300); 7997 ScriptSleep(300);
8010 return String.Empty; 7998 return String.Empty;
8011 } 7999 }
@@ -8013,7 +8001,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8013 public void llRemoteDataSetRegion() 8001 public void llRemoteDataSetRegion()
8014 { 8002 {
8015 m_host.AddScriptLPS(1); 8003 m_host.AddScriptLPS(1);
8016 Deprecated("llRemoteDataSetRegion"); 8004 Deprecated("llRemoteDataSetRegion", "Use llOpenRemoteDataChannel instead");
8017 } 8005 }
8018 8006
8019 public LSL_Float llLog10(double val) 8007 public LSL_Float llLog10(double val)
@@ -9728,7 +9716,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
9728 9716
9729 if (item == null) 9717 if (item == null)
9730 { 9718 {
9731 llSay(0, "No item name '" + item + "'"); 9719 Error("llGetInventoryCreator", "Can't find item '" + item + "'");
9732 9720
9733 return String.Empty; 9721 return String.Empty;
9734 } 9722 }
@@ -10047,7 +10035,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10047 presence = World.GetScenePresence(agentID); 10035 presence = World.GetScenePresence(agentID);
10048 } 10036 }
10049 } 10037 }
10050 else ShoutError("The argument of PARCEL_MEDIA_COMMAND_AGENT must be a key"); 10038 else Error("llParcelMediaCommandList", "The argument of PARCEL_MEDIA_COMMAND_AGENT must be a key");
10051 ++i; 10039 ++i;
10052 } 10040 }
10053 break; 10041 break;
@@ -10078,7 +10066,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10078 url = (LSL_String)commandList.Data[i + 1]; 10066 url = (LSL_String)commandList.Data[i + 1];
10079 update = true; 10067 update = true;
10080 } 10068 }
10081 else ShoutError("The argument of PARCEL_MEDIA_COMMAND_URL must be a string."); 10069 else Error("llParcelMediaCommandList", "The argument of PARCEL_MEDIA_COMMAND_URL must be a string");
10082 ++i; 10070 ++i;
10083 } 10071 }
10084 break; 10072 break;
@@ -10091,7 +10079,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10091 texture = (LSL_String)commandList.Data[i + 1]; 10079 texture = (LSL_String)commandList.Data[i + 1];
10092 update = true; 10080 update = true;
10093 } 10081 }
10094 else ShoutError("The argument of PARCEL_MEDIA_COMMAND_TEXTURE must be a string or key."); 10082 else Error("llParcelMediaCommandList", "The argument of PARCEL_MEDIA_COMMAND_TEXTURE must be a string or a key");
10095 ++i; 10083 ++i;
10096 } 10084 }
10097 break; 10085 break;
@@ -10103,7 +10091,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10103 { 10091 {
10104 time = (float)(LSL_Float)commandList.Data[i + 1]; 10092 time = (float)(LSL_Float)commandList.Data[i + 1];
10105 } 10093 }
10106 else ShoutError("The argument of PARCEL_MEDIA_COMMAND_TIME must be a float."); 10094 else Error("llParcelMediaCommandList", "The argument of PARCEL_MEDIA_COMMAND_TIME must be a float");
10107 ++i; 10095 ++i;
10108 } 10096 }
10109 break; 10097 break;
@@ -10117,7 +10105,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10117 update = true; 10105 update = true;
10118 } 10106 }
10119 10107
10120 else ShoutError("The argument of PARCEL_MEDIA_COMMAND_AUTO_ALIGN must be an integer."); 10108 else Error("llParcelMediaCommandList", "The argument of PARCEL_MEDIA_COMMAND_AUTO_ALIGN must be an integer");
10121 ++i; 10109 ++i;
10122 } 10110 }
10123 break; 10111 break;
@@ -10130,7 +10118,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10130 mediaType = (LSL_String)commandList.Data[i + 1]; 10118 mediaType = (LSL_String)commandList.Data[i + 1];
10131 update = true; 10119 update = true;
10132 } 10120 }
10133 else ShoutError("The argument of PARCEL_MEDIA_COMMAND_TYPE must be a string."); 10121 else Error("llParcelMediaCommandList", "The argument of PARCEL_MEDIA_COMMAND_TYPE must be a string");
10134 ++i; 10122 ++i;
10135 } 10123 }
10136 break; 10124 break;
@@ -10143,7 +10131,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10143 description = (LSL_String)commandList.Data[i + 1]; 10131 description = (LSL_String)commandList.Data[i + 1];
10144 update = true; 10132 update = true;
10145 } 10133 }
10146 else ShoutError("The argument of PARCEL_MEDIA_COMMAND_DESC must be a string."); 10134 else Error("llParcelMediaCommandList", "The argument of PARCEL_MEDIA_COMMAND_DESC must be a string");
10147 ++i; 10135 ++i;
10148 } 10136 }
10149 break; 10137 break;
@@ -10159,15 +10147,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10159 height = (LSL_Integer)commandList.Data[i + 2]; 10147 height = (LSL_Integer)commandList.Data[i + 2];
10160 update = true; 10148 update = true;
10161 } 10149 }
10162 else ShoutError("The second argument of PARCEL_MEDIA_COMMAND_SIZE must be an integer."); 10150 else Error("llParcelMediaCommandList", "The second argument of PARCEL_MEDIA_COMMAND_SIZE must be an integer");
10163 } 10151 }
10164 else ShoutError("The first argument of PARCEL_MEDIA_COMMAND_SIZE must be an integer."); 10152 else Error("llParcelMediaCommandList", "The first argument of PARCEL_MEDIA_COMMAND_SIZE must be an integer");
10165 i += 2; 10153 i += 2;
10166 } 10154 }
10167 break; 10155 break;
10168 10156
10169 default: 10157 default:
10170 NotImplemented("llParcelMediaCommandList parameter not supported yet: " + Enum.Parse(typeof(ParcelMediaCommandEnum), commandList.Data[i].ToString()).ToString()); 10158 NotImplemented("llParcelMediaCommandList", "Parameter not supported yet: " + Enum.Parse(typeof(ParcelMediaCommandEnum), commandList.Data[i].ToString()).ToString());
10171 break; 10159 break;
10172 }//end switch 10160 }//end switch
10173 }//end for 10161 }//end for
@@ -10275,7 +10263,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10275 break; 10263 break;
10276 default: 10264 default:
10277 ParcelMediaCommandEnum mediaCommandEnum = ParcelMediaCommandEnum.Url; 10265 ParcelMediaCommandEnum mediaCommandEnum = ParcelMediaCommandEnum.Url;
10278 NotImplemented("llParcelMediaQuery parameter do not supported yet: " + Enum.Parse(mediaCommandEnum.GetType() , aList.Data[i].ToString()).ToString()); 10266 NotImplemented("llParcelMediaQuery", "Parameter not supported yet: " + Enum.Parse(mediaCommandEnum.GetType() , aList.Data[i].ToString()).ToString());
10279 break; 10267 break;
10280 } 10268 }
10281 10269
@@ -10312,7 +10300,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10312 10300
10313 if (quick_pay_buttons.Data.Length < 4) 10301 if (quick_pay_buttons.Data.Length < 4)
10314 { 10302 {
10315 LSLError("List must have at least 4 elements"); 10303 Error("llSetPayPrice", "List must have at least 4 elements");
10316 return; 10304 return;
10317 } 10305 }
10318 m_host.ParentGroup.RootPart.PayPrice[0]=price; 10306 m_host.ParentGroup.RootPart.PayPrice[0]=price;
@@ -10333,7 +10321,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10333 10321
10334 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0) 10322 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0)
10335 { 10323 {
10336 ShoutError("No permissions to track the camera"); 10324 Error("llGetCameraPos", "No permissions to track the camera");
10337 return Vector3.Zero; 10325 return Vector3.Zero;
10338 } 10326 }
10339 10327
@@ -10356,7 +10344,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10356 10344
10357 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0) 10345 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0)
10358 { 10346 {
10359 ShoutError("No permissions to track the camera"); 10347 Error("llGetCameraRot", "No permissions to track the camera");
10360 return Quaternion.Identity; 10348 return Quaternion.Identity;
10361 } 10349 }
10362 10350
@@ -10369,24 +10357,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10369 return Quaternion.Identity; 10357 return Quaternion.Identity;
10370 } 10358 }
10371 10359
10372 /// <summary>
10373 /// The SL implementation does nothing, it is deprecated
10374 /// This duplicates SL
10375 /// </summary>
10376 public void llSetPrimURL(string url) 10360 public void llSetPrimURL(string url)
10377 { 10361 {
10378 m_host.AddScriptLPS(1); 10362 m_host.AddScriptLPS(1);
10363 Deprecated("llSetPrimURL", "Use llSetPrimMediaParams instead");
10379 ScriptSleep(2000); 10364 ScriptSleep(2000);
10380 } 10365 }
10381 10366
10382 /// <summary>
10383 /// The SL implementation shouts an error, it is deprecated
10384 /// This duplicates SL
10385 /// </summary>
10386 public void llRefreshPrimURL() 10367 public void llRefreshPrimURL()
10387 { 10368 {
10388 m_host.AddScriptLPS(1); 10369 m_host.AddScriptLPS(1);
10389 ShoutError("llRefreshPrimURL - not yet supported"); 10370 Deprecated("llRefreshPrimURL");
10390 ScriptSleep(20000); 10371 ScriptSleep(20000);
10391 } 10372 }
10392 10373
@@ -10696,7 +10677,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10696 if (!ok || flag < 0 || 10677 if (!ok || flag < 0 ||
10697 flag > (int)HttpRequestConstants.HTTP_PRAGMA_NO_CACHE) 10678 flag > (int)HttpRequestConstants.HTTP_PRAGMA_NO_CACHE)
10698 { 10679 {
10699 throw new ScriptException("Parameter " + i.ToString() + " is an invalid flag"); 10680 Error("llHTTPRequest", "Parameter " + i.ToString() + " is an invalid flag");
10700 } 10681 }
10701 10682
10702 param.Add(parameters.Data[i].ToString()); //Add parameter flag 10683 param.Add(parameters.Data[i].ToString()); //Add parameter flag
@@ -10720,12 +10701,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10720 { 10701 {
10721 //There must be at least one name/value pair for custom header 10702 //There must be at least one name/value pair for custom header
10722 if (count == 1) 10703 if (count == 1)
10723 throw new ScriptException("Missing name/value for custom header at parameter " + i.ToString()); 10704 Error("llHTTPRequest", "Missing name/value for custom header at parameter " + i.ToString());
10724 break; 10705 break;
10725 } 10706 }
10726 10707
10727 if (HttpStandardHeaders.Contains(parameters.Data[i].ToString(), StringComparer.OrdinalIgnoreCase)) 10708 if (HttpStandardHeaders.Contains(parameters.Data[i].ToString(), StringComparer.OrdinalIgnoreCase))
10728 throw new ScriptException("Name is invalid as a custom header at parameter " + i.ToString()); 10709 Error("llHTTPRequest", "Name is invalid as a custom header at parameter " + i.ToString());
10729 10710
10730 param.Add(parameters.Data[i].ToString()); 10711 param.Add(parameters.Data[i].ToString());
10731 param.Add(parameters.Data[i+1].ToString()); 10712 param.Add(parameters.Data[i+1].ToString());
@@ -11242,25 +11223,71 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11242 return item.ItemID; 11223 return item.ItemID;
11243 } 11224 }
11244 11225
11245 internal void ShoutError(string msg) 11226 /// <summary>
11227 /// Reports the script error in the viewer's Script Warning/Error dialog and shouts it on the debug channel.
11228 /// </summary>
11229 /// <param name="command">The name of the command that generated the error.</param>
11230 /// <param name="message">The error message to report to the user.</param>
11231 internal void Error(string command, string message)
11246 { 11232 {
11247 llShout(ScriptBaseClass.DEBUG_CHANNEL, msg); 11233 string text = command + ": " + message;
11234 if (text.Length > 1023)
11235 {
11236 text = text.Substring(0, 1023);
11237 }
11238
11239 World.SimChat(Utils.StringToBytes(text), ChatTypeEnum.DebugChannel, ScriptBaseClass.DEBUG_CHANNEL,
11240 m_host.ParentGroup.RootPart.AbsolutePosition, m_host.Name, m_host.UUID, false);
11241
11242 IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>();
11243 if (wComm != null)
11244 {
11245 wComm.DeliverMessage(ChatTypeEnum.Shout, ScriptBaseClass.DEBUG_CHANNEL, m_host.Name, m_host.UUID, text);
11246 }
11248 } 11247 }
11249 11248
11250 internal void NotImplemented(string command) 11249 /// <summary>
11250 /// Reports that the command is not implemented as a script error.
11251 /// </summary>
11252 /// <param name="command">The name of the command that is not implemented.</param>
11253 /// <param name="message">Additional information to report to the user. (Optional)</param>
11254 internal void NotImplemented(string command, string message = "")
11251 { 11255 {
11252 if (throwErrorOnNotImplemented) 11256 if (throwErrorOnNotImplemented)
11253 throw new NotImplementedException("Command not implemented: " + command); 11257 {
11254 } 11258 if (message != "")
11259 {
11260 message = " - " + message;
11261 }
11255 11262
11256 internal void Deprecated(string command) 11263 throw new NotImplementedException("Command not implemented: " + command + message);
11257 { 11264 }
11258 throw new ScriptException("Command deprecated: " + command); 11265 else
11266 {
11267 string text = "Command not implemented";
11268 if (message != "")
11269 {
11270 text = text + " - " + message;
11271 }
11272
11273 Error(command, text);
11274 }
11259 } 11275 }
11260 11276
11261 internal void LSLError(string msg) 11277 /// <summary>
11278 /// Reports that the command is deprecated as a script error.
11279 /// </summary>
11280 /// <param name="command">The name of the command that is deprecated.</param>
11281 /// <param name="message">Additional information to report to the user. (Optional)</param>
11282 internal void Deprecated(string command, string message = "")
11262 { 11283 {
11263 throw new ScriptException("LSL Runtime Error: " + msg); 11284 string text = "Command deprecated";
11285 if (message != "")
11286 {
11287 text = text + " - " + message;
11288 }
11289
11290 Error(command, text);
11264 } 11291 }
11265 11292
11266 public delegate void AssetRequestCallback(UUID assetID, AssetBase asset); 11293 public delegate void AssetRequestCallback(UUID assetID, AssetBase asset);
@@ -11292,7 +11319,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11292 if (assetID == UUID.Zero) 11319 if (assetID == UUID.Zero)
11293 { 11320 {
11294 // => complain loudly, as specified by the LSL docs 11321 // => complain loudly, as specified by the LSL docs
11295 ShoutError("Notecard '" + name + "' could not be found."); 11322 Error("llGetNumberOfNotecardLines", "Can't find notecard '" + name + "'");
11296 11323
11297 return UUID.Zero.ToString(); 11324 return UUID.Zero.ToString();
11298 } 11325 }
@@ -11314,7 +11341,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11314 { 11341 {
11315 if (a == null || a.Type != 7) 11342 if (a == null || a.Type != 7)
11316 { 11343 {
11317 ShoutError("Notecard '" + name + "' could not be found."); 11344 Error("llGetNumberOfNotecardLines", "Can't find notecard '" + name + "'");
11318 return; 11345 return;
11319 } 11346 }
11320 11347
@@ -11345,7 +11372,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11345 if (assetID == UUID.Zero) 11372 if (assetID == UUID.Zero)
11346 { 11373 {
11347 // => complain loudly, as specified by the LSL docs 11374 // => complain loudly, as specified by the LSL docs
11348 ShoutError("Notecard '" + name + "' could not be found."); 11375 Error("llGetNotecardLine", "Can't find notecard '" + name + "'");
11349 11376
11350 return UUID.Zero.ToString(); 11377 return UUID.Zero.ToString();
11351 } 11378 }
@@ -11368,7 +11395,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11368 { 11395 {
11369 if (a == null || a.Type != 7) 11396 if (a == null || a.Type != 7)
11370 { 11397 {
11371 ShoutError("Notecard '" + name + "' could not be found."); 11398 Error("llGetNotecardLine", "Can't find notecard '" + name + "'");
11372 return; 11399 return;
11373 } 11400 }
11374 11401