diff options
Diffstat (limited to 'OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs')
-rw-r--r-- | OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs | 57 |
1 files changed, 21 insertions, 36 deletions
diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs index c5d0752..979c84a 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs | |||
@@ -237,12 +237,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
237 | m_postOnRez = postOnRez; | 237 | m_postOnRez = postOnRez; |
238 | m_AttachedAvatar = Part.ParentGroup.AttachedAvatar; | 238 | m_AttachedAvatar = Part.ParentGroup.AttachedAvatar; |
239 | m_RegionID = Part.ParentGroup.Scene.RegionInfo.RegionID; | 239 | m_RegionID = Part.ParentGroup.Scene.RegionInfo.RegionID; |
240 | |||
241 | if (Engine.Config.GetString("ScriptStopStrategy", "abort") == "co-op") | ||
242 | { | ||
243 | m_coopTermination = true; | ||
244 | m_coopSleepHandle = new XEngineEventWaitHandle(false, EventResetMode.AutoReset); | ||
245 | } | ||
246 | } | 240 | } |
247 | 241 | ||
248 | /// <summary> | 242 | /// <summary> |
@@ -252,54 +246,38 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
252 | /// <param name='assembly'></param> | 246 | /// <param name='assembly'></param> |
253 | /// <param name='stateSource'></param> | 247 | /// <param name='stateSource'></param> |
254 | /// <returns>false if load failed, true if suceeded</returns> | 248 | /// <returns>false if load failed, true if suceeded</returns> |
255 | public bool Load(AppDomain dom, string assembly, StateSource stateSource) | 249 | public bool Load(AppDomain dom, Assembly scriptAssembly, StateSource stateSource) |
256 | { | 250 | { |
257 | m_Assembly = assembly; | 251 | //m_Assembly = scriptAssembly.CodeBase; |
252 | m_Assembly = scriptAssembly.Location; | ||
258 | m_stateSource = stateSource; | 253 | m_stateSource = stateSource; |
259 | |||
260 | ApiManager am = new ApiManager(); | ||
261 | |||
262 | foreach (string api in am.GetApis()) | ||
263 | { | ||
264 | m_Apis[api] = am.CreateApi(api); | ||
265 | m_Apis[api].Initialize(Engine, Part, ScriptTask, m_coopSleepHandle); | ||
266 | } | ||
267 | 254 | ||
268 | try | 255 | try |
269 | { | 256 | { |
270 | object[] constructorParams; | 257 | object[] constructorParams; |
271 | |||
272 | Assembly scriptAssembly = dom.Load(Path.GetFileNameWithoutExtension(assembly)); | ||
273 | Type scriptType = scriptAssembly.GetType("SecondLife.XEngineScript"); | 258 | Type scriptType = scriptAssembly.GetType("SecondLife.XEngineScript"); |
274 | 259 | ||
275 | if (scriptType != null) | 260 | if (scriptType != null) |
276 | { | 261 | { |
262 | m_coopTermination = true; | ||
263 | m_coopSleepHandle = new XEngineEventWaitHandle(false, EventResetMode.AutoReset); | ||
277 | constructorParams = new object[] { m_coopSleepHandle }; | 264 | constructorParams = new object[] { m_coopSleepHandle }; |
278 | } | 265 | } |
279 | else if (!m_coopTermination) | 266 | else |
280 | { | 267 | { |
268 | m_coopTermination = false; | ||
281 | scriptType = scriptAssembly.GetType("SecondLife.Script"); | 269 | scriptType = scriptAssembly.GetType("SecondLife.Script"); |
282 | constructorParams = null; | 270 | constructorParams = null; |
283 | } | 271 | } |
284 | else | ||
285 | { | ||
286 | m_log.ErrorFormat( | ||
287 | "[SCRIPT INSTANCE]: Not starting script {0} (id {1}) in part {2} (id {3}) in object {4} in {5}. You must remove all existing {6}* script DLL files before using enabling co-op termination" | ||
288 | + ", either by setting DeleteScriptsOnStartup = true in [XEngine] for one run" | ||
289 | + " or by deleting these files manually.", | ||
290 | ScriptTask.Name, ScriptTask.ItemID, Part.Name, Part.UUID, Part.ParentGroup.Name, Engine.World.Name, assembly); | ||
291 | |||
292 | return false; | ||
293 | } | ||
294 | 272 | ||
295 | // m_log.DebugFormat( | 273 | // m_log.DebugFormat( |
296 | // "[SCRIPT INSTANCE]: Looking to load {0} from assembly {1} in {2}", | 274 | // "[SCRIPT INSTANCE]: Looking to load {0} from assembly {1} in {2}", |
297 | // scriptType.FullName, Path.GetFileNameWithoutExtension(assembly), Engine.World.Name); | 275 | // scriptType.FullName, m_Assembly, Engine.World.Name); |
298 | 276 | ||
299 | if (dom != System.AppDomain.CurrentDomain) | 277 | if (dom != System.AppDomain.CurrentDomain) |
300 | m_Script | 278 | m_Script |
301 | = (IScript)dom.CreateInstanceAndUnwrap( | 279 | = (IScript)dom.CreateInstanceAndUnwrap( |
302 | Path.GetFileNameWithoutExtension(assembly), | 280 | Path.GetFileNameWithoutExtension(m_Assembly), |
303 | scriptType.FullName, | 281 | scriptType.FullName, |
304 | false, | 282 | false, |
305 | BindingFlags.Default, | 283 | BindingFlags.Default, |
@@ -327,11 +305,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
327 | { | 305 | { |
328 | m_log.ErrorFormat( | 306 | m_log.ErrorFormat( |
329 | "[SCRIPT INSTANCE]: Not starting script {0} (id {1}) in part {2} (id {3}) in object {4} in {5}. Error loading assembly {6}. Exception {7}{8}", | 307 | "[SCRIPT INSTANCE]: Not starting script {0} (id {1}) in part {2} (id {3}) in object {4} in {5}. Error loading assembly {6}. Exception {7}{8}", |
330 | ScriptTask.Name, ScriptTask.ItemID, Part.Name, Part.UUID, Part.ParentGroup.Name, Engine.World.Name, assembly, e.Message, e.StackTrace); | 308 | ScriptTask.Name, ScriptTask.ItemID, Part.Name, Part.UUID, Part.ParentGroup.Name, Engine.World.Name, m_Assembly, e.Message, e.StackTrace); |
331 | 309 | ||
332 | return false; | 310 | return false; |
333 | } | 311 | } |
334 | 312 | ||
313 | ApiManager am = new ApiManager(); | ||
314 | |||
315 | foreach (string api in am.GetApis()) | ||
316 | { | ||
317 | m_Apis[api] = am.CreateApi(api); | ||
318 | m_Apis[api].Initialize(Engine, Part, ScriptTask, m_coopSleepHandle); | ||
319 | } | ||
320 | |||
335 | try | 321 | try |
336 | { | 322 | { |
337 | foreach (KeyValuePair<string,IScriptApi> kv in m_Apis) | 323 | foreach (KeyValuePair<string,IScriptApi> kv in m_Apis) |
@@ -341,8 +327,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
341 | 327 | ||
342 | // // m_log.Debug("[Script] Script instance created"); | 328 | // // m_log.Debug("[Script] Script instance created"); |
343 | 329 | ||
344 | Part.SetScriptEvents(ItemID, | 330 | Part.SetScriptEvents(ItemID, (int)m_Script.GetStateEventFlags(State)); |
345 | (int)m_Script.GetStateEventFlags(State)); | ||
346 | } | 331 | } |
347 | catch (Exception e) | 332 | catch (Exception e) |
348 | { | 333 | { |
@@ -355,8 +340,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
355 | 340 | ||
356 | m_SaveState = true; | 341 | m_SaveState = true; |
357 | 342 | ||
358 | string savedState = Path.Combine(Path.GetDirectoryName(assembly), | 343 | string savedState = Path.Combine(Path.GetDirectoryName(m_Assembly), ItemID.ToString() + ".state"); |
359 | ItemID.ToString() + ".state"); | 344 | |
360 | if (File.Exists(savedState)) | 345 | if (File.Exists(savedState)) |
361 | { | 346 | { |
362 | string xml = String.Empty; | 347 | string xml = String.Empty; |