diff options
Diffstat (limited to 'OpenSim/Region')
17 files changed, 131 insertions, 490 deletions
diff --git a/OpenSim/Region/Application/OpenSimBase.cs b/OpenSim/Region/Application/OpenSimBase.cs index 8eea56f..0502d80 100644 --- a/OpenSim/Region/Application/OpenSimBase.cs +++ b/OpenSim/Region/Application/OpenSimBase.cs | |||
@@ -78,7 +78,6 @@ namespace OpenSim | |||
78 | 78 | ||
79 | public string m_physicsEngine; | 79 | public string m_physicsEngine; |
80 | public string m_meshEngineName; | 80 | public string m_meshEngineName; |
81 | public string m_scriptEngine; | ||
82 | public bool m_sandbox; | 81 | public bool m_sandbox; |
83 | public bool user_accounts; | 82 | public bool user_accounts; |
84 | public bool m_gridLocalAsset; | 83 | public bool m_gridLocalAsset; |
@@ -222,6 +221,8 @@ namespace OpenSim | |||
222 | config.Set("startup_console_commands_file", String.Empty); | 221 | config.Set("startup_console_commands_file", String.Empty); |
223 | config.Set("shutdown_console_commands_file", String.Empty); | 222 | config.Set("shutdown_console_commands_file", String.Empty); |
224 | config.Set("script_engine", "OpenSim.Region.ScriptEngine.DotNetEngine.dll"); | 223 | config.Set("script_engine", "OpenSim.Region.ScriptEngine.DotNetEngine.dll"); |
224 | config.Set("DefaultScriptEngine", "DotNetEngine"); | ||
225 | |||
225 | config.Set("asset_database", "sqlite"); | 226 | config.Set("asset_database", "sqlite"); |
226 | config.Set("clientstack_plugin", "OpenSim.Region.ClientStack.LindenUDP.dll"); | 227 | config.Set("clientstack_plugin", "OpenSim.Region.ClientStack.LindenUDP.dll"); |
227 | } | 228 | } |
@@ -321,7 +322,6 @@ namespace OpenSim | |||
321 | = startupConfig.GetString("storage_connection_string", "URI=file:OpenSim.db,version=3"); | 322 | = startupConfig.GetString("storage_connection_string", "URI=file:OpenSim.db,version=3"); |
322 | m_estateConnectionString | 323 | m_estateConnectionString |
323 | = startupConfig.GetString("estate_connection_string", m_storageConnectionString); | 324 | = startupConfig.GetString("estate_connection_string", m_storageConnectionString); |
324 | m_scriptEngine = startupConfig.GetString("script_engine", "OpenSim.Region.ScriptEngine.DotNetEngine.dll"); | ||
325 | m_assetStorage = startupConfig.GetString("asset_database", "local"); | 325 | m_assetStorage = startupConfig.GetString("asset_database", "local"); |
326 | m_clientstackDll = startupConfig.GetString("clientstack_plugin", "OpenSim.Region.ClientStack.LindenUDP.dll"); | 326 | m_clientstackDll = startupConfig.GetString("clientstack_plugin", "OpenSim.Region.ClientStack.LindenUDP.dll"); |
327 | } | 327 | } |
@@ -522,31 +522,6 @@ namespace OpenSim | |||
522 | // script module can pick up events exposed by a module | 522 | // script module can pick up events exposed by a module |
523 | m_moduleLoader.InitialiseSharedModules(scene); | 523 | m_moduleLoader.InitialiseSharedModules(scene); |
524 | 524 | ||
525 | //m_moduleLoader.PickupModules(scene, "ScriptEngines"); | ||
526 | //m_moduleLoader.LoadRegionModules(Path.Combine("ScriptEngines", m_scriptEngine), scene); | ||
527 | |||
528 | if (string.IsNullOrEmpty(m_scriptEngine)) | ||
529 | { | ||
530 | m_log.Info("[MODULES]: No script engine module specified"); | ||
531 | } | ||
532 | else | ||
533 | { | ||
534 | m_log.Info("[MODULES]: Loading scripting engine modules"); | ||
535 | foreach (string module in m_scriptEngine.Split(',')) | ||
536 | { | ||
537 | string mod = module.Trim(" \t".ToCharArray()); // Clean up name | ||
538 | m_log.Info("[MODULES]: Loading scripting engine: " + mod); | ||
539 | try | ||
540 | { | ||
541 | modules.AddRange(m_moduleLoader.LoadRegionModules(Path.Combine("ScriptEngines", mod), scene)); | ||
542 | } | ||
543 | catch (Exception ex) | ||
544 | { | ||
545 | m_log.Error("[MODULES]: Failed to load script engine: " + ex.ToString()); | ||
546 | } | ||
547 | } | ||
548 | } | ||
549 | |||
550 | scene.SetModuleInterfaces(); | 525 | scene.SetModuleInterfaces(); |
551 | 526 | ||
552 | // Prims have to be loaded after module configuration since some modules may be invoked during the load | 527 | // Prims have to be loaded after module configuration since some modules may be invoked during the load |
diff --git a/OpenSim/Region/Environment/Modules/World/Archiver/ArchiveReadRequest.cs b/OpenSim/Region/Environment/Modules/World/Archiver/ArchiveReadRequest.cs index 776ea78..f53b16e 100644 --- a/OpenSim/Region/Environment/Modules/World/Archiver/ArchiveReadRequest.cs +++ b/OpenSim/Region/Environment/Modules/World/Archiver/ArchiveReadRequest.cs | |||
@@ -174,7 +174,7 @@ namespace OpenSim.Region.Environment.Modules.World.Archiver | |||
174 | 174 | ||
175 | foreach (SceneObjectGroup sceneObject in sceneObjects) | 175 | foreach (SceneObjectGroup sceneObject in sceneObjects) |
176 | { | 176 | { |
177 | sceneObject.CreateScriptInstances(0, true); | 177 | sceneObject.CreateScriptInstances(0, true, ""); |
178 | } | 178 | } |
179 | } | 179 | } |
180 | 180 | ||
diff --git a/OpenSim/Region/Environment/Modules/World/Serialiser/SceneXmlLoader.cs b/OpenSim/Region/Environment/Modules/World/Serialiser/SceneXmlLoader.cs index d1cc082..334d895 100644 --- a/OpenSim/Region/Environment/Modules/World/Serialiser/SceneXmlLoader.cs +++ b/OpenSim/Region/Environment/Modules/World/Serialiser/SceneXmlLoader.cs | |||
@@ -180,7 +180,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
180 | 180 | ||
181 | foreach (SceneObjectGroup sceneObject in sceneObjects) | 181 | foreach (SceneObjectGroup sceneObject in sceneObjects) |
182 | { | 182 | { |
183 | sceneObject.CreateScriptInstances(0, true); | 183 | sceneObject.CreateScriptInstances(0, true, ""); |
184 | } | 184 | } |
185 | } | 185 | } |
186 | 186 | ||
diff --git a/OpenSim/Region/Environment/Scenes/EventManager.cs b/OpenSim/Region/Environment/Scenes/EventManager.cs index 58f5efe..42cbdfc 100644 --- a/OpenSim/Region/Environment/Scenes/EventManager.cs +++ b/OpenSim/Region/Environment/Scenes/EventManager.cs | |||
@@ -95,7 +95,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
95 | 95 | ||
96 | public event OnPermissionErrorDelegate OnPermissionError; | 96 | public event OnPermissionErrorDelegate OnPermissionError; |
97 | 97 | ||
98 | public delegate void NewRezScript(uint localID, UUID itemID, string script, int startParam, bool postOnRez); | 98 | public delegate void NewRezScript(uint localID, UUID itemID, string script, int startParam, bool postOnRez, string engine); |
99 | 99 | ||
100 | public event NewRezScript OnRezScript; | 100 | public event NewRezScript OnRezScript; |
101 | 101 | ||
@@ -519,12 +519,13 @@ namespace OpenSim.Region.Environment.Scenes | |||
519 | } | 519 | } |
520 | } | 520 | } |
521 | 521 | ||
522 | public void TriggerRezScript(uint localID, UUID itemID, string script, int startParam, bool postOnRez) | 522 | public void TriggerRezScript(uint localID, UUID itemID, string script, int startParam, bool postOnRez, string engine) |
523 | { | 523 | { |
524 | handlerRezScript = OnRezScript; | 524 | handlerRezScript = OnRezScript; |
525 | if (handlerRezScript != null) | 525 | if (handlerRezScript != null) |
526 | { | 526 | { |
527 | handlerRezScript(localID, itemID, script, startParam, postOnRez); | 527 | handlerRezScript(localID, itemID, script, startParam, |
528 | postOnRez, engine); | ||
528 | } | 529 | } |
529 | } | 530 | } |
530 | 531 | ||
diff --git a/OpenSim/Region/Environment/Scenes/InnerScene.cs b/OpenSim/Region/Environment/Scenes/InnerScene.cs index 20442aa..50122f5 100644 --- a/OpenSim/Region/Environment/Scenes/InnerScene.cs +++ b/OpenSim/Region/Environment/Scenes/InnerScene.cs | |||
@@ -1604,7 +1604,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
1604 | copy.UpdateGroupRotation(rot); | 1604 | copy.UpdateGroupRotation(rot); |
1605 | } | 1605 | } |
1606 | 1606 | ||
1607 | copy.CreateScriptInstances(0, false); | 1607 | copy.CreateScriptInstances(0, false, ""); |
1608 | copy.HasGroupChanged = true; | 1608 | copy.HasGroupChanged = true; |
1609 | copy.ScheduleGroupForFullUpdate(); | 1609 | copy.ScheduleGroupForFullUpdate(); |
1610 | return copy; | 1610 | return copy; |
diff --git a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs index f575ecd..c670076 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs | |||
@@ -69,7 +69,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
69 | { | 69 | { |
70 | if (group is SceneObjectGroup) | 70 | if (group is SceneObjectGroup) |
71 | { | 71 | { |
72 | ((SceneObjectGroup) group).CreateScriptInstances(0, false); | 72 | ((SceneObjectGroup) group).CreateScriptInstances(0, false, DefaultScriptEngine); |
73 | } | 73 | } |
74 | } | 74 | } |
75 | } | 75 | } |
@@ -269,7 +269,9 @@ namespace OpenSim.Region.Environment.Scenes | |||
269 | // Trigger rerunning of script (use TriggerRezScript event, see RezScript) | 269 | // Trigger rerunning of script (use TriggerRezScript event, see RezScript) |
270 | if (isScriptRunning) | 270 | if (isScriptRunning) |
271 | { | 271 | { |
272 | part.CreateScriptInstance(item.ItemID, 0, false); | 272 | // Needs to determine which engine was running it and use that |
273 | // | ||
274 | part.CreateScriptInstance(item.ItemID, 0, false, DefaultScriptEngine); | ||
273 | } | 275 | } |
274 | } | 276 | } |
275 | 277 | ||
@@ -1289,7 +1291,7 @@ System.Console.WriteLine("Item asset {0}, request asset {1}", prevItem.AssetID.T | |||
1289 | 1291 | ||
1290 | part.ParentGroup.AddInventoryItem(remoteClient, localID, item, copyID); | 1292 | part.ParentGroup.AddInventoryItem(remoteClient, localID, item, copyID); |
1291 | // TODO: set this to "true" when scripts in inventory have persistent state to fire on_rez | 1293 | // TODO: set this to "true" when scripts in inventory have persistent state to fire on_rez |
1292 | part.CreateScriptInstance(copyID, 0, false); | 1294 | part.CreateScriptInstance(copyID, 0, false, DefaultScriptEngine); |
1293 | 1295 | ||
1294 | // m_log.InfoFormat("[PRIMINVENTORY]: " + | 1296 | // m_log.InfoFormat("[PRIMINVENTORY]: " + |
1295 | // "Rezzed script {0} into prim local ID {1} for user {2}", | 1297 | // "Rezzed script {0} into prim local ID {1} for user {2}", |
@@ -1353,7 +1355,7 @@ System.Console.WriteLine("Item asset {0}, request asset {1}", prevItem.AssetID.T | |||
1353 | part.AddInventoryItem(taskItem); | 1355 | part.AddInventoryItem(taskItem); |
1354 | part.GetProperties(remoteClient); | 1356 | part.GetProperties(remoteClient); |
1355 | 1357 | ||
1356 | part.CreateScriptInstance(taskItem, 0, false); | 1358 | part.CreateScriptInstance(taskItem, 0, false, DefaultScriptEngine); |
1357 | } | 1359 | } |
1358 | } | 1360 | } |
1359 | 1361 | ||
@@ -1449,7 +1451,7 @@ System.Console.WriteLine("Item asset {0}, request asset {1}", prevItem.AssetID.T | |||
1449 | 1451 | ||
1450 | if (running > 0) | 1452 | if (running > 0) |
1451 | { | 1453 | { |
1452 | destPart.CreateScriptInstance(destTaskItem, 0, false); | 1454 | destPart.CreateScriptInstance(destTaskItem, 0, false, DefaultScriptEngine); |
1453 | } | 1455 | } |
1454 | 1456 | ||
1455 | ScenePresence avatar; | 1457 | ScenePresence avatar; |
@@ -2037,7 +2039,7 @@ System.Console.WriteLine("Item asset {0}, request asset {1}", prevItem.AssetID.T | |||
2037 | } | 2039 | } |
2038 | 2040 | ||
2039 | // TODO: make this true to fire on_rez when scripts have state while in inventory | 2041 | // TODO: make this true to fire on_rez when scripts have state while in inventory |
2040 | group.CreateScriptInstances(0, false); | 2042 | group.CreateScriptInstances(0, false, DefaultScriptEngine); |
2041 | 2043 | ||
2042 | if (!attachment) | 2044 | if (!attachment) |
2043 | rootPart.ScheduleFullUpdate(); | 2045 | rootPart.ScheduleFullUpdate(); |
@@ -2141,7 +2143,7 @@ System.Console.WriteLine("Item asset {0}, request asset {1}", prevItem.AssetID.T | |||
2141 | group.UpdateGroupRotation(rot); | 2143 | group.UpdateGroupRotation(rot); |
2142 | //group.ApplyPhysics(m_physicalPrim); | 2144 | //group.ApplyPhysics(m_physicalPrim); |
2143 | group.Velocity = vel; | 2145 | group.Velocity = vel; |
2144 | group.CreateScriptInstances(param, true); | 2146 | group.CreateScriptInstances(param, true, DefaultScriptEngine); |
2145 | rootPart.ScheduleFullUpdate(); | 2147 | rootPart.ScheduleFullUpdate(); |
2146 | 2148 | ||
2147 | if (!ExternalChecks.ExternalChecksBypassPermissions()) | 2149 | if (!ExternalChecks.ExternalChecksBypassPermissions()) |
diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs index 7363fa9..5e1ad71 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.cs | |||
@@ -166,6 +166,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
166 | 166 | ||
167 | private bool m_physics_enabled = true; | 167 | private bool m_physics_enabled = true; |
168 | private bool m_scripts_enabled = true; | 168 | private bool m_scripts_enabled = true; |
169 | private string m_defaultScriptEngine; | ||
169 | 170 | ||
170 | #endregion | 171 | #endregion |
171 | 172 | ||
@@ -199,6 +200,11 @@ namespace OpenSim.Region.Environment.Scenes | |||
199 | get { return m_timePhase; } | 200 | get { return m_timePhase; } |
200 | } | 201 | } |
201 | 202 | ||
203 | public string DefaultScriptEngine | ||
204 | { | ||
205 | get { return m_defaultScriptEngine; } | ||
206 | } | ||
207 | |||
202 | // Local reference to the objects in the scene (which are held in innerScene) | 208 | // Local reference to the objects in the scene (which are held in innerScene) |
203 | // public Dictionary<UUID, SceneObjectGroup> Objects | 209 | // public Dictionary<UUID, SceneObjectGroup> Objects |
204 | // { | 210 | // { |
@@ -314,6 +320,8 @@ namespace OpenSim.Region.Environment.Scenes | |||
314 | IConfig startupConfig = m_config.Configs["Startup"]; | 320 | IConfig startupConfig = m_config.Configs["Startup"]; |
315 | m_maxNonphys = startupConfig.GetFloat("NonPhysicalPrimMax", 65536.0f); | 321 | m_maxNonphys = startupConfig.GetFloat("NonPhysicalPrimMax", 65536.0f); |
316 | m_maxPhys = startupConfig.GetFloat("PhysicalPrimMax", 10.0f); | 322 | m_maxPhys = startupConfig.GetFloat("PhysicalPrimMax", 10.0f); |
323 | |||
324 | m_defaultScriptEngine = startupConfig.GetString("DefaultScriptEngine", "DotNetEngine"); | ||
317 | } | 325 | } |
318 | catch (Exception) | 326 | catch (Exception) |
319 | { | 327 | { |
@@ -574,7 +582,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
574 | { | 582 | { |
575 | if (ent is SceneObjectGroup) | 583 | if (ent is SceneObjectGroup) |
576 | { | 584 | { |
577 | ((SceneObjectGroup)ent).CreateScriptInstances(0, false); | 585 | ((SceneObjectGroup)ent).CreateScriptInstances(0, false, ""); |
578 | } | 586 | } |
579 | } | 587 | } |
580 | } | 588 | } |
diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.Inventory.cs b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.Inventory.cs index c6452f9..5ce8985 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.Inventory.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.Inventory.cs | |||
@@ -55,14 +55,15 @@ namespace OpenSim.Region.Environment.Scenes | |||
55 | /// <summary> | 55 | /// <summary> |
56 | /// Start the scripts contained in all the prims in this group. | 56 | /// Start the scripts contained in all the prims in this group. |
57 | /// </summary> | 57 | /// </summary> |
58 | public void CreateScriptInstances(int startParam, bool postOnRez) | 58 | public void CreateScriptInstances(int startParam, bool postOnRez, |
59 | string engine) | ||
59 | { | 60 | { |
60 | // Don't start scripts if they're turned off in the region! | 61 | // Don't start scripts if they're turned off in the region! |
61 | if (!m_scene.RegionInfo.RegionSettings.DisableScripts) | 62 | if (!m_scene.RegionInfo.RegionSettings.DisableScripts) |
62 | { | 63 | { |
63 | foreach (SceneObjectPart part in m_parts.Values) | 64 | foreach (SceneObjectPart part in m_parts.Values) |
64 | { | 65 | { |
65 | part.CreateScriptInstances(startParam, postOnRez); | 66 | part.CreateScriptInstances(startParam, postOnRez, engine); |
66 | } | 67 | } |
67 | } | 68 | } |
68 | } | 69 | } |
diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectPart.Inventory.cs b/OpenSim/Region/Environment/Scenes/SceneObjectPart.Inventory.cs index 08f8cee..061d961 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectPart.Inventory.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectPart.Inventory.cs | |||
@@ -125,7 +125,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
125 | /// <summary> | 125 | /// <summary> |
126 | /// Start all the scripts contained in this prim's inventory | 126 | /// Start all the scripts contained in this prim's inventory |
127 | /// </summary> | 127 | /// </summary> |
128 | public void CreateScriptInstances(int startParam, bool postOnRez) | 128 | public void CreateScriptInstances(int startParam, bool postOnRez, string engine) |
129 | { | 129 | { |
130 | lock (m_taskInventory) | 130 | lock (m_taskInventory) |
131 | { | 131 | { |
@@ -133,7 +133,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
133 | { | 133 | { |
134 | if ((int)InventoryType.LSL == item.InvType) | 134 | if ((int)InventoryType.LSL == item.InvType) |
135 | { | 135 | { |
136 | CreateScriptInstance(item, startParam, postOnRez); | 136 | CreateScriptInstance(item, startParam, postOnRez, engine); |
137 | } | 137 | } |
138 | } | 138 | } |
139 | } | 139 | } |
@@ -162,7 +162,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
162 | /// </summary> | 162 | /// </summary> |
163 | /// <param name="item"></param> | 163 | /// <param name="item"></param> |
164 | /// <returns></returns> | 164 | /// <returns></returns> |
165 | public void CreateScriptInstance(TaskInventoryItem item, int startParam, bool postOnRez) | 165 | public void CreateScriptInstance(TaskInventoryItem item, int startParam, bool postOnRez, string engine) |
166 | { | 166 | { |
167 | // m_log.InfoFormat( | 167 | // m_log.InfoFormat( |
168 | // "[PRIM INVENTORY]: " + | 168 | // "[PRIM INVENTORY]: " + |
@@ -193,7 +193,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
193 | m_taskInventory[item.ItemID].PermsGranter = UUID.Zero; | 193 | m_taskInventory[item.ItemID].PermsGranter = UUID.Zero; |
194 | string script = Utils.BytesToString(asset.Data); | 194 | string script = Utils.BytesToString(asset.Data); |
195 | m_parentGroup.Scene.EventManager.TriggerRezScript(LocalId, item.ItemID, script, | 195 | m_parentGroup.Scene.EventManager.TriggerRezScript(LocalId, item.ItemID, script, |
196 | startParam, postOnRez); | 196 | startParam, postOnRez, engine); |
197 | m_parentGroup.AddActiveScriptCount(1); | 197 | m_parentGroup.AddActiveScriptCount(1); |
198 | ScheduleFullUpdate(); | 198 | ScheduleFullUpdate(); |
199 | } | 199 | } |
@@ -207,13 +207,13 @@ namespace OpenSim.Region.Environment.Scenes | |||
207 | /// <param name="itemId"> | 207 | /// <param name="itemId"> |
208 | /// A <see cref="UUID"/> | 208 | /// A <see cref="UUID"/> |
209 | /// </param> | 209 | /// </param> |
210 | public void CreateScriptInstance(UUID itemId, int startParam, bool postOnRez) | 210 | public void CreateScriptInstance(UUID itemId, int startParam, bool postOnRez, string engine) |
211 | { | 211 | { |
212 | lock (m_taskInventory) | 212 | lock (m_taskInventory) |
213 | { | 213 | { |
214 | if (m_taskInventory.ContainsKey(itemId)) | 214 | if (m_taskInventory.ContainsKey(itemId)) |
215 | { | 215 | { |
216 | CreateScriptInstance(m_taskInventory[itemId], startParam, postOnRez); | 216 | CreateScriptInstance(m_taskInventory[itemId], startParam, postOnRez, engine); |
217 | } | 217 | } |
218 | else | 218 | else |
219 | { | 219 | { |
diff --git a/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/EventManager.cs b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/EventManager.cs index 5a9385f..4a4e808 100644 --- a/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/EventManager.cs +++ b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/EventManager.cs | |||
@@ -65,31 +65,36 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase | |||
65 | myScriptEngine = _ScriptEngine; | 65 | myScriptEngine = _ScriptEngine; |
66 | ReadConfig(); | 66 | ReadConfig(); |
67 | 67 | ||
68 | // Hook up to events from OpenSim | ||
69 | // We may not want to do it because someone is controlling us and will deliver events to us | ||
70 | if (performHookUp) | 68 | if (performHookUp) |
71 | { | 69 | { |
72 | myScriptEngine.Log.Info("[" + myScriptEngine.ScriptEngineName + "]: Hooking up to server events"); | ||
73 | myScriptEngine.World.EventManager.OnObjectGrab += touch_start; | ||
74 | myScriptEngine.World.EventManager.OnObjectDeGrab += touch_end; | ||
75 | myScriptEngine.World.EventManager.OnRezScript += OnRezScript; | 70 | myScriptEngine.World.EventManager.OnRezScript += OnRezScript; |
76 | myScriptEngine.World.EventManager.OnRemoveScript += OnRemoveScript; | 71 | } |
77 | myScriptEngine.World.EventManager.OnScriptChangedEvent += changed; | 72 | } |
78 | myScriptEngine.World.EventManager.OnScriptAtTargetEvent += at_target; | 73 | |
79 | myScriptEngine.World.EventManager.OnScriptNotAtTargetEvent += not_at_target; | 74 | public void HookUpEvents() |
80 | myScriptEngine.World.EventManager.OnScriptControlEvent += control; | 75 | { |
81 | myScriptEngine.World.EventManager.OnScriptColliderStart += collision_start; | 76 | // Hook up to events from OpenSim |
82 | myScriptEngine.World.EventManager.OnScriptColliding += collision; | 77 | // We may not want to do it because someone is controlling us and will deliver events to us |
83 | myScriptEngine.World.EventManager.OnScriptCollidingEnd += collision_end; | ||
84 | |||
85 | // TODO: HOOK ALL EVENTS UP TO SERVER! | ||
86 | IMoneyModule money=myScriptEngine.World.RequestModuleInterface<IMoneyModule>(); | ||
87 | if (money != null) | ||
88 | { | ||
89 | money.OnObjectPaid+=HandleObjectPaid; | ||
90 | } | ||
91 | 78 | ||
79 | myScriptEngine.Log.Info("[" + myScriptEngine.ScriptEngineName + "]: Hooking up to server events"); | ||
80 | myScriptEngine.World.EventManager.OnObjectGrab += touch_start; | ||
81 | myScriptEngine.World.EventManager.OnObjectDeGrab += touch_end; | ||
82 | myScriptEngine.World.EventManager.OnRemoveScript += OnRemoveScript; | ||
83 | myScriptEngine.World.EventManager.OnScriptChangedEvent += changed; | ||
84 | myScriptEngine.World.EventManager.OnScriptAtTargetEvent += at_target; | ||
85 | myScriptEngine.World.EventManager.OnScriptNotAtTargetEvent += not_at_target; | ||
86 | myScriptEngine.World.EventManager.OnScriptControlEvent += control; | ||
87 | myScriptEngine.World.EventManager.OnScriptColliderStart += collision_start; | ||
88 | myScriptEngine.World.EventManager.OnScriptColliding += collision; | ||
89 | myScriptEngine.World.EventManager.OnScriptCollidingEnd += collision_end; | ||
90 | |||
91 | // TODO: HOOK ALL EVENTS UP TO SERVER! | ||
92 | IMoneyModule money=myScriptEngine.World.RequestModuleInterface<IMoneyModule>(); | ||
93 | if (money != null) | ||
94 | { | ||
95 | money.OnObjectPaid+=HandleObjectPaid; | ||
92 | } | 96 | } |
97 | |||
93 | } | 98 | } |
94 | 99 | ||
95 | public void ReadConfig() | 100 | public void ReadConfig() |
@@ -187,8 +192,11 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase | |||
187 | myScriptEngine.m_EventQueueManager.AddToObjectQueue(localID, "touch_end", detstruct, new object[] { new LSL_Types.LSLInteger(1) }); | 192 | myScriptEngine.m_EventQueueManager.AddToObjectQueue(localID, "touch_end", detstruct, new object[] { new LSL_Types.LSLInteger(1) }); |
188 | } | 193 | } |
189 | 194 | ||
190 | public void OnRezScript(uint localID, UUID itemID, string script, int startParam, bool postOnRez) | 195 | public void OnRezScript(uint localID, UUID itemID, string script, int startParam, bool postOnRez, string engine) |
191 | { | 196 | { |
197 | if (engine != "DotNetEngine") | ||
198 | return; | ||
199 | |||
192 | myScriptEngine.Log.Debug("OnRezScript localID: " + localID + " LLUID: " + itemID.ToString() + " Size: " + | 200 | myScriptEngine.Log.Debug("OnRezScript localID: " + localID + " LLUID: " + itemID.ToString() + " Size: " + |
193 | script.Length); | 201 | script.Length); |
194 | myScriptEngine.m_ScriptManager.StartScript(localID, itemID, script, startParam, postOnRez); | 202 | myScriptEngine.m_ScriptManager.StartScript(localID, itemID, script, startParam, postOnRez); |
diff --git a/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/EventQueueManager.cs b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/EventQueueManager.cs index af7fca3..282559a 100644 --- a/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/EventQueueManager.cs +++ b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/EventQueueManager.cs | |||
@@ -353,6 +353,11 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase | |||
353 | /// <param name="param">Array of parameters to match event mask</param> | 353 | /// <param name="param">Array of parameters to match event mask</param> |
354 | public void AddToScriptQueue(uint localID, UUID itemID, string FunctionName, Queue_llDetectParams_Struct qParams, params object[] param) | 354 | public void AddToScriptQueue(uint localID, UUID itemID, string FunctionName, Queue_llDetectParams_Struct qParams, params object[] param) |
355 | { | 355 | { |
356 | List<UUID> keylist = new List<UUID>(m_ScriptEngine.m_ScriptManager.GetScriptKeys(localID)); | ||
357 | |||
358 | if (!keylist.Contains(itemID)) // We don't manage that script | ||
359 | return; | ||
360 | |||
356 | lock (eventQueue) | 361 | lock (eventQueue) |
357 | { | 362 | { |
358 | if (eventQueue.Count >= EventExecutionMaxQueueSize) | 363 | if (eventQueue.Count >= EventExecutionMaxQueueSize) |
diff --git a/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/ScriptEngine.cs b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/ScriptEngine.cs index b0c6314..26e5ec2 100644 --- a/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/ScriptEngine.cs +++ b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/ScriptEngine.cs | |||
@@ -56,6 +56,8 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase | |||
56 | public IConfigSource ConfigSource; | 56 | public IConfigSource ConfigSource; |
57 | public IConfig ScriptConfigSource; | 57 | public IConfig ScriptConfigSource; |
58 | public abstract string ScriptEngineName { get; } | 58 | public abstract string ScriptEngineName { get; } |
59 | private bool m_enabled = true; | ||
60 | private bool m_hookUpToServer = false; | ||
59 | 61 | ||
60 | /// <summary> | 62 | /// <summary> |
61 | /// How many seconds between re-reading config-file. 0 = never. ScriptEngine will try to adjust to new config changes. | 63 | /// How many seconds between re-reading config-file. 0 = never. ScriptEngine will try to adjust to new config changes. |
@@ -91,6 +93,8 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase | |||
91 | { | 93 | { |
92 | World = Sceneworld; | 94 | World = Sceneworld; |
93 | ConfigSource = config; | 95 | ConfigSource = config; |
96 | m_hookUpToServer = HookUpToServer; | ||
97 | |||
94 | m_log.Info("[" + ScriptEngineName + "]: ScriptEngine initializing"); | 98 | m_log.Info("[" + ScriptEngineName + "]: ScriptEngine initializing"); |
95 | 99 | ||
96 | // Make sure we have config | 100 | // Make sure we have config |
@@ -98,13 +102,16 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase | |||
98 | ConfigSource.AddConfig(ScriptEngineName); | 102 | ConfigSource.AddConfig(ScriptEngineName); |
99 | ScriptConfigSource = ConfigSource.Configs[ScriptEngineName]; | 103 | ScriptConfigSource = ConfigSource.Configs[ScriptEngineName]; |
100 | 104 | ||
105 | m_enabled = ScriptConfigSource.GetBoolean("Enabled", true); | ||
106 | if (!m_enabled) | ||
107 | return; | ||
108 | |||
101 | //m_log.Info("[" + ScriptEngineName + "]: InitializeEngine"); | 109 | //m_log.Info("[" + ScriptEngineName + "]: InitializeEngine"); |
102 | 110 | ||
103 | // Create all objects we'll be using | 111 | // Create all objects we'll be using |
104 | m_EventQueueManager = new EventQueueManager(this); | 112 | m_EventQueueManager = new EventQueueManager(this); |
105 | m_EventManager = new EventManager(this, HookUpToServer); | 113 | m_EventManager = new EventManager(this, HookUpToServer); |
106 | // We need to start it | 114 | // We need to start it |
107 | newScriptManager.Start(); | ||
108 | m_ScriptManager = newScriptManager; | 115 | m_ScriptManager = newScriptManager; |
109 | m_AppDomainManager = new AppDomainManager(this); | 116 | m_AppDomainManager = new AppDomainManager(this); |
110 | m_ASYNCLSLCommandManager = new AsyncCommandManager(this); | 117 | m_ASYNCLSLCommandManager = new AsyncCommandManager(this); |
@@ -118,6 +125,17 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase | |||
118 | // Or can we assume we are loaded before anything else so we can use proper events? | 125 | // Or can we assume we are loaded before anything else so we can use proper events? |
119 | } | 126 | } |
120 | 127 | ||
128 | public void PostInitialise() | ||
129 | { | ||
130 | if (!m_enabled) | ||
131 | return; | ||
132 | |||
133 | if (m_hookUpToServer) | ||
134 | m_EventManager.HookUpEvents(); | ||
135 | |||
136 | m_ScriptManager.Start(); | ||
137 | } | ||
138 | |||
121 | public void Shutdown() | 139 | public void Shutdown() |
122 | { | 140 | { |
123 | // We are shutting down | 141 | // We are shutting down |
@@ -155,10 +173,6 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase | |||
155 | 173 | ||
156 | public abstract void Initialise(Scene scene, IConfigSource config); | 174 | public abstract void Initialise(Scene scene, IConfigSource config); |
157 | 175 | ||
158 | public void PostInitialise() | ||
159 | { | ||
160 | } | ||
161 | |||
162 | public void Close() | 176 | public void Close() |
163 | { | 177 | { |
164 | } | 178 | } |
diff --git a/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/ScriptManager.cs b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/ScriptManager.cs index 60333b1..47cb2fd 100644 --- a/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/ScriptManager.cs +++ b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/ScriptManager.cs | |||
@@ -64,6 +64,7 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase | |||
64 | private static bool PrivateThread; | 64 | private static bool PrivateThread; |
65 | private int LoadUnloadMaxQueueSize; | 65 | private int LoadUnloadMaxQueueSize; |
66 | private Object scriptLock = new Object(); | 66 | private Object scriptLock = new Object(); |
67 | private bool m_started = false; | ||
67 | 68 | ||
68 | // Load/Unload structure | 69 | // Load/Unload structure |
69 | private struct LUStruct | 70 | private struct LUStruct |
@@ -119,6 +120,8 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase | |||
119 | public abstract void Initialize(); | 120 | public abstract void Initialize(); |
120 | public void Start() | 121 | public void Start() |
121 | { | 122 | { |
123 | m_started = true; | ||
124 | |||
122 | ReadConfig(); | 125 | ReadConfig(); |
123 | Initialize(); | 126 | Initialize(); |
124 | 127 | ||
@@ -213,6 +216,9 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase | |||
213 | 216 | ||
214 | public void DoScriptLoadUnload() | 217 | public void DoScriptLoadUnload() |
215 | { | 218 | { |
219 | if (!m_started) | ||
220 | return; | ||
221 | |||
216 | lock (LUQueue) | 222 | lock (LUQueue) |
217 | { | 223 | { |
218 | if (LUQueue.Count > 0) | 224 | if (LUQueue.Count > 0) |
@@ -258,7 +264,7 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase | |||
258 | { | 264 | { |
259 | lock (LUQueue) | 265 | lock (LUQueue) |
260 | { | 266 | { |
261 | if (LUQueue.Count >= LoadUnloadMaxQueueSize) | 267 | if ((LUQueue.Count >= LoadUnloadMaxQueueSize) && m_started) |
262 | { | 268 | { |
263 | m_scriptEngine.Log.Error("[" + m_scriptEngine.ScriptEngineName + "]: ERROR: Load/unload queue item count is at " + LUQueue.Count + ". Config variable \"LoadUnloadMaxQueueSize\" is set to " + LoadUnloadMaxQueueSize + ", so ignoring new script."); | 269 | m_scriptEngine.Log.Error("[" + m_scriptEngine.ScriptEngineName + "]: ERROR: Load/unload queue item count is at " + LUQueue.Count + ". Config variable \"LoadUnloadMaxQueueSize\" is set to " + LoadUnloadMaxQueueSize + ", so ignoring new script."); |
264 | return; | 270 | return; |
diff --git a/OpenSim/Region/ScriptEngine/Common/ScriptServerInterfaces.cs b/OpenSim/Region/ScriptEngine/Common/ScriptServerInterfaces.cs index a6473ee..aa8dc61 100644 --- a/OpenSim/Region/ScriptEngine/Common/ScriptServerInterfaces.cs +++ b/OpenSim/Region/ScriptEngine/Common/ScriptServerInterfaces.cs | |||
@@ -39,7 +39,7 @@ namespace OpenSim.Region.ScriptEngine.Common | |||
39 | public interface RemoteEvents | 39 | public interface RemoteEvents |
40 | { | 40 | { |
41 | void touch_start(uint localID, uint originalID, Vector3 offsetPos, IClientAPI remoteClient); | 41 | void touch_start(uint localID, uint originalID, Vector3 offsetPos, IClientAPI remoteClient); |
42 | void OnRezScript(uint localID, UUID itemID, string script, int startParam, bool postOnRez); | 42 | void OnRezScript(uint localID, UUID itemID, string script, int startParam, bool postOnRez, string engine); |
43 | void OnRemoveScript(uint localID, UUID itemID); | 43 | void OnRemoveScript(uint localID, UUID itemID); |
44 | void state_exit(uint localID); | 44 | void state_exit(uint localID); |
45 | void touch(uint localID, uint originalID, UUID itemID); | 45 | void touch(uint localID, uint originalID, UUID itemID); |
diff --git a/OpenSim/Region/ScriptEngine/Shared/CodeTools/Compiler.cs b/OpenSim/Region/ScriptEngine/Shared/CodeTools/Compiler.cs index c88cd05..b14e7ac 100644 --- a/OpenSim/Region/ScriptEngine/Shared/CodeTools/Compiler.cs +++ b/OpenSim/Region/ScriptEngine/Shared/CodeTools/Compiler.cs | |||
@@ -82,7 +82,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
82 | 82 | ||
83 | // private static int instanceID = new Random().Next(0, int.MaxValue); // Unique number to use on our compiled files | 83 | // private static int instanceID = new Random().Next(0, int.MaxValue); // Unique number to use on our compiled files |
84 | private static UInt64 scriptCompileCounter = 0; // And a counter | 84 | private static UInt64 scriptCompileCounter = 0; // And a counter |
85 | private bool m_UseCompiler = true; | ||
86 | 85 | ||
87 | public IScriptEngine m_scriptEngine; | 86 | public IScriptEngine m_scriptEngine; |
88 | public Compiler(IScriptEngine scriptEngine) | 87 | public Compiler(IScriptEngine scriptEngine) |
@@ -93,8 +92,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
93 | public bool in_startup = true; | 92 | public bool in_startup = true; |
94 | public void ReadConfig() | 93 | public void ReadConfig() |
95 | { | 94 | { |
96 | m_UseCompiler = m_scriptEngine.Config.GetBoolean("UseNewCompiler", true); | ||
97 | |||
98 | // Get some config | 95 | // Get some config |
99 | WriteScriptSourceToDebugFile = m_scriptEngine.Config.GetBoolean("WriteScriptSourceToDebugFile", true); | 96 | WriteScriptSourceToDebugFile = m_scriptEngine.Config.GetBoolean("WriteScriptSourceToDebugFile", true); |
100 | CompileWithDebugInformation = m_scriptEngine.Config.GetBoolean("CompileWithDebugInformation", true); | 97 | CompileWithDebugInformation = m_scriptEngine.Config.GetBoolean("CompileWithDebugInformation", true); |
@@ -327,14 +324,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
327 | { | 324 | { |
328 | // Its LSL, convert it to C# | 325 | // Its LSL, convert it to C# |
329 | //compileScript = LSL_Converter.Convert(Script); | 326 | //compileScript = LSL_Converter.Convert(Script); |
330 | if (m_UseCompiler) | 327 | LSL_Converter = (ICodeConverter)new CSCodeGenerator(); |
331 | LSL_Converter = (ICodeConverter)new CSCodeGenerator(); | ||
332 | else | ||
333 | LSL_Converter = (ICodeConverter)new LSL2CSConverter(); | ||
334 | compileScript = LSL_Converter.Convert(Script); | 328 | compileScript = LSL_Converter.Convert(Script); |
335 | 329 | ||
336 | if (m_UseCompiler) | 330 | m_positionMap = ((CSCodeGenerator) LSL_Converter).PositionMap; |
337 | m_positionMap = ((CSCodeGenerator) LSL_Converter).PositionMap; | ||
338 | 331 | ||
339 | l = enumCompileType.cs; | 332 | l = enumCompileType.cs; |
340 | } | 333 | } |
@@ -549,31 +542,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
549 | severity = "Warning"; | 542 | severity = "Warning"; |
550 | } | 543 | } |
551 | 544 | ||
552 | if (m_UseCompiler) | 545 | KeyValuePair<int, int> lslPos; |
553 | { | ||
554 | KeyValuePair<int, int> lslPos; | ||
555 | |||
556 | try | ||
557 | { | ||
558 | lslPos = m_positionMap[new KeyValuePair<int, int>(CompErr.Line, CompErr.Column)]; | ||
559 | } | ||
560 | catch (KeyNotFoundException) // we don't have this line/column mapped | ||
561 | { | ||
562 | m_scriptEngine.Log.Debug(String.Format("[Compiler]: Lookup of C# line {0}, column {1} failed.", CompErr.Line, CompErr.Column)); | ||
563 | lslPos = new KeyValuePair<int, int>(-CompErr.Line, -CompErr.Column); | ||
564 | } | ||
565 | |||
566 | // The Second Life viewer's script editor begins | ||
567 | // countingn lines and columns at 0, so we subtract 1. | ||
568 | errtext += String.Format("Line {0}, column {1}, {4} Number: {2}, '{3}'\r\n", lslPos.Key - 1, lslPos.Value - 1, CompErr.ErrorNumber, CompErr.ErrorText, severity); | ||
569 | 546 | ||
547 | try | ||
548 | { | ||
549 | lslPos = m_positionMap[new KeyValuePair<int, int>(CompErr.Line, CompErr.Column)]; | ||
570 | } | 550 | } |
571 | else | 551 | catch (KeyNotFoundException) // we don't have this line/column mapped |
572 | { | 552 | { |
573 | errtext += "Line number " + (CompErr.Line - LinesToRemoveOnError) + | 553 | m_scriptEngine.Log.Debug(String.Format("[Compiler]: Lookup of C# line {0}, column {1} failed.", CompErr.Line, CompErr.Column)); |
574 | ", " + severity + " Number: " + CompErr.ErrorNumber + | 554 | lslPos = new KeyValuePair<int, int>(-CompErr.Line, -CompErr.Column); |
575 | ", '" + CompErr.ErrorText + "'\r\n"; | ||
576 | } | 555 | } |
556 | |||
557 | // The Second Life viewer's script editor begins | ||
558 | // countingn lines and columns at 0, so we subtract 1. | ||
559 | errtext += String.Format("Line {0}, column {1}, {4} Number: {2}, '{3}'\r\n", lslPos.Key - 1, lslPos.Value - 1, CompErr.ErrorNumber, CompErr.ErrorText, severity); | ||
577 | } | 560 | } |
578 | 561 | ||
579 | Console.WriteLine("[COMPILER MESSAGES]: " + errtext); | 562 | Console.WriteLine("[COMPILER MESSAGES]: " + errtext); |
diff --git a/OpenSim/Region/ScriptEngine/Shared/CodeTools/LSL2CSConverter.cs b/OpenSim/Region/ScriptEngine/Shared/CodeTools/LSL2CSConverter.cs deleted file mode 100644 index 57efb2e..0000000 --- a/OpenSim/Region/ScriptEngine/Shared/CodeTools/LSL2CSConverter.cs +++ /dev/null | |||
@@ -1,374 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSim Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS AS IS AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | * | ||
27 | */ | ||
28 | |||
29 | using System; | ||
30 | using System.Collections.Generic; | ||
31 | using System.Text.RegularExpressions; | ||
32 | |||
33 | namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | ||
34 | { | ||
35 | public class LSL2CSConverter : ICodeConverter | ||
36 | { | ||
37 | // Uses regex to convert LSL code to C# code. | ||
38 | |||
39 | //private Regex rnw = new Regex(@"[a-zA-Z0-9_\-]", RegexOptions.Compiled); | ||
40 | private Dictionary<string, string> dataTypes = new Dictionary<string, string>(); | ||
41 | private Dictionary<string, string> quotes = new Dictionary<string, string>(); | ||
42 | // c Style | ||
43 | private Regex cstylecomments = new Regex(@"/\*(.|[\r\n])*?\*/", RegexOptions.Compiled | RegexOptions.Multiline); | ||
44 | // c# one liners | ||
45 | private Regex nonCommentFwsl = new Regex("\"[a-zA-Z0-9.,:/\\n ]+//[^\"+]+([\\\\\\\"+]+)?(\\s+)?[\"+](\\s+)?(;)?", RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline); | ||
46 | private Regex conelinecomments = new Regex(@"[^:].?([\/]{2}[^\n]*)|([\n]{1,}[\/]{2}[^\n]*)", RegexOptions.Compiled | RegexOptions.Multiline); | ||
47 | // ([^\"])((?:[a-zA-Z])\.[a-zA-Z].?)([^\"]) | ||
48 | |||
49 | // value we're looking for: (?:[a-zA-Z])\.[a-zA-Z] | ||
50 | public LSL2CSConverter() | ||
51 | { | ||
52 | // Only the types we need to convert | ||
53 | dataTypes.Add("void", "void"); | ||
54 | dataTypes.Add("integer", "LSL_Types.LSLInteger"); | ||
55 | dataTypes.Add("float", "LSL_Types.LSLFloat"); | ||
56 | dataTypes.Add("string", "LSL_Types.LSLString"); | ||
57 | dataTypes.Add("key", "LSL_Types.LSLString"); | ||
58 | dataTypes.Add("vector", "LSL_Types.Vector3"); | ||
59 | dataTypes.Add("rotation", "LSL_Types.Quaternion"); | ||
60 | dataTypes.Add("list", "LSL_Types.list"); | ||
61 | dataTypes.Add("null", "null"); | ||
62 | } | ||
63 | |||
64 | public string Convert(string Script) | ||
65 | { | ||
66 | quotes.Clear(); | ||
67 | string Return = String.Empty; | ||
68 | Script = " \r\n" + Script; | ||
69 | |||
70 | // | ||
71 | // Prepare script for processing | ||
72 | // | ||
73 | |||
74 | // Clean up linebreaks | ||
75 | Script = Regex.Replace(Script, @"\r\n", "\n"); | ||
76 | Script = Regex.Replace(Script, @"\n", "\r\n"); | ||
77 | |||
78 | // QUOTE REPLACEMENT | ||
79 | // temporarily replace quotes so we can work our magic on the script without | ||
80 | // always considering if we are inside our outside quotes's | ||
81 | // TODO: Does this work on half-quotes in strings? ;) | ||
82 | string _Script = String.Empty; | ||
83 | string C; | ||
84 | bool in_quote = false; | ||
85 | bool quote_replaced = false; | ||
86 | string quote_replacement_string = "Q_U_O_T_E_REPLACEMENT_"; | ||
87 | string quote = String.Empty; | ||
88 | bool last_was_escape = false; | ||
89 | int quote_replaced_count = 0; | ||
90 | |||
91 | string removefwnoncomments = nonCommentFwsl.Replace(Script, "\"\";"); | ||
92 | |||
93 | string removecomments = conelinecomments.Replace(removefwnoncomments, ""); | ||
94 | removecomments = cstylecomments.Replace(removecomments, ""); | ||
95 | string[] localscript = removecomments.Split('"'); | ||
96 | string checkscript = String.Empty; | ||
97 | bool flip = true; | ||
98 | |||
99 | for (int p = 0; p < localscript.Length; p++) | ||
100 | { | ||
101 | //if (localscript[p].Length >= 1) | ||
102 | //{ | ||
103 | if (!localscript[p].EndsWith(@"\")) | ||
104 | { | ||
105 | flip = !flip; | ||
106 | //System.Console.WriteLine("Flip:" + flip.ToString() + " - " + localscript[p] + " ! " + localscript[p].EndsWith(@"\").ToString()); | ||
107 | } | ||
108 | //} | ||
109 | //else | ||
110 | //{ | ||
111 | // flip = !flip; | ||
112 | // System.Console.WriteLine("Flip:" + flip.ToString() + " - " + localscript[p]); | ||
113 | //} | ||
114 | if (!flip) | ||
115 | checkscript += localscript[p]; | ||
116 | } | ||
117 | |||
118 | //System.Console.WriteLine("SCRIPT:" + checkscript); | ||
119 | |||
120 | // checks for alpha.alpha way of referring to objects in C# | ||
121 | // ignores alpha.X alpha.Y, alpha.Z for refering to vector components | ||
122 | Match SecurityM; | ||
123 | |||
124 | // BROKEN: this check is very wrong. It block's any url in strings. | ||
125 | SecurityM = Regex.Match(checkscript, @"(?:[a-zA-Z])\.(?:[a-rt-wA-Z]|[a-zA-Z][a-zA-Z])", RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline); | ||
126 | |||
127 | if (SecurityM.Success) | ||
128 | throw new Exception("CS0103: 'The . symbol cannot be used in LSL except in float values or vector components'. Detected around: " + SecurityM.Captures[0].Value); | ||
129 | |||
130 | SecurityM = Regex.Match(checkscript, @"typeof\s", RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline); | ||
131 | if (SecurityM.Success) | ||
132 | throw new Exception("CS0103: 'The object.typeof method isn't allowed in LSL'"); | ||
133 | |||
134 | SecurityM = Regex.Match(checkscript, @"GetType\(", RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline); | ||
135 | if (SecurityM.Success) | ||
136 | throw new Exception("CS0103: 'The object.GetType method isn't allowed in LSL'"); | ||
137 | |||
138 | for (int p = 0; p < Script.Length; p++) | ||
139 | { | ||
140 | C = Script.Substring(p, 1); | ||
141 | while (true) | ||
142 | { | ||
143 | // found " and last was not \ so this is not an escaped \" | ||
144 | if (C == "\"" && last_was_escape == false) | ||
145 | { | ||
146 | // Toggle inside/outside quote | ||
147 | in_quote = !in_quote; | ||
148 | if (in_quote) | ||
149 | { | ||
150 | quote_replaced_count++; | ||
151 | } | ||
152 | else | ||
153 | { | ||
154 | if (quote == String.Empty) | ||
155 | { | ||
156 | // We didn't replace quote, probably because of empty string? | ||
157 | _Script += quote_replacement_string + | ||
158 | quote_replaced_count.ToString().PadLeft(5, "0".ToCharArray()[0]); | ||
159 | } | ||
160 | // We just left a quote | ||
161 | quotes.Add( | ||
162 | quote_replacement_string + | ||
163 | quote_replaced_count.ToString().PadLeft(5, "0".ToCharArray()[0]), quote); | ||
164 | quote = String.Empty; | ||
165 | } | ||
166 | break; | ||
167 | } | ||
168 | |||
169 | if (!in_quote) | ||
170 | { | ||
171 | // We are not inside a quote | ||
172 | quote_replaced = false; | ||
173 | } | ||
174 | else | ||
175 | { | ||
176 | // We are inside a quote | ||
177 | if (!quote_replaced) | ||
178 | { | ||
179 | // Replace quote | ||
180 | _Script += quote_replacement_string + | ||
181 | quote_replaced_count.ToString().PadLeft(5, "0".ToCharArray()[0]); | ||
182 | quote_replaced = true; | ||
183 | } | ||
184 | quote += C; | ||
185 | break; | ||
186 | } | ||
187 | _Script += C; | ||
188 | break; | ||
189 | } | ||
190 | last_was_escape = false; | ||
191 | if (C == @"\") | ||
192 | { | ||
193 | last_was_escape = true; | ||
194 | } | ||
195 | } | ||
196 | Script = _Script; | ||
197 | // | ||
198 | // END OF QUOTE REPLACEMENT | ||
199 | // | ||
200 | |||
201 | // | ||
202 | // PROCESS STATES | ||
203 | // Remove state definitions and add state names to start of each event within state | ||
204 | // | ||
205 | int ilevel = 0; | ||
206 | int lastlevel = 0; | ||
207 | string ret = String.Empty; | ||
208 | string cache = String.Empty; | ||
209 | bool in_state = false; | ||
210 | string current_statename = String.Empty; | ||
211 | for (int p = 0; p < Script.Length; p++) | ||
212 | { | ||
213 | C = Script.Substring(p, 1); | ||
214 | while (true) | ||
215 | { | ||
216 | // inc / dec level | ||
217 | if (C == @"{") | ||
218 | ilevel++; | ||
219 | if (C == @"}") | ||
220 | ilevel--; | ||
221 | if (ilevel < 0) | ||
222 | ilevel = 0; | ||
223 | cache += C; | ||
224 | |||
225 | // if level == 0, add to return | ||
226 | if (ilevel == 1 && lastlevel == 0) | ||
227 | { | ||
228 | // 0 => 1: Get last | ||
229 | Match m = | ||
230 | //Regex.Match(cache, @"(?![a-zA-Z_]+)\s*([a-zA-Z_]+)[^a-zA-Z_\(\)]*{", | ||
231 | Regex.Match(cache, @"(?![a-zA-Z_]+)\s*(state\s+)?(?<statename>[a-zA-Z_][a-zA-Z_0-9]*)[^a-zA-Z_0-9\(\)]*{", | ||
232 | |||
233 | RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline); | ||
234 | |||
235 | in_state = false; | ||
236 | if (m.Success) | ||
237 | { | ||
238 | // Go back to level 0, this is not a state | ||
239 | in_state = true; | ||
240 | current_statename = m.Groups["statename"].Captures[0].Value; | ||
241 | //Console.WriteLine("Current statename: " + current_statename); | ||
242 | cache = | ||
243 | //@"(?<s1>(?![a-zA-Z_]+)\s*)" + @"([a-zA-Z_]+)(?<s2>[^a-zA-Z_\(\)]*){", | ||
244 | Regex.Replace(cache, | ||
245 | @"(?<s1>(?![a-zA-Z_]+)\s*)" + @"(state\s+)?([a-zA-Z_][a-zA-Z_0-9]*)(?<s2>[^a-zA-Z_0-9\(\)]*){", | ||
246 | "${s1}${s2}", | ||
247 | RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline | RegexOptions.IgnoreCase); | ||
248 | } | ||
249 | ret += cache; | ||
250 | cache = String.Empty; | ||
251 | } | ||
252 | if (ilevel == 0 && lastlevel == 1) | ||
253 | { | ||
254 | // 1 => 0: Remove last } | ||
255 | if (in_state == true) | ||
256 | { | ||
257 | cache = cache.Remove(cache.Length - 1, 1); | ||
258 | //cache = Regex.Replace(cache, "}$", String.Empty, RegexOptions.Multiline | RegexOptions.Singleline); | ||
259 | |||
260 | //Replace function names | ||
261 | // void dataserver(key query_id, string data) { | ||
262 | //cache = Regex.Replace(cache, @"([^a-zA-Z_]\s*)((?!if|switch|for)[a-zA-Z_]+\s*\([^\)]*\)[^{]*{)", "$1" + "<STATE>" + "$2", RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline); | ||
263 | //Console.WriteLine("Replacing using statename: " + current_statename); | ||
264 | cache = | ||
265 | Regex.Replace(cache, | ||
266 | @"^(\s*)((?!(if|switch|for|while)[^a-zA-Z0-9_])[a-zA-Z0-9_]*\s*\([^\)]*\)[^;]*\{)", | ||
267 | @"$1public " + current_statename + "_event_$2", | ||
268 | RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline | RegexOptions.IgnoreCase); | ||
269 | } | ||
270 | |||
271 | ret += cache; | ||
272 | cache = String.Empty; | ||
273 | in_state = true; | ||
274 | current_statename = String.Empty; | ||
275 | } | ||
276 | |||
277 | break; | ||
278 | } | ||
279 | lastlevel = ilevel; | ||
280 | } | ||
281 | ret += cache; | ||
282 | cache = String.Empty; | ||
283 | |||
284 | Script = ret; | ||
285 | ret = String.Empty; | ||
286 | |||
287 | foreach (string key in dataTypes.Keys) | ||
288 | { | ||
289 | string val; | ||
290 | dataTypes.TryGetValue(key, out val); | ||
291 | |||
292 | // Replace CAST - (integer) with (int) | ||
293 | Script = | ||
294 | Regex.Replace(Script, @"\(" + key + @"\)", @"(" + val + ")", | ||
295 | RegexOptions.Compiled | RegexOptions.Multiline); | ||
296 | // Replace return types and function variables - integer a() and f(integer a, integer a) | ||
297 | Script = | ||
298 | Regex.Replace(Script, @"(^|;|}|[\(,])(\s*)" + key + @"(\s+)", @"$1$2" + val + "$3", | ||
299 | RegexOptions.Compiled | RegexOptions.Multiline); | ||
300 | Script = | ||
301 | Regex.Replace(Script, @"(^|;|}|[\(,])(\s*)" + key + @"(\s*)[,]", @"$1$2" + val + "$3,", | ||
302 | RegexOptions.Compiled | RegexOptions.Multiline); | ||
303 | } | ||
304 | |||
305 | // Change jumps into goto's and prefix its label | ||
306 | Script = | ||
307 | Regex.Replace(Script, | ||
308 | @"(\W)jump\s+([a-zA-Z_][a-zA-Z_0-9]*)\s*;", | ||
309 | @"$1goto label_$2;", RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline); | ||
310 | // and prefix labels so the do not clash with C#'s reserved words | ||
311 | Script = | ||
312 | Regex.Replace(Script, | ||
313 | @"@([a-zA-Z_][a-zA-Z_0-9]*)\s*;", | ||
314 | @"label_$1: ;", RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline); | ||
315 | |||
316 | // Add "void" in front of functions that needs it | ||
317 | Script = | ||
318 | Regex.Replace(Script, | ||
319 | @"^(\s*public\s+)?((?!(if|switch|for)[^a-zA-Z0-9_])[a-zA-Z0-9_]*\s*\([^\)]*\)[^;]*\{)", | ||
320 | @"$1void $2", RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline); | ||
321 | |||
322 | // Replace <x,y,z> and <x,y,z,r> | ||
323 | Script = | ||
324 | Regex.Replace(Script, @"<([^,>;]*,[^,>;]*,[^,>;]*,[^,>;]*)>", @"new LSL_Types.Quaternion($1)", | ||
325 | RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline); | ||
326 | Script = | ||
327 | Regex.Replace(Script, @"<([^,>;)]*,[^,>;]*,[^,>;]*)>", @"new LSL_Types.Vector3($1)", | ||
328 | RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline); | ||
329 | |||
330 | // Replace List []'s | ||
331 | Script = | ||
332 | Regex.Replace(Script, @"\[([^\]]*)\]", @"new LSL_Types.list($1)", | ||
333 | RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline); | ||
334 | |||
335 | // Replace (string) to .ToString() // | ||
336 | Script = | ||
337 | Regex.Replace(Script, @"\(string\)\s*([a-zA-Z0-9_.]+(\s*\([^\)]*\))?)", @"$1.ToString()", | ||
338 | RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline); | ||
339 | Script = | ||
340 | Regex.Replace(Script, @"\((float|int)\)\s*([a-zA-Z0-9_.]+(\s*\([^\)]*\))?)", @"$1.Parse($2)", | ||
341 | RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline); | ||
342 | |||
343 | // Replace "state STATENAME" with "state("statename")" | ||
344 | Script = | ||
345 | Regex.Replace(Script, @"(state)\s+([^;\n\r]+)(;[\r\n\s])", "$1(\"$2\")$3", | ||
346 | RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline | RegexOptions.IgnoreCase); | ||
347 | |||
348 | // REPLACE BACK QUOTES | ||
349 | foreach (string key in quotes.Keys) | ||
350 | { | ||
351 | string val; | ||
352 | quotes.TryGetValue(key, out val); | ||
353 | Script = Script.Replace(key, "\"" + val + "\""); | ||
354 | } | ||
355 | |||
356 | //System.Console.WriteLine(Script); | ||
357 | Return = String.Empty;// + | ||
358 | //"using OpenSim.Region.ScriptEngine.Shared; using System.Collections.Generic;"; | ||
359 | |||
360 | //Return += String.Empty + | ||
361 | // "namespace SecondLife { "; | ||
362 | //Return += String.Empty + | ||
363 | // //"[Serializable] " + | ||
364 | // "public class Script : OpenSim.Region.ScriptEngine.Shared.LSL_BaseClass { "; | ||
365 | //Return += @"public Script() { } "; | ||
366 | Return += Script; | ||
367 | //Return += "} }\r\n"; | ||
368 | |||
369 | quotes.Clear(); | ||
370 | |||
371 | return Return; | ||
372 | } | ||
373 | } | ||
374 | } | ||
diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs index d6e6dae..c72d281 100644 --- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs | |||
@@ -67,6 +67,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
67 | private int m_SleepTime; | 67 | private int m_SleepTime; |
68 | private int m_SaveTime; | 68 | private int m_SaveTime; |
69 | private ThreadPriority m_Prio; | 69 | private ThreadPriority m_Prio; |
70 | private bool m_Enabled = true; | ||
70 | 71 | ||
71 | // disable warning: need to keep a reference to XEngine.EventManager | 72 | // disable warning: need to keep a reference to XEngine.EventManager |
72 | // alive to avoid it being garbage collected | 73 | // alive to avoid it being garbage collected |
@@ -151,21 +152,26 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
151 | // | 152 | // |
152 | public void Initialise(Scene scene, IConfigSource configSource) | 153 | public void Initialise(Scene scene, IConfigSource configSource) |
153 | { | 154 | { |
154 | AppDomain.CurrentDomain.AssemblyResolve += | ||
155 | OnAssemblyResolve; | ||
156 | |||
157 | m_log.InfoFormat("[XEngine] Initializing scripts in region {0}", | ||
158 | scene.RegionInfo.RegionName); | ||
159 | m_Scene = scene; | ||
160 | |||
161 | m_ScriptConfig = configSource.Configs["XEngine"]; | 155 | m_ScriptConfig = configSource.Configs["XEngine"]; |
162 | 156 | ||
163 | if (m_ScriptConfig == null) | 157 | if (m_ScriptConfig == null) |
164 | { | 158 | { |
165 | m_log.ErrorFormat("[XEngine] No script configuration found. Scripts disabled"); | 159 | // m_log.ErrorFormat("[XEngine] No script configuration found. Scripts disabled"); |
166 | return; | 160 | return; |
167 | } | 161 | } |
168 | 162 | ||
163 | m_Enabled = m_ScriptConfig.GetBoolean("Enabled", true); | ||
164 | |||
165 | if (!m_Enabled) | ||
166 | return; | ||
167 | |||
168 | AppDomain.CurrentDomain.AssemblyResolve += | ||
169 | OnAssemblyResolve; | ||
170 | |||
171 | m_log.InfoFormat("[XEngine] Initializing scripts in region {0}", | ||
172 | scene.RegionInfo.RegionName); | ||
173 | m_Scene = scene; | ||
174 | |||
169 | m_MinThreads = m_ScriptConfig.GetInt("MinThreads", 2); | 175 | m_MinThreads = m_ScriptConfig.GetInt("MinThreads", 2); |
170 | m_MaxThreads = m_ScriptConfig.GetInt("MaxThreads", 100); | 176 | m_MaxThreads = m_ScriptConfig.GetInt("MaxThreads", 100); |
171 | m_IdleTimeout = m_ScriptConfig.GetInt("IdleTimeout", 60); | 177 | m_IdleTimeout = m_ScriptConfig.GetInt("IdleTimeout", 60); |
@@ -220,6 +226,9 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
220 | 226 | ||
221 | public void PostInitialise() | 227 | public void PostInitialise() |
222 | { | 228 | { |
229 | if (!m_Enabled) | ||
230 | return; | ||
231 | |||
223 | m_EventManager = new EventManager(this); | 232 | m_EventManager = new EventManager(this); |
224 | 233 | ||
225 | m_Compiler = new Compiler(this); | 234 | m_Compiler = new Compiler(this); |
@@ -330,8 +339,11 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
330 | get { return false; } | 339 | get { return false; } |
331 | } | 340 | } |
332 | 341 | ||
333 | public void OnRezScript(uint localID, UUID itemID, string script, int startParam, bool postOnRez) | 342 | public void OnRezScript(uint localID, UUID itemID, string script, int startParam, bool postOnRez, string engine) |
334 | { | 343 | { |
344 | if (engine != "XEngine") | ||
345 | return; | ||
346 | |||
335 | Object[] parms = new Object[]{localID, itemID, script, startParam, postOnRez}; | 347 | Object[] parms = new Object[]{localID, itemID, script, startParam, postOnRez}; |
336 | 348 | ||
337 | lock (m_CompileQueue) | 349 | lock (m_CompileQueue) |